浅谈jvm

  1 、说起jvm,很多人感觉jvm离我们开发实际很远。但是,我们开发缺每时每刻都离不开jvm。 

     a: java源码 编译后成.class字节码文件,

     b:根据classpath找到这个字节码文件,

     c:然后 用类加载器classloader加载文件。

  经过上面三步后,JVM开始解释执行。

                 

  栈:程序运行单位,与当前线程有关内容(局部分量、程序运行状态、方法返回值);

  堆:Java引用传递实现依靠堆内存,同一堆空间可被不同栈内容内存指向;

  程序计数器:小空间,用于计数操作,解决对象晋升问题;

  本地方法栈:递归调用保存栈内容,局部变量表,操作数栈、当前类运行时常量的引用、返回地址。

  2、jvm堆拆分:关键在于堆优化,需清除Java对象访问模式,Java对象引用采用是hotspot的指针引用。

  一般我们会对堆进行拆分,年轻代+老年代+元空间。

   

   a、年轻代中含有 伊甸园区,存活区。

  伊甸园区一般有new对象创建出来的对象,存活区是进行GC后保存的对象,S0或S1存储,但是有一块空间永远是空的,对象向老年代晋升(程序计数器会计算GC次数)。

  如果伊甸园中创建的对象过多,伊甸园占满,会发生晋级操作-经过minorGc

     b、老年代存放又臭又硬的对象,经历无数次的GC后被保留下来的对象或者是对象很大,直接保存到老年代。这些对象清除困难。

  如果老年代出现空间不足,会发生majorGC(FullGc)。majorGC非常耗费整个系统性能。所以我们一般很少使用System.gc();

 

  3、jvm堆优化

    对堆结构添加伸缩区,当老年代或年轻代空间不足时,可对空间进行压缩或伸展。

  当堆内存空间很大的情况下,减少堆内存的收缩处理操作。就需要考虑到 GC 的执行效率问题。

    Runtime.getRuntime().maxMemory()   最大可用内存  默认大小为当前物理内存的“1 / 4”

    Runtime.getRuntime().totalMemory()   默认可用内存  默认大小为当前物理内存的“1 / 64”

   可使用 至关重要的两个参数-Xms和-Xmx:可以使用的单位(k、m、g)

       -Xms:设置初始化的内存分配大小;

      -Xmx:设置最大的可用内存空间。

    举例设值: -Xms16g -Xmx16g

  对于年轻代,有BTP和TLAB,BTP伊甸园最晚创建对象放栈顶,TLAB分块保存,多线程处理。  

        -Xmn:设置年轻代的空间大小,默认采用的时物理内存的“1 / 64”

        -Xss:设置每一个线程所占用的栈的线程大小

        -X:SurvivorRatio:设置伊甸园区与两个存活区之间的内存分配比,默认“8 : 1 : 1”  

  老年代:
    与年轻代比率:-XX:NewRatio 当对象很大的时候往往不在年轻代进行保存,而是直接晋级到老年代,利用“-XX:PretenureSizeThreshold”。

  元空间不在堆内存中,存在于物理内存中。 

  

  4、GC算法:多线程执行

    复制-清理算法,将对象清理,递升存活区到老年代

    标记-清除-压缩,扫描老年代中的存活对象 ,并且进行对象的标记; 遍历整个老年代的内存空间,回收所有标记对象; 为了保证可以方便的

  计算出老年代的大小,还需要进行压缩(碎片整理,把空间集中在一起)。但是这种算法会有一个严重性的问题:STW(产生中断,因为需要进行垃圾的标记)  

      |- 暂停当前的所有执行程序(挂起);
      |- 标记出垃圾,标记的时间越长,那么挂起的时间就越长,如果此时你的堆内存空间很大,那么时间一定会更长;

      |- 预清除处理;

      |- 重新标记过程:看看还有没有垃圾;

      |- 进行垃圾的处理;
      |- 程序恢复执行。

   以前使用的:-Xms48􏰌 -Xmx48􏰌 -XX:+PrintGCDetails  替换后使用:-Xms48􏰌 -Xmx48􏰌 -Xlog:gc*

  

  G1 收集:-Xms48m -Xmx48m -Xlog:gc* -XX:+UseG1GC

  总结以上所述

    JVM 核心优化

      · 添加伸缩区的使用;
      · 提升 GC 的效率,G1 是现在最好用的 GC 算法(单核变为多核,变成了多线程执行GC)。

      · 线程的栈的大小配置;
      · 线程池的配置 

  

posted @ 2019-02-03 16:28  nicknailo  阅读(176)  评论(0编辑  收藏  举报