• 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中么?

  • 相关阅读:
    javascript实现动态侧边栏
    javascript实现图片滚动
    C语言-----野指针
    守护进程daemon.c
    UDP网络程序设计
    TCP网络程序设计
    网络编程模型
    fork和vfork
    网络协议分析
    多线程同步
  • 原文地址:https://www.cnblogs.com/eryun/p/12006338.html
Copyright © 2020-2023  润新知