g1gc - 为什么 G1GC 中的 XX:G1HeapRegionSize 必须是 2 的幂?
问题描述
Oracle 文档https://docs.oracle.com/javase/9 /gctuning/garbage-first-garbage-collector.htm#JSGCT-GUID-98E80C82-24D8-41D4-BC39-B2583F04F1FF 说 XX:G1HeapRegionSize必须是2 但在 1m 到 32m 之间设置任何值没有限制。
问题 :
1.谁能解释为什么 XX:G1HeapRegionSize必须是 2 的幂?
2.对于处理大量巨大对象的应用程序,经过大量测试和分析GC原因,GC吞吐量,GC暂停时间等,设置XX:G1HeapRegionSize = 10m似乎是合适的。为 -Xmx12g 设置 10m 堆区域有什么问题吗?
解决方案
谁能解释为什么 XX:G1HeapRegionSize 必须是 2 的幂?
仅仅因为这就是 Oracle 实现 G1 收集器的方式。
在实现诸如垃圾收集器之类的东西时,您需要做出设计选择以使其正常工作。G1 设计师做出这些特殊选择的原因可能有很多。总体主题将是优化关键 G1 代码路径(例如写屏障)的性能和/或避免整个 G1 代码库中不必要的复杂性。
(例如,如果一个区域的大小是 2 的幂,并且每个区域都从一个可以被区域大小整除的地址开始,那么您可以使用掩码来有效地计算一个地址属于哪个区域。如果您可以在写屏障代码中保存一些指令,这可能意味着整个 JVM 的几个百分点的性能。我不会更详细地介绍......但你可以查阅文献。)
但原因尚无定论。您要么接受 G1 限制,要么选择更适合您的用例的不同垃圾收集器。
为 -Xmx12g 设置 10m 堆区域有什么问题吗?
嗯......它不会工作......因为你已经找到了限制。
推荐阅读
- ruby - 使用 DynamoDB.Client.Scan(),如何检索一个属性不为空的所有记录?
- postgresql - 如何从 JSON-b 字段中获取项目
- javascript - HTML中是否有从另一个文件导入HTML代码的功能?
- docker - Docker 中的命名卷
- java - 为什么字段没有在第二种方法中更新?
- python - Python 3 中非常大的整数的 MemoryError vs OverflowError
- angular - Angular 9 自定义环境选项
- javascript - 在应用程序和 iframe 中的小部件之间共享身份验证状态(即通用登录)
- logging - 以编程方式从原始分析日志中提取用户流的最佳方法是什么?
- excel - 将 ADODB.Recordset 返回的单个值分配给变量的最快方法是什么?