• JDK 1.8 JVM的变化


    1、移除方法区

      JDK 1.7及之前方法区存放的数据有类信息(类名,修饰符,字段描述,方法描述等),常量静态变量即时编译后的class文件

      方法区中还包含有常量池:常量池中主要有字面量和符号引用

        字面量:文本字符串,声明为final的常量值;

        符号引用:包括了三种常量,分别是:类和接口的全限定名,字段的名称和描述符,方法的名称和修饰符。

     为什么移除方法区?

      1、它在启动时固定大小,很难进行调优,并且FullGC时会移动类元信息

      2、类及方法的信息等比较难确定大小,因此对永久代的大小指定比较困难

      3、在某些场景下,如果动态加载类过多,容易造成Perm区的OOM。

      4、字符串存在方法区中,容易出现性能问题和内存溢出

      5、永久代(在GC时用永久代实现方法区)GC垃圾回收效率偏低(回收目标主要是常量池和类型的卸载)

      6、永久代的垃圾收集和老年代捆绑在一起的,因此无论谁满了,都会触发永久代和老年代的垃圾收集

    2、MetaSpace元空间 取而代之

      JDK 1.8将方法区中的字符串常量移至堆内存,其他内容如类信息、静态变量、其他常量(如整形常量),即时编译后的class文件等都移动到元空间内

      元空间(MetaSpace)不在堆内存上,而是直接占用的本地内存。因此元空间的大小仅受本地内存限制。也可通过参数来设定元空间的大小

      -XX:MetaSpaceSize  初始元空间大小,达到该值就会触发垃圾收集器进行类型卸载,同时GC会对该值进行调整:如果释放了大量的空间,就适当降低

    该值;如果释放了很少的空间,那么在不超过MaxMetaSpaceSize时,适当提高该值。

      -XX:MaxMetaSpaceSize  最大元空间大小,默认没有限制

      元空间的特点:

        1、每个加载器有专门的存储空间。
        2、不会单独回收某个类。
        3、元空间里的对象的位置是固定的。
        4、如果发现某个加载器不再存活了,会把相关的空间整个回收。

  • 相关阅读:
    THINKPHP_(4)_TP模型中with、withJoin和多层关联的深入分析
    THINKPHP_(3)_TP6中实现多层关联,第一个表关联第二个表查询出的数据,再关联第三个表
    THINKPHP_(2)_TP模型的多表关联查询和多表字段的关键字搜索。
    THINKPHP_(1)_修改TP源码,支持对中文字符串按拼音进行排序。
    automapper 源中有多个属性类映射到同一个 目标中
    关于简单的 FluentValidation 验证
    关于SkyApm测试部署。
    linq2db.EntityFrameworkCore 介绍
    关于在CentOS上,绘图丢失部分中文字的问题
    NHibernate入门
  • 原文地址:https://www.cnblogs.com/yangyongjie/p/10646255.html
Copyright © 2020-2023  润新知