当抛出与堆空间不足相关的异常时,我增加了 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 必须分析更大的空间,因此需要更长的时间 - 特别是如果它是一个 stop-the-world GC。
你能把你的问题具体一点吗?
你正在使用什么堆大小?你看到的持续时间是多少?您的应用程序中对象的使用模式是什么?例如,一些长寿命的对象,或许多短寿命的对象。