• JVM调优工具及了解


     仅以此记录学习笔记等!

    JVM调优

    常见的调优指令

    jps

    查看应用程序对应的进程id

     

    jmap

    内存

    查看内存信息,实例个数,占用内存的大小等

    jmap -histo 27500(可添加 > ./testLog.txt 生成txt到当前目录下)

    • num:序号
    • instances:实例数量
    • bytes:占用空间大小
    • class name:类名称,[C is a char[],[S is a short[],[I is a int[],[B is a byte[],[[I is a int[][

    查看堆信息:jmap -heap 27500

    堆快照dump:jmap -dump:format=b,file=xxx.hprof 27500

    设置堆内存溢出自动dump:-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./(生成文件路径)

     

    jstack

    得到运行java程序的java stack和native stack的信息

    格式:

    jstack [ option ] pid 

    jstack [ option ] executable core 

    jstack [ option ] [server-id@]remote-hostname-or-IP 

     

    场景:

    1死锁,Deadlock

    2等待资源,Waiting on condition

    •  等待获取监视器,Waiting on monitor entry 

    3阻塞,Blocked(重点关注) 

    •  执行中,Runnable 

    •  暂停,Suspended 

    •  对象等待中,Object.wait() 或 TIMED_WAITING 

    •  停止,Parked 

     

    查看程序cpu及内存使用情况

    top -p <pid>

     

    执行 jstack 19663|grep -A 10 4cd0,得到线程堆栈信息中 4cd0 这个线程所在行的后面10行,从堆栈中可以发现导致cpu飙高的调用方法

     

    jinfo

    查看jvm的参数:jinfo -flags <pid>

    查看java程序的参数:jinfo -sysprops <pid>

     

    jstat

    以查看堆内存各部分的使用量,以及加载类的数量。(注意:使用的jdk版本是jdk8 )

    命令格式: jstat [-命令选项] [vmid] [间隔时间(毫秒)] [查询次数]

    常用指令:

    查看程序内存使用及GC压力整理情况:jstat -gc pid

    查看堆内存统计:jstat -gccapacity pid

    查看新生代内存统计:jstat -gcnewcapacity pid

    查看新生代垃圾回收统计:jstat -gcnew pid

    查看老年代内存统计:jstat -gcoldcapacity pid

    查看老年代垃圾回收统计:jstat -gcold pid

    查看元数据空间统计:jstat -gcmetacapacity pid

     

    jvisualvm

    1导入dump文件分析堆信息

    2线程dump,查看当前线程运行信息

     

    优化思路

    先给自己的系统设置一些初始性的 JVM参数,比如堆内存大小,年轻代大小,Eden和Survivor的比例,老年代的大小,大对象的阈值,大龄对象进入老年代的阈值等。

     

    1.年轻代对象增长的速率

    jstat -gc pid 1000 10(每隔1s执行1次,共执行10次)观察EU区的使用,来估算每秒Eden区大概有多少新增的对象。当系统负荷不高时,可以将执行时间调大到1分钟甚至10分钟来观察。

    2.young gc触发的频率和单次耗时时间

    公式:触发频率=YGCT/YGC(jstat命令可查看,YGCT young gc总耗时单位s,YGC young gc次数)

    3.每次young gc后有多少对象是存活的且进入老年代

    从第二点中知道young gc频率,如果是10分钟一次那么 jstat -gc pid 600000 10,就可以通过该指令查看gc中,每次Eden区、Survivor、老年代区的使用及变化情况。众所周知,每次gc后,eden区存活对象减少,Survivor、老年代都有可能增长,这些增长的对象就是每次young gc后存活的对象,可以看出每次young gc有多少存活的对象是进入到老年代中的,推算出老年代的增长速率。

    4.Full GC的触发频率和单次耗时时间

    公式:触发频率=FGCT/FGC(FGCT full gc总耗时单位s,FGC full gc次数)

     

    思路:基本看来就是

    1尽量让每次young gc后的存活对象小于Survivor区域的50%,将存活对象留在新生代中,尽量别让对象进入老年代中。

    2尽量减少full gc的频率,避免频繁full gc对jvm性能的影响。

    3新生代或者老年代的增长过快之类的,回顾其内存分配时注意的一些点。

    我始终记住:青春是美丽的东西,而且对我来说,它永远是鼓舞的源泉。——(现代)巴金
  • 相关阅读:
    Codeforces Round #171 (Div. 2)
    ACdream 1079 郭式树
    HDOJ 1517 博弈论
    ACdream 1080 面面数
    博弈论 Nim 博弈
    Codeforces Round #172 (Div. 2)
    ACdream 1084 同心树
    STL bitset
    博弈论 bash博弈
    POJ 3261 后缀数组
  • 原文地址:https://www.cnblogs.com/flyinglion/p/14897575.html
Copyright © 2020-2023  润新知