3

我试图了解内部和内存分页collaboration之间的关系。我有一个已分配的盒子。如果我运行一个需要大量内存的应用程序,我想知道何时发生内存分页以及何时发生内存不足错误。当一个对象被创建时,它是在堆上创建的,如果它没有被使用,它将被垃圾收集,如果它被应用程序使用,它将被回收。GCJVMlinux4GB RAM1.2GB for JVMthrows

所以我的问题是操作系统何时开始进行内存分页JVM以及分页的活动对象会发生什么OS

此外,如果操作系统页面存在 java 对象,它如何优先考虑应该首先分页的对象?它会分页占用大部分内存的对象吗?

4

2 回答 2

2

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

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

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

希望有帮助!

于 2013-04-15T17:35:40.293 回答
1

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

如果您的意思是碎片整理,那么是的,JVM 会为您完成。提供了更多关于垃圾收集器如何处理它的信息,垃圾收集器将长期存在的对象转移到不同的代,从而在旅途中进行碎片整理。这显然会影响哪些对象被调出/不被调出。但这是你所拥有的最大间接控制(通过延长或缩短对象的寿命)

根据内存堆,纯粹是在没有更多空间的情况下。

于 2013-04-15T13:56:41.107 回答