什么是Metaspace的压缩类空间?

在64位平台上,hotspot使用称为压缩对象指针(“CompressedOops”)和压缩类指针的优化技术。两者都是同一事物的变体。

压缩指针是一种引用数据(Java堆中的对象或元空间中的类元数据)的方法,即使在64位平台上也使用32位引用。

这有许多优点,例如指针大小更小,从而减少内存占用和更好地利用缓存,并且在某些平台上可以使用更多的寄存器。

Note: A good explanation of Compressed Object Pointers can be found here: JVM Anatomy Quark #23: Compressed References.

Also, a similar motivation drives the Linux x32 abi.

因为最终一个人需要一个64位的地址来访问那个东西,那个32位的“指针”实际上是一个偏移量——可能是位移位——进入一个具有已知公共基的区域。

关于Metaspace,我们不关心压缩的oop,但必须处理压缩类指针:

每个Java对象的头中都有一个对Metaspace中Java堆之外的本机结构的引用:Class结构。

什么是metaspace的压缩类空间?

使用压缩类指针时,该引用是32位值。为了找到该结构的真正64位地址,我们向其添加一个已知的公共基,并可能将值左移三位:

什么是metaspace的压缩类空间?

该技术对如何分配这些Klass结构设置了技术限制:

Klass结构的每个可能的位置必须在4G(非移位模式)| 32G(移位模式)的范围内,以从公共基址1的32位偏移量可到达。

这两个限制意味着我们需要将元空间分配为一个连续的区域。

当通过malloc(3)mmap(3)这样的系统API从系统分配内存时,地址由系统选择,并且可以是适合类型范围的任何值。因此,在64位平台上,当然不能保证后续分配会在范围限制内产生地址。E、 g.一个mmap(3)调用可以映射到0x0000000700000000,一个映射到0x0000000f0000000。

因此,我们必须使用一个mmap()调用来建立Klass对象的区域。因此,我们需要预先知道这个区域的大小,它不能大于32G,也永远不能可靠地扩展,因为超出其末端的地址范围可能已经被占用。

这些限制是严厉的。它们也只是真正需要用于Klass结构,而不是用于其他类元数据:目前只有Klass实例被压缩引用处理。因此,可以将其他64位指针放在任何位置。

因此决定将元空间分成两部分:“非类部分”和“类部分”:

  • 等级部分,包括Class结构,必须分配为一个不大于32G的连续区域。
  • 包含其他所有内容的非类部分则没有。

Terminology: The class part is called “Compressed Class Space” even though that is a bit of a misnomer since the Klass structures themselves are not compressed but the pointers to them.

压缩类空间的大小由-XX:CompressedClassSpaceSize决定。因为我们需要预先知道类空间的大小,所以该参数不能为空。如果省略,则默认为1GB。

更令人困惑的是,hotspot人为地将classspacesize压缩到3G的最大值——我真的不知道为什么。因此,除了32G的技术限制之外,我们还人为地设置了3G的限制。

另外请注意,我们一直在谈论虚拟尺寸,而不是漫画尺寸。这种记忆只有在需要的时候才会提交。非常简化,虚拟大小在大多数现代操作系统上几乎不需要任何成本,它只是一个addres空间预留。

由于Klass结构的平均大小为1K,一个默认大小为1G的压缩类空间将能够容纳大约一百万个Klass结构(参见调整元空间大小)。这是我们可以加载的类数量的唯一实际限制。

还请注意,当我们不使用CompressedOops运行时,compressedClasspointer将被禁用。如果我们通过-XX:-CompressedOops手动关闭CompressedOops,或者Java堆大于或等于32G,就会发生这种情况。

往期参考:http://javakk.com/160.html

Implementation

为了重用现有的元空间实现,采用了一个技巧:

全局结构VirtualSpaceList和ChunkManager都是重复的,现在存在于两个变体中,“类空间”变量和“非类空间”变量。

但是由于类空间需要一个连续的地址范围,我们不能真正使用映射区域链;因此类空间列表退化了:它只包含一个节点,不能增长。与非类列表中的同类节点相比,这个节点是巨大的。这个节点就是压缩的类空间。

什么是metaspace的压缩类空间?
什么是metaspace的压缩类空间?

ClassLoaderMetaspace——每个类装入器结构都包含使用这个类装入器的块——现在需要两个链接的块列表,一个用于保存非类块,另一个用于类块。这也意味着我们将当前节点的“空闲”部分加倍,因为现在我们有两个节点。

开关:UseCompressedClassPointers、UseCompressedOops

  • -XX:+UseCompressedOops启用压缩对象指针。

  • -XX:+UseCompressedClassPointers启用压缩类指针。

默认情况下,两者都处于打开状态,但可以手动关闭。

如果压缩类指针被关闭,我们将没有压缩的类空间,并且-XX:CompressedClassSpaceSize开关将被忽略。

-XX:+UseCompressedClassPointers需要-XX:+useCompressedDoops,但反之亦然:可以在没有压缩类指针的情况下运行压缩oops。这可能有助于在一些病态的角落案例中减少元空间内存占用。一般来说,建议不要使用这些开关。

注意,压缩对象指针需要Java堆<32G。因此,如果Java堆>=32G,压缩oop将被关闭,这也将关闭压缩类指针。

文章来源:http://javakk.com/405.html
也欢迎大家关注我的公众号【Java老K】获取更多干货

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,490评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,581评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,830评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,957评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,974评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,754评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,464评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,847评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,995评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,137评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,819评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,482评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,023评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,149评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,409评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,086评论 2 355