JAVA默认永久代大小_jvm——metaspace代替永久代

1.什么时候会触发fullGC?fullGC频繁可能的原因是什么?

当metaSpace超过MaxMataSpaceSize设置值时会触发FullGC,默认是无穷大;

存在类、类加载器导致的内存泄漏或大小不合适

2.metaSpace的组成?

Klass MetaSpace:

用来存klass的(class文件在jvm中运行时的数据结构);

一个紧接着Heap的连续的存储空间;

这块内存大小可通过-XX:CompressedClassSpaceSize参数来控制,这个参数默认是1G,但是这块内存也可以没有,假如没有开启压缩指针就不会有这块内存,这时候Klass信息存在NoKlass Metaspace中。

NoKlass MetaSpace:

专门来存klass相关的其他的内容,比如method,constantPool等;

这块内存是由多块内存组合起来的,所以可以认为是不连续的内存块组成的;

NoKlass Mestaspace是由一块块内存慢慢组合起来的,在没有达到限制条件的情况下,会不断加长这条链,让它可以持续工作。

3.java8中永久代被元数据区取代,有什么好处?

1)把永久代从jvm虚拟机中移除,metaSpace放置于内存中,既节省了JVM的内存空间,又避免了永久代大小设置不合理带来的困扰。

2)解决永久代的OOM问题。内存空间一般来说是足够大的,当meatSpace超级大的时候,就被操作系统杀死了。(如果Klass Metaspace用完了,那就会OOM了,不过一般情况下不会)

3)

4.元空间的问题?

元空间虚拟机采用了组块分配的形式,同时区块的大小由类加载器类型决定。类信息并不是固定大小,因此有可能分配的空闲区块和类需要的区块大小不同,这种情况下可能导致碎片存在。元空间虚拟机目前并不支持压缩操作,所以碎片化是目前最大的问题。

5.元空间的优化?

-XX:MaxMetaspaceSize:默认是无穷大;功能就是为metaSpace设置一个最大阈值,当metaSpace的内存超过这个值的时候会触发FullGC;

(我觉得这个内存说的是Klass和NoKlass的总和?为什么元空间的初始大小是21M?这里说的元空间是Klass+NoKlass么? 下面那个-->" -XX:CompressedClassSpaceSize:默认是1G;" 这里给的默认值应该是Klass空间的默认值吧,怎么比元空间的还大?)

20191208175319420293.png

-XX:CompressedClassSpaceSize:默认是1G;这个参数主要是设置Klass Metaspace的大小,不过这个参数设置了也不一定起作用,前提是能开启压缩指针,假如-Xmx超过了32G,压缩指针是开启不来的。

6.什么时候类加载器会被回收?类加载器在metaSpace中么?

20191208175319972072.png

20191208175320955508.png

原文:https://www.cnblogs.com/eryun/p/12006338.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值