垃圾收集+内存分页

时间:2013-04-15 13:45:07

标签: garbage-collection operating-system jvm

我正在尝试理解collaborationGC与内存分页之间的JVM。我有linux框,其中4GB RAM已分配1.2GB for JVM。如果我运行一个需要大量内存的应用程序,我想知道内存分页何时发生以及它实际上是throws内存不足错误。创建对象时,它在堆上创建,如果未使用则将被垃圾收集,如果应用程序使用它则将为活动。

所以我的问题是操作系统何时启动JVM的内存分页以及OS分页的实时对象会发生什么?

如果操作系统页面是实时java对象,那么它如何优先考虑首先应该对哪个对象进行分页?它会占用占用大部分内存的对象吗?

2 个答案:

答案 0 :(得分:2)

简短的回答是:JVM绝对无法知道操作系统交换堆,或防止交换堆。

更准确地说,您可以打开JVM标志以防止交换(-XX:+UseLargePages),但如果操作系统用完了大页面,它将恢复为常规交换。此外,任何GC循环都会强制将每个页面提取到RAM中,以便可以对其进行检查。所以基本上,交换+完整GC =你会遇到一个世界停止的地狱。

G1的行为略有不同,因为它会首先收集充满死对象的内存区域,但由于页面错误,它仍然需要更多时间。

希望有所帮助!

答案 1 :(得分:1)

首先,内存分页由底层操作系统处理,而不是由JVM处理。

如果你的意思是去碎片化,那么是JVM为你做的。 This提供了有关垃圾收集器如何处理它的更多信息,垃圾收集器将长寿命对象传输到不同代,从而在移动中解除碎片。这显然会影响哪些对象被分页/不分页。但这是你拥有的最大间接控制(通过延长或缩短物体的寿命)

根据内存堆,它纯粹是在没有剩余空间的情况下。