美文网首页
jvm优化实战

jvm优化实战

作者: 奋斗的韭菜汪 | 来源:发表于2020-11-01 19:59 被阅读0次
    (1)串行垃圾收集器
    -XX:+UseSerialGC
    -XX:+UseSerialOldGC
    (2)并行收集器(吞吐量优先)
    -XX:+UseParallelGC
    -XX:+UseParallelOldGC
    (3)并发收集器(响应时间优先)
    -XX:+UseConMarkSweepGc
    -XX:+UseG1GC
    

    jvm参数:
    (1)标准参数
    java -version/-help 提供的参数,不会随着jdk版本变化而变化
    (2)-X参数
    非标准参数,会随jdk版本变动而变动 例:-Xint
    (3)-XX参数
    -XX参数最常用的参数,可分为两类

    a.Boolean类型
    格式:-XX:[+-]<name>    +或-表示启用或者禁用name属性 
    比如:-XX:+UseConcMarkSweepGC    表示启用CMS类型的垃圾回收器
            -XX:+UseG1GC    表示启用G1类型的垃圾回收器
    b.非Boolean类型 
    格式:-XX<name>=<value>  表示name属性的值是value 
    比如:-XX:MaxGCPauseMillis=500
    

    (4)其他参数(也可理解成-XX参数,官方只分为三种)

       -Xms100M等价于 -XX:InitialHeapSize=100M
       -Xmx100M等级于 -XX:MaxHeapSize=100M
       -Xss100k等价于 -XX:ThreadStackSize=100k
    

    启动java进程时打印jvm参数信息:
    -XX:+PrintFlagsFinal
    jvm参数设置的方式:
    (1)本地环境idea,eclipse
    (2)jar包启动 java -XX:+UseG1GC xxx.jar
    (3)tomcat等容器启动,一般bin文件中有xxx.sh启动文件中配置
    (4)实时修改,不需要重启服务:jinfo
    常用JVM需要调优的参数:
    常用JVM调优命令:(不需要安装jdk自带,配置环境变量就已经有了)
    1、jps:查看当前java进程
    2、jinfo:查看或修改java参数(jinfo -flag MaxHeapSize pid:查看pid进程的最大堆内存的值,jinfo -flag UseG1Gc pid:查看pid进程是否使用G1垃圾收集器)
    实时修改vm参数中的某个值:jinfo -flag name=value pid(注:只有标记是manageable才能实时修改)

    image.png
    3、jstat:
    jstat -class pid 1000 10:打印pid进程的类加载信息,1秒打印一次,打印10次
    jstat -gc pid 1000 10:打印pid进程的gc收集情况,1秒打印一次,打印10次
    4、jstack:查看线程的堆栈信息(主要是线程信息,如果线程出现问题方便排查,例如多线程抢占锁死锁问题)
    5、jmap:生成堆内存的快照(排查oom异常)
    jmap -heap pid
    参数解析:
    image.png
    MaxHeapSize 最大堆内存300M
    NewSize新生代100M
    OldSize老年代200M
    NewRatio老年代新生代大小比例2
    生产环境oom异常自动dump内存信息文件:
    启动脚本中加入:-XX:+heapDumpOutOfMemoryError -XX:HeapDumpPath=heap.hprof
    java内存可视化工具:jconsole、jvisualvm(支持远程连接)、arthas(alibaba产品)
    jvm优化关注的点:
    1、堆内存分析
    堆内存分析工具MAT,通过分析dump文件heap.hprof,分析内存问题
    在线工具:PerfMa
    2、垃圾回收(GC日志)
    gcviewer工具,分析gc日志,关注吞吐量和停顿时间
    在线工具gceasy
    ** -XX参数**
    使用得最多的参数类型
    非标准化参数,相对不稳定,主要用于JVM调优和Debug
    获取Dump文件
    手动:
    jmap -dump:format=b,file=heap.hprof 44808
    自动:
    -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=heap.hprof

    Histogram可以列出内存中的对象,对象的个数及其大小

    Class Name:类名称,java类名 Objects:类的对象的数量,这个对象被创建了多少个
    Shallow Heap:一个对象内存的消耗大小,不包含对其他对象的引用
    Retained Heap:是shallow Heap的总和,即该对象被GC之后所能回收到内存的总和
    右击类名--->List Objects--->with incoming references--->列出该类的实例
    右击Java对象名--->Merge Shortest Paths to GC Roots--->exclude all ...--->找到GC Root以及原因
    

    Leak Suspects

    查找并分析内存泄漏的可能原因
    Reports--->Leak Suspects--->Details
    

    Top Consumers: 列出大对象
    GC日志分析工具
    要想分析日志的信息,得先拿到GC日志文件才行,所以得先配置一下
    根据前面参数

    -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -Xloggc:gc.log
    

    工具:GCViewer,在线工具

    相关文章

      网友评论

          本文标题:jvm优化实战

          本文链接:https://www.haomeiwen.com/subject/fyvrmktx.html