我正在尝试理解collaboration
内GC
与内存分页之间的JVM
。我有linux
框,其中4GB RAM
已分配1.2GB for JVM
。如果我运行一个需要大量内存的应用程序,我想知道内存分页何时发生以及它实际上是throws
内存不足错误。创建对象时,它在堆上创建,如果未使用则将被垃圾收集,如果应用程序使用它则将为活动。
所以我的问题是操作系统何时启动JVM
的内存分页以及OS
分页的实时对象会发生什么?
如果操作系统页面是实时java对象,那么它如何优先考虑首先应该对哪个对象进行分页?它会占用占用大部分内存的对象吗?
答案 0 :(得分:2)
简短的回答是:JVM绝对无法知道操作系统交换堆,或防止交换堆。
更准确地说,您可以打开JVM标志以防止交换(-XX:+UseLargePages
),但如果操作系统用完了大页面,它将恢复为常规交换。此外,任何GC循环都会强制将每个页面提取到RAM中,以便可以对其进行检查。所以基本上,交换+完整GC =你会遇到一个世界停止的地狱。
G1的行为略有不同,因为它会首先收集充满死对象的内存区域,但由于页面错误,它仍然需要更多时间。
希望有所帮助!
答案 1 :(得分:1)
首先,内存分页由底层操作系统处理,而不是由JVM处理。
如果你的意思是去碎片化,那么是JVM为你做的。 This提供了有关垃圾收集器如何处理它的更多信息,垃圾收集器将长寿命对象传输到不同代,从而在移动中解除碎片。这显然会影响哪些对象被分页/不分页。但这是你拥有的最大间接控制(通过延长或缩短物体的寿命)
根据内存堆,它纯粹是在没有剩余空间的情况下。