7

当抛出与堆空间不足相关的异常时,我增加了 java Xmx 内存限制。但是,我目前正在经历一个很长的执行时间,这可能与内存有关,但我还没有看到抛出的异常(还)。

我想知道什么可能导致执行时间长。JVM 是否将堆交换到磁盘?

我正在使用 HotSpot 1.6.0 更新 34。

4

2 回答 2

14

JVM 不会交换到磁盘,不。操作系统可能会这样做。您可以通过检查进程中的操作系统统计信息来检测这一点。

随着 JVM 内存耗尽,垃圾收集被触发的频率越来越高。每次运行都会释放更少的内存,从而进一步提高 GC 的速率。最终很多时间都花在了 GC 上,这很可能是你看到的减速。

JVM 不会等到 0 字节被释放才抛出OutOfMemoryError。当 GC 花费的时间与释放的字节数相比太长时,它实际上会放弃。

于 2013-02-05T11:25:07.447 回答
2

更大堆的一个可能后果是 GC 时间增加 - JVM 必须分析更大的空间,因此需要更长的时间 - 特别是如果它是一个 stop-the-world GC。

你能把你的问题具体一点吗?

你正在使用什么堆大小?你看到的持续时间是多少?您的应用程序中对象的使用模式是什么?例如,一些长寿命的对象,或许多短寿命的对象。

于 2013-02-05T11:24:47.540 回答