zoukankan      html  css  js  c++  java
  • jvm gc学习

    Java GC机制
    Stop-the-world意味着 JVM 因为要执行GC而停止了应用程序的执行。当Stop-the-world发生时,除了GC所需的线程以外,所有线程都处于等待状态,直到GC任务完成。GC优化很多时候就是指减少Stop-the-world发生的时间。
    
    新生代(minor GC)
    新生代是用来保存那些第一次被创建的对象,他可以被分为三个空间
    
     一个伊甸园空间(Eden )
     两个幸存者空间(Survivor )

    在jdk 1.8中持久代被移除,换成元数据,加载的jar包及你自己项目的class存放的位置在内存里,不在虚拟机中
    元数据区的大小限定于本地内存的大小,Eden、Survivor、Old区都是JVM管理下的堆中分配的内存区域

    
    每个空间的执行顺序如下:
    1、刚创建的对象会存放在伊甸园空间
    2、在伊甸园空间执行了第一次GC之后,存活的对象被移动到其中一个幸存者空间。(对象到老年代的缓冲)
    3、此后,在伊甸园空间执行GC之后,存活的对象会被堆积在同一个幸存者空间。
    4、当一个幸存者空间饱和,还在存活的对象会被移动到另一个幸存者空间。之后会清空已经饱和的那个幸存者空间。
    5、在以上的步骤中重复几次依然存活的对象,就会被移动到老年代。
    
    其中一个幸存者空间必须保持是空的。如果两个幸存者空间都有数据,或者两个空间都是空的,那一定标志着你的系统出现了某种错误。
    通过频繁的minor GC将数据移动到老年代
    
    老年代(full GC或major GC)
    老年代空间的GC事件基本上是在空间已满时发生,执行的过程根据GC类型不同而不同
    
    如何监控GC
    GC操作是由JVM来完成,而GC监控工具只是将JVM提供的GC信息展现给你,因此,不论你使用何种方式监控GC都将得到相同的结果
    GC监控方法根据访问的接口不同,可以分成CUI 和GUI 两大类。
    CUI GC监控方法使用一个独立的叫做”jstat”的CUI应用,或者在启动JVM的时候选择JVM参数”verbosegc”。
    GUI GC监控由一个单独的图形化应用来完成,其中三个最常用的应用是”jconsole”, “jvisualvm” 和 “Visual GC”。
    
    [root@0b9af362d22d /]# /usr/java/jdk1.8.0_77/bin/jstat -gc 1 1s
     S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
    6656.0 6656.0 256.0   0.0   156672.0 154955.5  73728.0    36922.9   31488.0 30719.6 3328.0 3103.5     60    0.527   3      0.330    0.857
    6656.0 6656.0 256.0   0.0   156672.0 154955.5  73728.0    36922.9   31488.0 30719.6 3328.0 3103.5     60    0.527   3      0.330    0.857
    6656.0 6656.0 256.0   0.0   156672.0 154955.5  73728.0    36922.9   31488.0 30719.6 3328.0 3103.5     60    0.527   3      0.330    0.857
    6656.0 6656.0 256.0   0.0   156672.0 154959.6  73728.0    36922.9   31488.0 30719.6 3328.0 3103.5     60    0.527   3      0.330    0.857
    6656.0 6656.0 256.0   0.0   156672.0 154959.6  73728.0    36922.9   31488.0 30719.6 3328.0 3103.5     60    0.527   3      0.330    0.857
    6656.0 6656.0 256.0   0.0   156672.0 154959.6  73728.0    36922.9   31488.0 30719.6 3328.0 3103.5     60    0.527   3      0.330    0.857
    
    在tomcat中catalina.sh配置远程jvm参数
    -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=192.168.3.254

     1. -Dcom.sun.management.jmxremote.port :这个是配置远程 connection 的端口号的,要确定这个端口没有被占用

     2. -Dcom.sun.management.jmxremote.ssl=false 指定了 JMX 是否启用 ssl

    3. -Dcom.sun.management.jmxremote.authenticate=false   指定了JMX 是否启用鉴权(需要用户名,密码鉴权)

     4. -Djava.rmi.server.hostname :这个是配置 server 的 IP 的或者主机名,在docker中建义用主机名然后添加hosts解析访问


    windwos下使用jconsole工具连接jvm查看图形信息展示

    输入要连接的tomcat服务器IP和端口



    jvisualvm也是jdk自带的GUI工具

    输入要连接的tomcat服务器IP和端口

     可参考博客:https://www.cnblogs.com/sxdcgaq8080/p/7156227.html

     jprofiler工具

    
    优化GC
    一个是将转移到老年代的对象数量降到最少
    另一个是减少Full GC的执行时间
    GC优化的最基本原则是将不同的GC参数用于2台或者多台服务器,并进行对比,并将那些被证明提高了性能或者减少了GC执行时间的参数应用于服务器。 GC优化需要考虑的Java参数 定义 参数 描述 堆内存空间 -Xms 启动JVM时的堆内存空间。 -Xmx 堆内存最大限制 新生代空间 -XX:NewRatio 新生代和老年代的占比 -XX:NewSize 新生代空间 -XX:SurvivorRatio 伊甸园空间和幸存者空间的占比 进行GC优化时经常使用-Xms,-Xmx和-XX:NewRatio。-Xms和-Xmx是必须的。你如何设定NewRatio 会对GC性能产生十分显著的影响。 进行基准测试时,为确保最好的性能,要把堆的大小设大,确保垃圾收集不在整个基准测试的过程中出现 内存申请过程: 1、JVM会试图为相关Java对象在年轻代的Eden区中初始化一块内存区域。 2、当Eden区空间足够时,内存申请结束。否则执行下一步。 3、JVM试图释放在Eden区中所有不活跃的对象(Young GC)。释放后若Eden空间仍然不足以放入新对象,JVM则试图将部分Eden区中活跃对象放入Survivor区。 4、Survivor区被用来作为Eden区及年老代的中间交换区域。当年老代空间足够时,Survivor区中存活了一定次数的对象会被移到年老代。 5、当年老代空间不够时,JVM会在年老代进行完全的垃圾回收(Full GC)。 6、Full GC后,若Survivor区及年老代仍然无法存放从Eden区复制过来的对象,则会导致JVM无法在Eden区为新生成的对象申请内存,即出现“Out of Memory” 关于参数调优可以参考下面两篇博客: http://blog.chopmoon.com/favorites/231.html http://www.importnew.com/13954.html https://blog.csdn.net/kthq/article/details/8618052
  • 相关阅读:
    Swoole addProcess的使用
    《一个人的好天气》读后感
    AIStudio强化学习7日打卡学习体验
    PythonAI百度飞桨aistudio以及PaddlePaddle实践心得
    leetcode.929.UniqueEmailAddresses
    leetcode.852.PeakIndexinaMountainArray
    leetcode.66.PlusOne
    leetcode.657.JudgeRouteCircle
    leetcode.412.FizzBuzz
    图片切碎片脚本 python PIL库实践
  • 原文地址:https://www.cnblogs.com/shansongxian/p/9798966.html
Copyright © 2011-2022 走看看