当抛出与堆空间不足相关的异常时,我增加了java Xmx内存限制。但是,我目前正在经历一段很长的执行时间,可能与内存有关,但我还没有看到抛出异常(尚未)。
我想知道可能导致执行时间过长的原因。 JVM是否将堆交换到磁盘?
我正在使用HotSpot 1.6.0更新34.
答案 0 :(得分:11)
JVM没有交换到磁盘,没有。操作系统可以这样做。您可以通过检查流程的操作系统统计信息来检测这一点。
由于JVM内存不足,垃圾收集会越来越频繁地被触发。每次运行都会释放更少的内存,从而进一步提高GC的速度。最终花了很多时间在GC上,这可能是你看到的慢下来。
JVM不会等到释放0个字节才能抛出OutOfMemoryError
。 GC实际上放弃的时间与释放的字节数相比只需要太长时间。
答案 1 :(得分:2)
更大堆的一个可能结果是GC时间增加 - JVM必须分析更大的空间,因此需要更长的时间 - 特别是如果它是一个世界上的GC。
你可以稍微充实一下你的问题吗?
您使用的是什么堆大小?你看到了多长时间?什么是应用程序中对象的使用模式?例如,一些长寿命的物体,或许多短寿命的物体。