什么是java。lang.OutOfMemoryError:Java堆空间意味着消息意味着应用程序只需要比正常运行可用的更多Java堆空间。
什么是java。lang.OutOfMemoryError:超出GC开销限制意味着由于某种原因,垃圾收集器占用了过多的时间(默认情况下占进程所有CPU时间的98%),每次运行时恢复的内存很少(默认情况下占堆的2%)。这在内部也意味着,当应用程序只需要比正常运行可用的更多Java堆空间时。
所以我的问题是上述两种情况中的哪一种会被触发?
以下是我对基于场景引发特定异常的理解:-
假设我已经分配了1GB的堆大小。当前使用的堆内存为970 MB。线程已启动(JVM预先不知道它将消耗多少内存)。现在GC可以采取以下步骤之一
1) JVM开始分配内存,然后在某个时间点耗尽1GB内存并抛出java。lang.OutOfMemoryError:Java堆空间
2) GC提前运行并尝试释放一些内存,因为它知道当前正在使用的内存接近1 GB分配的堆。但是,它不能在每次后续运行中释放超过2%的空间。然后它将抛出java。lang.OutOfMemoryError:超出GC开销限制
根据我的问题,我的理解是否正确?
java.lang.OutOfMemoryError: Java heap space
原因:无法在Java堆中分配对象。此错误不一定意味着内存泄漏。问题可以像配置问题一样简单,其中指定的堆大小(或默认大小,如果未指定)不足以满足应用程序的需要。
java.lang.OutOfMemoryError: GC Overhead limit exceeded
正如你所引用的,垃圾收集花费的时间太长了。这可能是应用程序内存泄漏的副作用。由于泄漏,旧gen可能已完全满,因此GC在垃圾收集周期中不会释放任何(或更少)垃圾。
请看这篇oracle文章,以解决不同类型的内存泄漏问题。
关于你的两个查询,我也认为你的理解是正确的,只是有所不同。第二种情况下触发GC的事件不仅仅是创建新对象。完整的GC将在特定条件下触发。看看这个SE问题。
Java堆空间
JVM无法满足分配请求,即使在执行了所有可用的最后努力之后也是如此。
超出了OutOfMemoryError GC开销限制
这意味着JVM可能能够满足分配请求,但在最近的过去,它必须经常进行GC,以至于花费在GCing上的CPU时间量超过了java进程使用的总CPU时间的(可配置的)一小部分。
JVM自行终止,而不是停留在半工作、高度低效的状态,随着时间的推移,这种状态可能只会变得更糟。
通常,禁用GC开销OOM只会在几分钟后导致Java堆空间OOM。
这基本上是一种快速失效的机制。
我正在做一个Java项目。我从服务器检索pdf并将其转换为图像以将像素与预期文件进行比较。当我只使用20-30个文件运行该程序时,它很好,但当我尝试使用超过30个文件时,它会抛出OutOfMemoryError。 看起来像pdf- 下面是Java堆空间日志的一部分: 以下是GC开销限制超出的日志部分: 此外,第一个Java堆空间错误发生在id22,第二个发生在id33。我在服务器上使用8GB RA
当我在android中使用任何布局xml时,我都在与Java堆空间错误作斗争 我在SO上搜索,但错误仍然存在。我的错误日志 org.eclipse.platform - launcherXXMaxPermSize 1024m-launcher . default action openFile-launcher . appendvmargs-VM args-dosgi . requiredjava
我使用Jmeter将工作负载注入部署在AWS EC2实例上的应用程序。测试必须非常庞大:它持续10个小时,工作负载配置文件具有双峰形状,在5分钟内大约有2600个请求。实际上我有一个m3。部署应用程序的xlarge实例,8 m3。xlarge实例每个实例运行一个jmeter实例。使用python脚本,要注入的工作负载在8个客户机实例之间进行分割,因此在示例中,如果原始工作负载要注入800个请求,那
在Android Studio1.5.1只是通过移动源代码从一个系统到另一个即使干净的构建是成功的,但当代码运行我得到这种错误 java.lang.OutOfMemoryError: GC开销限制超过错误:任务': app: dexDebug'执行失败。 我在应用程序中添加了以下代码。格拉德尔还:
我正在尝试预处理一个大的txt文件(10G),并将其存储在二进制文件中以备将来使用。当代码运行时,速度会减慢,并以 异常线程"main"java.lang.OutOfMemoryError: GC开销限制超过 输入文件具有以下结构 这是我正在使用的代码: 基本上,它通过in文件并将数据存储到对象HMbicnt(这是一个哈希映射)。一旦在第二列中遇到新值,它应该将对象写入输出文件,释放内存并继续。
我的Hippo应用程序失败主要是在与我的数据库进行连接时,GC开销超过了限制,有时低于错误。 javax。jcr。RepositoryException:未经检查的异常:java。lang.OutOfMemoryError:Java堆空间 我试图尽可能地清理我的后端。我知道垃圾收集器占用的时间太长,每次运行时恢复的内存很少。所以我需要更新我的堆大小,也可以使用-XX:-usegcoveredlim