天天看点

JVM常用指令以及JVM调优

文章目录

    • 1.指令查看进程`jps`
    • 2.查看实例大小`jmap -histo 14900 > ./log.txt` 【定位内存】
    • 3.查看堆大小信息`jmap -heap 14900`【定位内存】
    • 4.堆内存快照dump【定位内存】
    • 5.运行线程的信息jstack 【查看线程 飙升的原因】
    • 6.查看正在运行的java应用程序的扩展参数 `jinfo`
    • 7.jstat命令可以查看堆内存各部分的使用量

1.指令查看进程

jps

JVM常用指令以及JVM调优

linux下查看pid

jps -l
或者
ps -ef | grep java
           

2.查看实例大小

jmap -histo 14900 > ./log.txt

【定位内存】

JVM常用指令以及JVM调优

log.txt

JVM常用指令以及JVM调优

num序号

instances 实例数量

bytes 占用空间大小

class name 类名称 【C is a char[]】【S is a short[]】【I is a int[]】【B is a byte[]】

3.查看堆大小信息

jmap -heap 14900

【定位内存】

JVM常用指令以及JVM调优

4.堆内存快照dump【定位内存】

jmap ‐dump:format=b,file=eureka.hprof 14660

也可以设置内存溢出自动导出dump文件(内存很大的时候,可能会导不出来)

1. -XX:+HeapDumpOnOutOfMemoryError

2. -XX:HeapDumpPath=./   

JVM设置 出现内存溢出的时候,将堆内存快照信息打印到文件内:
‐Xms10M ‐Xmx10M ‐XX:+PrintGCDetails ‐XX:+HeapDumpOnOutOfMemoryError ‐XX:HeapDumpPath=D:\jvm.dump
           

jvm自带分析工具:

jvisualvm

命令工具导入该 dump 文件分析 【文件】—》【装入】

5.运行线程的信息jstack 【查看线程 飙升的原因】

jstack

进程号 查看当前状态下的 运行线程信息

“Thread-1” 线程名

prio=5 优先级=5

tid=0x0000001fgsd000 线程id

pid=0xed64 线程对应本地线程标识

java.lang.Thread.State:BLOCKED 线程状态

Found one Java-level deadlock 发现死锁

jvisualvm 可以检测出现死锁

【查看线程 飙升的原因】

jps查看进程号:

1,使用命令top -p ,显示你的java进程的内存情况,pid是你的java进程号,比如19663

2,按H,获取每个线程的内存情况

3,找到内存和cpu占用最高的线程tid,比如196644,转为十六进制得到 0x4cd0,此为线程id的十六进制表示

5,执行 jstack 19663|grep -A 10 4cd0,【注意十六进制需要小写】得到线程堆栈信息中 4cd0 这个线程所在行的后面10行,从堆栈中可以发现导致cpu飙高的调用方法

6,查看对应的堆栈信息找出可能存在问题的代码

6.查看正在运行的java应用程序的扩展参数

jinfo

查看正在运行的java应用程序扩展参数 :

jinfo -flags <pid>

查看java jvm系统参数:

jinfo -sysprops <pid>

7.jstat命令可以查看堆内存各部分的使用量

jstat命令可以查看堆内存各部分的使用量,以及加载类的数量。

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

注意:使用的jdk版本是jdk8

jstat -gc pid 最常用,可以评估程序内存使用及GC压力整体情况

JVM常用指令以及JVM调优

S0C:第一个幸存区的大小,单位KB

S1C:第二个幸存区的大小

S0U:第一个幸存区的使用大小

S1U:第二个幸存区的使用大小

EC:伊甸园区的大小

EU:伊甸园区的使用大小

OC:老年代大小

OU:老年代使用大小

MC:方法区大小(元空间)

MU:方法区使用大小

CCSC:压缩类空间大小

CCSU:压缩类空间使用大小

YGC:年轻代垃圾回收次数

YGCT:年轻代垃圾回收消耗时间,单位s

FGC:老年代垃圾回收次数

FGCT:老年代垃圾回收消耗时间,单位s

GCT:垃圾回收消耗总时间,单位s

-Xms1536M -Xmx1536M -Xmn600M -Xss1M -XX:SurvivorRatio=6 -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=80 -XX:+UseCMSInitiatingOccupancyOnly

-Xms1536M 堆空间
-Xmx1536M 堆空间
-Xmn600M  年轻代空间
-Xss1M    栈空间
-XX:SurvivorRatio=6  eden和servior的比值 
-XX:MetaspaceSize=256M  元空间
-XX:MaxMetaspaceSize=256M 元空间
-XX:+UseParNewGC  年轻代使用 Parnew 
-XX:+UseConcMarkSweepGC 老年代使用 CMS
-XX:CMSInitiatingOccupancyFraction=80 当老年代达到预设值的 80 % 的时候触发 full gc
-XX:+UseCMSInitiatingOccupancyOnly
 
           

cms 初始标记 并发标记 重新标记 并发清理 并发重置

G1 初始标记 并发标记 最终标记 筛选回收

测试 项目 JVM调优开发:

-Xms1536M -Xmx1536M -Xmn512M -Xss1M -XX:SurvivorRatio=6 -XX:MetaspaceSize=128M -XX:MaxMetaspaceSize=128M
 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=85 -XX:+UseCMSInitiatingOccupancyOnly