分页对垃圾收集有什么影响?
答案 0 :(得分:4)
分页对垃圾收集的影响几乎与任何事情相同;它允许访问大量内存,但在发生时会损害性能。
更迫切的问题是垃圾收集对分页的影响是什么?
垃圾收集可能导致读取和写入的内存区域在给定的时间点不会被考虑。因此,降低垃圾收集导致分页发生的程度是有利的。这是一代压缩收集器提供的优势之一,因为它导致在一个页面中收集更多短暂的对象,从该页面收集,并且内存可用于其他对象,同时还将长寿命对象保存在一个页面中。相关对象更可能的页面(长寿命对象通常与其他长寿命对象相关,因为一个长寿命对象使其他对象保持活动状态)。这不仅减少了执行收集所需的分页量,还可以帮助减少应用程序其余部分所需的分页量。
答案 1 :(得分:3)
首先是一些术语。在某些地区,例如与Linux相关的会话 paging 是操作系统的一项功能,其中可执行代码不需要永久存储在RAM中。可执行代码来自可执行文件,当CPU遍历程序中的指令时,内核根据需要从磁盘加载它。当内存紧张时,内核可能决定简单地“忘记”一页代码,因为它知道它总是可以从可执行文件重新加载它,如果该代码需要再次执行。
内核还实现了另一个名为交换的功能,它与类似的内容类似,但对于数据而言。从可执行文件中获取的数据不。因此,内核不能简单地忘记一页数据;它必须将它保存在某个地方,称为“交换文件”或“交换分区”的专用区域。这使得交换比分页更昂贵:内核必须在重用相应的RAM之前写出数据页,而代码页可以直接重用。实际上,在考虑交换之前,内核页面已经非常多了。
因此,分页与垃圾回收正交。但是,交换不是。一般的经验法则是交换和GC混合不好。大多数GC通过定期检查数据来工作,如果所述数据已经发送到交换分区,则必须从该分区重新加载,这意味着必须将一些其他数据发送到所述分区,因为如果数据在交换而不在RAM中然后这意味着内存紧张。在存在交换的情况下,GC往往意味着大量的磁盘活动。
一些GC采用复杂的策略来减少与交换相关的策略。这包括分代GC(试图更少地探索旧数据)和严格键入(GC查看数据,因为它需要找到指针;如果它知道大块RAM只包含非指针,例如它是一些只有像素值的图像数据,然后它可以不管它,特别是不强制它从交换区域返回)。众所周知,Java虚拟机中的GC(Sun / Oracle中的GC)非常擅长。但这只是相对的:如果您的Java应用程序遇到交换,那么您将遭受可怕的损失。但它可能更糟糕。
只需购买一些额外的内存。