当出现与堆空间不足相关的异常时,我增加了Java Xmx内存限制。然而,我目前遇到了非常长的执行时间,可能与内存有关,但我尚未看到抛出异常(尚未)。
我想知道什么原因导致了长时间的执行时间。JVM是否将堆交换到磁盘上?
我正在使用HotSpot 1.6.0更新34版。
当出现与堆空间不足相关的异常时,我增加了Java Xmx内存限制。然而,我目前遇到了非常长的执行时间,可能与内存有关,但我尚未看到抛出异常(尚未)。
我想知道什么原因导致了长时间的执行时间。JVM是否将堆交换到磁盘上?
我正在使用HotSpot 1.6.0更新34版。
JVM不会进行交换到磁盘的操作,操作系统可能会这样做。您可以通过检查进程的操作系统统计信息来检测此情况。
随着JVM内存耗尽,垃圾收集越来越频繁。每次垃圾收集运行都会释放更少的内存,进一步增加了GC的速率。最终,在GC中花费了大量时间,这可能是您看到的减速。
JVM并不会等到0字节被释放后才抛出OutOfMemoryError
。如果GC所需时间与释放的字节数相比过长,它实际上会放弃。
堆大小增大的一个可能后果是GC时间的增加 - JVM需要分析更大的空间,所以需要更长的时间 - 特别是如果是停顿式GC。
你能详细说明一下你的问题吗?
你使用的堆大小是多少?你看到的持续时间是多少?你的应用程序中对象的使用模式是什么?例如,有一些长期存在的对象还是有很多短期存在的对象。