Java JVM交换堆吗?

Java JVM交换堆吗?,java,heap,Java,Heap,当抛出与堆空间不足相关的异常时,我增加了JavaXMX内存限制。然而,我目前正在经历一个很长的执行时间,这可能与内存有关,但我还没有看到抛出的异常 我想知道执行时间长的原因是什么。JVM是否将堆交换到磁盘 我正在使用热点1.6.0更新34 更大堆的一个可能结果是GC时间增加—JVM必须分析更大的空间,因此需要更长的时间—特别是如果它是停止世界GC 你能把你的问题具体点吗 您使用的堆大小是多少?你看到的持续时间是多少?应用程序中对象的使用模式是什么?例如,一些长期存在的对象,或者许多短期存在的对象

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

我想知道执行时间长的原因是什么。JVM是否将堆交换到磁盘


我正在使用热点1.6.0更新34

更大堆的一个可能结果是GC时间增加—JVM必须分析更大的空间,因此需要更长的时间—特别是如果它是停止世界GC

你能把你的问题具体点吗


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

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

随着JVM内存耗尽,垃圾收集被触发的频率越来越高。每次运行释放更少的内存,进一步提高GC的速率。最终,在GC中花费了大量时间,这可能是您看到的速度减慢


JVM不会等到释放了0个字节后才抛出
OutOfMemoryError
。当GC占用的时间太长而释放的字节数太多时,它实际上会放弃。

我想交换是一种操作系统行为。我将Xmx设置为2GB,并且正在使用3GB重试。单线程执行引发了2GB的堆空间异常。我已经用3GB运行了15分钟,但它没有抛出,但我无法确定3GB是否足够,因为总的执行时间将是数百小时。如果高水位可能达到15分钟,那么使用3GB作为网格(9节点)运行的限制似乎是值得的。我将有9个对象在9个节点上运行,希望持续时间为1/9。