jvm——metaspace代替永久代

https://mp.weixin.qq.com/s?__biz=MzIzNjI1ODc2OA==&mid=2650886860&idx=1&sn=f8bc6ab03d7a07022c86bf726209b17c&chksm=f32f6673c458ef657358068a8aea4664d3cbc8a488e6bfd6445c0743140f6fc8bcf9649298b7&scene=21#wechat_redirect

http://www.cnblogs.com/duanxz/p/3520829.html

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空间的默认值吧,怎么比元空间的还大?)

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

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

原文地址:https://www.cnblogs.com/gaoquanquan/p/10840848.html