【问题标题】:Understanding internal fragmentation properties of Hotspot JVM process了解 Hotspot JVM 进程的内部碎片属性
【发布时间】:2015-06-23 17:09:40
【问题描述】:

适用于堆内和堆外分配。堆上 - 在三个主要垃圾收集器的上下文中:CMS、Parallel Old 和 G1。

目前我知道(或认为我知道)的:

  • 所有对象(堆上)分配都四舍五入到 8 字节边界(或 2 的更大幂,由 -XX:ObjectAlignmentInBytes 配置。
  • G1
    • 对于小于区域大小(1 到 32 MB,可能在 堆大小 / 2048 左右)的堆上分配,没有内部碎片,因为没有必要,因为分配器永远不会“填补漏洞”。
    • 对于区域大小较大的分配,它会将分配向上舍入到区域大小。 IE。 区域大小 + 1 字节的分配很不吉利,几乎浪费了 50% 的内存。
  • 对于CMS,我找到的唯一相关信息是

    自然旧空间 PLAB 模仿索引空闲列表空间的结构。每个线程预先分配一定数量的每个大小小于 257 堆字的块(从全局空间分配的大块)。

    来自http://blog.ragozin.info/2011/11/java-gc-hotspots-cms-promotion-buffers.html。 据我了解,所谓的“全局空间”是主要的旧空间。

问题:

  • 以上说法正确吗?
  • CMS 中主要旧空间的碎片属性是什么?超过“257 个堆字”的分配怎么办?
  • 如何使用 Parallel Old GC 管理旧空间?
  • Hotspot JVM 是使用系统内存分配器进行堆外分配,还是使用特定分配器重新管理它?

UPD。讨论帖:https://groups.google.com/forum/#!topic/mechanical-sympathy/A-RImwuiFZE

【问题讨论】:

  • 为什么要这样做?请记住,这些东西从实施到实施,从更新到更新。如果您正在尝试优化,我认为最新的文章可能是您最好的选择。 2011 年已经过去了。
  • Google 是您的朋友(使用搜索工具 -> 一年内):March 2015 JVM GC Tunning Guide
  • @markspace 我在发帖前已经阅读了这篇文章。本指南未提及内部碎片。
  • 关于您的第四点,查看源代码,很容易发现,在当前热点上,他们正在使用普通的 malloc 进行分配。入口点是 sun.misc.Unsafe.allocateMemory
  • 老实说,我很困惑:这个问题没有一个简单的答案,但请考虑就像@markspace 所说的那样,在使用低级主题时,您应该仔细碎片化,世代安排等......这些的实现可以非常广泛地从一个版本到另一个(主要)或从一个更新到另一个版本,因此使您的实现有点在黑暗中拍摄......如果在另一端,您的问题是为了知识而知识,我也想听听专家对您的一些观点的意见!

标签: java memory-management jvm-hotspot memory-fragmentation heap-fragmentation


【解决方案1】:
  • 据我了解,上述陈述是正确的,尽管 CMS 上的位缺少很多上下文来解释它。
  • CMS 容易出现碎片(在运行 CMS 的旧空间中),这是其主要缺陷之一。如果它碎片太多,它可能偶尔不得不停止世界并做一个完整的标记和(滑动)压缩以去除碎片,这会导致应用程序的大停顿。正是这个缺陷经常被引用为开发 G1 的原因。一些系统(例如 HBase)故意使用固定大小的块进行大部分分配,以防止或显着减少 CMS 碎片化,以避免长时间停顿。
  • ParallelOldGC(或一般的“旧 GC”)不会分段。对象使用旧堆,当空间用完时,将运行完整标记和紧凑循环。它可以比任何其他分配器更快地执行此完整 GC,但每 2 GB 堆的典型运行时间为 1 秒,这对于大型堆或延迟敏感的应用程序来说可能太长了。
  • Hotspot 根据目的使用了各种堆外分配策略。分配本机字节缓冲区不同于它自己为编译代码或分析数据分配。我不能在这里就任何细节做出权威回答,但我只能假设其中大部分不使用系统分配器,否则 Hotspot 的性能不会像它那样好。此外,还有一些可以调整的参数来控制这个空间的一部分,例如-XX:ReservedCodeCacheSize,这表明这样的内存区域是通过间接而不是直接通过系统分配器管理的。简而言之,如果系统分配器直接用于热点中的任何细粒度分配,我会感到相当惊讶。

【讨论】:

  • 您主要解决外部碎片问题。我的问题是关于内部碎片化
猜你喜欢
  • 1970-01-01
  • 2021-01-07
  • 2012-01-18
  • 2017-01-29
  • 2015-12-21
  • 2021-05-13
  • 2013-08-01
  • 2010-11-15
相关资源
最近更新 更多