JVM是否会交换堆?

7

当出现与堆空间不足相关的异常时,我增加了Java Xmx内存限制。然而,我目前遇到了非常长的执行时间,可能与内存有关,但我尚未看到抛出异常(尚未)。

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

我正在使用HotSpot 1.6.0更新34版。


交换是我认为的操作系统行为。 - StarPinkER
2个回答

14

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

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

JVM并不会等到0字节被释放后才抛出OutOfMemoryError。如果GC所需时间与释放的字节数相比过长,它实际上会放弃。


2

堆大小增大的一个可能后果是GC时间的增加 - JVM需要分析更大的空间,所以需要更长的时间 - 特别是如果是停顿式GC。

你能详细说明一下你的问题吗?

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


我将Xmx设置为2GB,现在正在尝试使用3GB。单线程执行时,2GB会抛出堆空间异常。我已经使用3GB运行了15分钟,尚未抛出异常,但无法确定3GB是否足够,因为总执行时间可能达到数百小时。如果高水位标记可能在15分钟内被触及,那么使用3GB作为我的网格(9个节点)运行的限制似乎是值得的。我将在9个节点上运行9个对象,希望持续时间为1/9。 - H2ONaCl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接