分页对垃圾回收有什么影响?

5

分页对垃圾回收有哪些影响?


请阅读“无需分页的垃圾回收”http://people.cs.umass.edu/~emery/pubs/f034-hertz.pdf - Ian Ringrose
2个回答

4
分页对垃圾回收的影响与其他方面基本相同,它允许访问大量内存,但当发生分页时会影响性能。
更紧迫的问题是垃圾回收对分页的影响是什么?
垃圾回收可能导致在某个时间点上本不考虑读取和写入的内存区域被读取和写入。因此,减少垃圾回收引起分页的程度是有利的。这是一种分代压缩收集器提供的优势之一,因为它使更多短寿命对象位于一个页面中,从该页面收集,将内存释放给其他对象,同时将长寿命对象保留在一个页面中,其中相关对象也更可能是长寿命对象(长寿命对象通常与其他长寿命对象相关,因为一个长寿命对象使其他对象保持活动状态)。这不仅减少了执行收集所需的分页数量,还可以帮助减少应用程序其余部分所需的分页数量。

2
还有一件事情。垃圾收集器可能需要查看大量的内存,然后才能进行查看。这可能会对性能产生更严重的影响。 - Thorbjørn Ravn Andersen
@Thorbjørn 是的,我在“与任何事物一样”思考那个问题,但是GC需要扫描的内存量与大多数其他代码相比异常巨大,因此将其单独列出是非常值得的。 - Jon Hanna

3
首先,需要了解一些术语。在某些领域,如Linux相关的讨论中,“分页”是操作系统的一个功能,其中可执行代码不必永久驻留在RAM中。可执行代码来自可执行文件,内核会在CPU遍历程序指令时按需从磁盘加载它。当内存紧张时,内核可能决定简单地“忘记”一页代码,因为它知道如果那段代码需要再次执行,它可以随时从可执行文件重新加载它。
内核还实现了另一个称为“交换”的功能,类似于数据的分页。数据不是从可执行文件中获取的。因此,内核无法简单地忘记一页数据;它必须将其保存在专用区域中,称为“交换文件”或“交换分区”。这使得交换比分页更昂贵:内核必须在重用相应的RAM之前写出数据页,而代码页可以直接重用。在实践中,在考虑交换之前,内核进行了大量分页。
因此,“分页”与垃圾回收是正交的。然而,“交换”不是。经验法则是,交换和GC不搭配。大多数GC通过定期检查数据来工作,如果该数据已发送到交换分区,则必须从该分区重新加载它,这意味着必须将其他一些数据发送到该分区,因为如果数据在交换中而不在RAM中,则意味着内存紧张。在存在交换的情况下,GC往往意味着大量的磁盘活动。
一些GC采用复杂的策略来减少与交换相关的策略。这包括代际GC(尝试较少地探索旧数据)和严格类型(GC查看数据,因为它需要定位指针;如果它知道一个大块RAM仅包含非指针数据,例如只是像素值的某些图片数据,则可以将其保持原样,特别是不会从交换区域强制回收)。 Java虚拟机中的GC(来自Sun / Oracle的GC)被认为做得相当不错。但这只是相对的:如果您的Java应用程序遇到交换,那么您将遭受可怕的痛苦。但情况可能会更糟。
最好购买一些额外的RAM。

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