我有两个问题。他们中的一个将会讨论这个主题:)
1)我遇到了一个问题,即无法找到有关HotSpot中不同垃圾收集器如何工作的完整信息。但我不是在谈论垃圾收集器工作的一般描述(我们在互联网上有很多这方面的信息),我说的是具体的算法。我找到了这份白皮书(Java HotSpot虚拟机中的内存管理)http://www.oracle.com/technetwork/java/javase/tech/memorymanagement-whitepaper-1-150020.pdf。 但它只有一般的想法。它对并行压缩算法(我的意思是并行标记 - 扫描 - 压缩)有一个很好的描述(可能不太好 - 请参阅我的第二个问题),但它没有解释其他垃圾收集器的算法。但是,本白皮书是我能够在互联网上找到的最佳信息。我想知道的是在哪里获得有关不同垃圾收集器(对于年轻人我的意思是:ParNew,DefNew,PSYoungGen;对于旧版本:PSOLdGen,ParOldGen,Concurrent-Mark-Sweep)工作的完整描述/信息。无法相信用户无法获得此信息。
2)关于并行压缩收集器算法(ParOldGen或Parallel Mark-Sweep-Compact)的问题。白皮书(见第一个问题)描述了它的工作原理。让我粘贴白皮书的报价(请花一点时间看一下):
我无法理解的事项如下:
关于摘要阶段:
由于以前的收藏品的压缩,通常是一些 每一代左侧的部分都是密集的,含有 主要是活物。可以从中恢复的空间量 这样密集的区域不值得压缩它们。
嗯,是否意味着当我们有一个由98-99%的活物体和2-1%的死物体(换句话说是死物体的很小一部分)组成的区域时,比这个区域的压缩不值得从这样一个地区恢复的空间。然而,这个微小的自由空间(洞)最终会被填满,垃圾收集完成后就没有洞了。
所以摘要阶段的第一件事是检查密度 区域,从最左边的区域开始,直到达到一个点 哪个空间可以从一个地区和那个地区找到 它的权利是值得压缩这些地区的成本。
该点左侧的区域称为密集区域 前缀,并且没有对象在这些区域中移动。
“没有对象在这些区域中移动”,但这些区域可能会有一些小空间,我是对的吗?无法理解这一点
地区 在那一点的右边将被压缩,消除所有死角。
请说明如何压缩它们。每个地区都将分别进行压缩?我觉得不是。那么也许会有某种转变?
摘要阶段计算并存储第一个的新位置 每个压缩区域的实时数据字节。
理解它我需要理解我想的上一个问题。
关于压缩阶段:
在压缩阶段,垃圾收集线程使用
用于识别需要填写的区域的摘要数据,以及 线程可以独立地将数据复制到区域中。这产生了一个 堆在一端密集的堆,有一个大的空的
阻止在另一端。
我完全糊涂了。那么“概要阶段”没有发生压缩吗?上一阶段的目的只是为了找到所有空闲空间吗?
请帮我弄清楚。
答案 0 :(得分:3)
这只是算法的一般描述。这些描述可以是不同的细节。在这种情况下,它为您提供了大部分细节,但仍为实施者留下了一些选择。
关于你的问题:
So no compaction happened on the "summary phase"? Was the previous phase's purpose only to find all free spaces?
- 是的,这是正确的。摘要阶段收集索引数据并基本确定所需的所有内容,以便压缩阶段可以执行复制。他们没有告诉他们如何实现压缩,但默认方法是将每个活动对象放在前一个对象旁边。基本上,所有空的空间都被删除,并且在压缩步骤完成后,您有一个连续的内存块,包含所有活动对象。我看到你对第四部分的困惑,但请注意它是用将来时态写的:'将被压缩' - 所以不是在总结期间,而是在以后。Does it mean [...] compacting of this region in not worth the space that could be recovered from such a region?
是的,这是对的。你基本上会失去一些空间,但是为了执行速度而交换内存是很常见的。确切的密度阈值取决于实现,但我将使用到总内存比阈值大约在70-90%之间。如果您想了解所有脏的详细信息,请查看评论中建议的开源VM实现。
答案 1 :(得分:1)
如果你真的需要详细了解收藏家工作的锄头,你可以阅读代码。你没有找到很多详细页面的原因是,如果你开始担心你走错了路的细节,那么收藏家的目的就是照顾你的记忆管理。
最佳解决方案是使用内存分析器并降低分配率。没有任何调整或搞乱您的命令行选项(除非您有错误配置的GC)将与降低此分配率进行比较。
但是要回答你的问题。
parallel mark-sweep-compact
没有这样的。紧凑的并行收集器和没有的并行标记扫描。还有一个G1收集器,它不是同代的世代。即它收集年轻和旧的物品。
无法相信此信息不符合用户的条件。
按照设计,开发人员不需要了解这么多细节。过度调整应用程序也不是一个好主意,因为这会使应用程序或JVM中的更改变得非常脆弱。
我想知道的是从哪里获得有关不同垃圾收集器的完整描述/信息
而不是说,我想知道所有要知道的事情(单独有500多个选项),而不必阅读代码,你应该尝试解决一个特定问题,并提出一个具体问题。
每个地区都将分别进行压缩?我觉得不是。那么也许会有某种转变?
只有终身空间被压缩。年轻的地区被反复复制,永远不需要压缩。
所以“摘要阶段”没有发生压缩吗?上一阶段的目的只是为了找到所有空闲空间吗?
压缩阶段会尽最大努力复制到区域的一端,而不会完全对其进行碎片整理。这留下了一些对象(大多数是我想象的大对象)而另一端非常密集。