JVM常用指令以及JVM调优

刺骨的言语ヽ痛彻心扉 2022-09-07 09:59 334阅读 0赞

文章目录

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

1.指令查看进程jps

请添加图片描述

linux下查看pid

  1. jps -l
  2. 或者
  3. ps -ef | grep java

2.查看实例大小jmap -histo 14900 > ./log.txt 【定位内存】

请添加图片描述

log.txt

请添加图片描述

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【定位内存】

请添加图片描述

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

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

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

  1. 1. -XX:+HeapDumpOnOutOfMemoryError
  2. 2. -XX:HeapDumpPath=./
  3. JVM设置 出现内存溢出的时候,将堆内存快照信息打印到文件内:
  4. 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压力整体情况

请添加图片描述

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

S1C:第二个幸存区的大小

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

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

EC:伊甸园区的大小

EU:伊甸园区的使用大小

OC:老年代大小

OU:老年代使用大小

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

MU:方法区使用大小

CCSC:压缩类空间大小

CCSU:压缩类空间使用大小

YGC:年轻代垃圾回收次数

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

FGC:老年代垃圾回收次数

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

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

  1. -Xms1536M -Xmx1536M -Xmn600M -Xss1M -XX:SurvivorRatio=6 -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=80 -XX:+UseCMSInitiatingOccupancyOnly
  2. -Xms1536M 堆空间
  3. -Xmx1536M 堆空间
  4. -Xmn600M 年轻代空间
  5. -Xss1M 栈空间
  6. -XX:SurvivorRatio=6 edenservior的比值
  7. -XX:MetaspaceSize=256M 元空间
  8. -XX:MaxMetaspaceSize=256M 元空间
  9. -XX:+UseParNewGC 年轻代使用 Parnew
  10. -XX:+UseConcMarkSweepGC 老年代使用 CMS
  11. -XX:CMSInitiatingOccupancyFraction=80 当老年代达到预设值的 80 % 的时候触发 full gc
  12. -XX:+UseCMSInitiatingOccupancyOnly

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

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

  1. 测试 项目 JVM调优开发:
  2. -Xms1536M -Xmx1536M -Xmn512M -Xss1M -XX:SurvivorRatio=6 -XX:MetaspaceSize=128M -XX:MaxMetaspaceSize=128M
  3. -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=85 -XX:+UseCMSInitiatingOccupancyOnly

发表评论

表情:
评论列表 (有 0 条评论,334人围观)

还没有评论,来说两句吧...

相关阅读

    相关 [JVM] 参数

    > 随着Java应用程序的不断发展和优化,JVM调优已经变得越来越重要。在这篇文章中,我们将探讨一些常用的JVM调优参数,了解如何更好地优化Java应用程序的性能。 ----