Garbage collection + 内存分页

3
我试图理解JVM内的GC与内存分页之间的合作。我有一台Linux机器,有4GB RAM,为JVM分配了1.2GB。如果我运行一个需要大量内存的应用程序,我想知道什么时候会发生内存分页以及何时会实际触发“内存不足”错误。当创建对象时,它将在堆上创建,并且如果未被使用,则将被垃圾回收;如果被应用程序使用,则将继续存活。
所以我的问题是,何时开始为JVM进行内存分页,如果操作系统对已经分页的活动对象发生了什么?
此外,如果操作系统对Java程序中的活动对象进行分页,如何确定哪个对象应该首先进行分页?它是否对占用大部分内存的对象进行分页?
2个回答

2
简短回答是:JVM绝对没有办法知道操作系统交换堆内存的情况,也无法阻止操作系统进行交换。
更精确地说,您可以打开JVM标志以防止交换(-XX:+UseLargePages),但是如果操作系统用完了大页,它将恢复到常规交换。此外,任何GC周期都会强制将每个页面提取到RAM中,以便进行检查。因此,基本上,交换+Full GC = 您将遇到严重的停顿问题。
G1的行为稍有不同,因为它将首先收集填充有死对象的内存区域,但由于页面故障,它仍然需要更多时间。
希望这能帮到您!

谢谢。如果分页由操作系统处理,为什么会发生OutOfMemory错误? - user826323
一个OutOfMemoryError意味着堆(那1.2GB)不够大,无法存储您创建的所有对象,它与分页没有直接关联。 - Pierre Laporte

1
首先,内存分页由底层操作系统而非JVM处理。
如果您指的是碎片整理,则是JVM为您处理。 此处 更详细地介绍了垃圾收集器如何将长期存在的对象转移到不同的代中,并在运行时进行碎片整理。这显然会影响哪些对象被页面换出/不被页面换出。但这是您所拥有的最大间接控制(通过延长或缩短对象的生命周期)。
至于内存堆,它纯粹是当没有剩余空间时才会发生。

谢谢回复。我知道操作系统处理分页,GC通过将对象从YG移动到OG来处理内存管理。我的问题是,内存分页在操作系统的哪一侧发生,以及分页对象在操作系统和JVM之间如何处理? - user826323
对于操作系统来说,JVM进程就像没有特殊访问权限的任何其他进程。因此,当JVM想要访问当前位于虚拟内存中的对象时,根据需求,操作系统会将其从虚拟内存中转移回来并使其可用。同时,在这段时间内,操作系统可能会将某些对象内容转移到虚拟内存中。如果您想知道何时发生这种情况,那么当JVM请求操作系统获取位于某个地址的对象时,操作系统会获取内容并分页输出其他内容。 - Jatin

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