利用JDK自带工具分析JVM使用情况

JDK 1.7+(jcmd命令从JDK 1.7以后支持)

JVM进程的pid(Linux环境可以通过ps -ef获取)

必须进入指定jdk的bin目录下包含jps、jstat等等,然后再输命令,否则命令无效

https://www.cnblogs.com/ostenant/p/9696226.html

1. jcmd命令介绍 --- 显示进程内存信息

1.1 查看进程

     命令:jcmd -l

     作用:查看环境上所有JVM进程的信息(云化环境JVM进程较多,建议直接使用ps -ef | grep "微服务名称"查询比较方便)

1.2 列出当前JVM进程支持的命令(最最最实用的命令)

    命令:jcmd pid help

    作用:列出当前运行的 java 进程可以执行的操作

1.3 打印堆内存

    命令:jcmd pid GC.heap_dump dump.bin(云化环境打印在微服务的根目录下)

    作用:打印堆内存到文件

1.4 打印堆栈信息

    方法一:欧拉操作系统,使用ossuser执行 kill -3 pid。堆栈信息打印在各服务tomcat的catalina.out文件中。

    致谢:多谢超哥00267207提供方法及输出文件路径。

    方法二:命令:jcmd pid Thread.print (内容较多,建议输出到文件, jcmd pid Thread.print > thread.log)

    作用:打印堆栈信息

更多细节:https://www.jianshu.com/p/388e35d8a09b

2.jstat命令介绍 --- 显示垃圾回收信息

jstat是用于识别虚拟机各种运行状态信息的命令行工具。它可以显示本地或者远程虚拟机进程中的类装载内存垃圾收集、jit编译等运行数据,它是线上定位jvm性能的首选工具。

jstat工具提供如下的jvm监控功能:

1)类的加载卸载的情况;

2)查看新生代老生代元空间(MetaSpace)的容量及使用情况;

3)查看新生代老生代元空间(MetaSpace)的垃圾回收情况,包括垃圾回收的次数,垃圾回收所占用的时间

4)查看新生代中Eden区及Survior区中容量分配情况等。

2.1 查看gc信息

命令:jstat -gc pid

 作用:显示gc的信息,查看gc的次数,及时间

              S0C:第一个幸存区的大小

              S1C:第二个幸存区的大小

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

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

              EC:伊甸园区的大小

              EU:伊甸园区的使用大小

              OC:老年代大小

              OU:老年代使用大小

              MC:方法区大小

              MU:方法区使用大小

              CCSC:压缩类空间大小

              CCSU:压缩类空间使用大小

              YGC:从应用程序启动到采样时young gc的次数

              YGCT:从应用程序启动到采样时young gc的所用的时间(s)

              FGC:从应用程序启动到采样时full gc的次数

              FGCT:从应用程序启动到采样时full gc的所用的时间(s)

              GCT: 从应用程序启动到采样时整个gc所用的时间

./jstat -gc 426 1000 10

每隔1秒更新出最新的一行jstat统计信息,一共执行10次jstat统计。

通过这个命令,可以非常灵活的对线上机器通过固定频率输出统计信息,观察每隔一段时间的JVM中的Eden区对象占用变化。比如执行完这个命令之后,第一秒先显示出Eden区使用了200MB内存,第二秒显示出来Eden区使用了205MB内存,第三秒显示Eden区使用了209MB内存,以此推出这个系统大概每秒新增5MB左右的对象。

2.2 gc信息统计

    命令:jstat -gcutil pid

    作用:获取gc的统计数据

              S0:幸存1区当前使用比例

              S1:幸存2区当前使用比例

              E:伊甸园区使用比例

              O:老年代使用比例

              M:元数据区使用比例

              CCS:压缩使用比例

              YGC:年轻代垃圾回收次数

              FGC:老年代垃圾回收次数

              FGCT:老年代垃圾回收消耗时间

              GCT:垃圾回收消耗总时间

实操:jstat -gcutil pid 3s (每3s打印一次gcutil)

表示监控进程11900的GC情况,每3秒输出一条记录,从这里可以看到O列一直100%,FGC列一直增长。这种场景表示FullGC后,堆内存一直没法释放。一旦出现这种情况,基本上十有八九就是内存泄漏。 

要点:O列(老生代内存使用率)一直接近100%,FGC列(FullGC次数)一直增长

致谢:多谢超哥 00267207提供实际案例。

更多细节:

https://apppukyptrl1086.pc.xiaoe-tech.com/detail/i_5d11e6b3c5c6a_K6Xk3Bs1/1

https://blog.csdn.net/zhaozheng7758/article/details/8623549

3:jps使用  ---主要查看进程JVM配置信息

jps是用于查看有权访问的hotspot虚拟机的进程。当未指定hostid时,默认查看本机jvm进程,否则查看指定的hostid机器上的jvm进程,此时hostid所指机器必须开启jstatd服务。

jps可以列出jvm进程lvmid,主类类名,main函数参数,jvm参数,jar名称等信息。

 命令:./jsp -l ---输出进程号,jar包

 命令:./jps -v ---输出进程启动时jvm参数配置

 命令:./jps -m ---输出进程启动依赖的配置参数

更多细节:https://blog.csdn.net/wo541075754/article/details/55095443

4:jinfo  --查看和调整jvm各项参数

jinfo(JVM Configuration info)这个命令作用是实时查看和调整 虚拟机运行参数。之前的 jps -v 命令只能查看到显示 指定的参数,如果想要查看 未显示 的参数的值就要使用 jinfo 命令。

jinfo [option] pid

选项

option具体选项及作用如下:

-flags 查看jvm的参数

-sysprops 查看java系统参数

-flag [+|-] 修改正在运行的Java应用程序JVM参数,其中+是开启对应参数,-是关闭对应参数


命令:./jinfo 655


命令:./jinfo -flags 655    查看jvm参数


命令:./jinfo -flag  <name>  pid

命令:./jinfo -flag < name > = < value >      修改指定name的jvm参数值

[root@izbp1chtb8a3vd2mzvuawlz ~]# jinfo -flag CMSAbortablePrecleanWaitMillis 4306   

-XX:CMSAbortablePrecleanWaitMillis=100

[root@izbp1chtb8a3vd2mzvuawlz ~]# jinfo -flag CMSAbortablePrecleanWaitMillis=50 4306

[root@izbp1chtb8a3vd2mzvuawlz ~]# jinfo -flag CMSAbortablePrecleanWaitMillis 4306 

-XX:CMSAbortablePrecleanWaitMillis=50

 查看可修改的JVM参数:

命令:java -XX:+PrintFlagsInitial | grep manageable

命令:./jinfo -flag [+|-]     关闭PrintGCDetails参数

更多细节:https://blog.csdn.net/qq2430/article/details/82154442

5.jmap --- 内存映射工具

jmap(JVM Memory Map) 命令用来查看堆内存使用状况,一般结合jhat使用,用于生成heap dump文件。jmap不仅能生成dump文件,还可以查询finalize执行队列、Java元空间metaspace的详细信息,如当前使用率、当前使用的是哪种收集器等等。

如果不使用这个命令,还可以使用-XX:+HeapDumpOnOutOfMemoryError参数来让虚拟机出现OOM的时候,自动生成dump文件。

命令:./jmap -dump:format=b,file=./gate.dump 9625

dump用于导出内存转储快照。常用的方式是通过jmap把进程内存使用情况dump到文件中,再用jhat分析查看。jmap进行dump的命令格式如jmap -dump:format=b,file=dumpFileName,导出的 dump 文件可以通过 MAT、VisualVM 和 jhat 等工具查看分析:

命令:./jmap -finalizerinfo 9625

命令:./jmap -heap 9625

显示  中的摘要信息。包括 堆内存 的使用情况,正在使用的 GC 算法堆配置参数 和 各代中堆内存 使用情况。可以用此来判断内存目前的 使用情况 以及 垃圾回收 情况。

命令:./jmap -histo 9625

打印堆的 对象统计,包括 对象实例数内存大小 等等。因为在 histo:live 前会进行 full gc,如果带上 live 则只统计 活对象。不加 live 的堆大小要大于加 live 堆的大小。

更多细节:https://blog.csdn.net/zhaozheng7758/article/details/8623530

6.jstack --- 进程中的堆栈跟踪

jstack用于生成java虚拟机当前时刻的线程快照线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈集合。生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁死循环请求外部资源导致的长时间等待等等。

线程出现停顿的时候,通过jstack来查看各个线程调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。如果java程序崩溃生成core文件,jstack工具可以通过core文件获取java stack和native stack的信息,从而定位程序崩溃的原因。

命令:./jstack -F 9625    --强制输出线程堆栈

命令:./jstack -l  655 --显示堆栈和锁

命令:./jstack -m 9625  --可以显示本地c++堆栈

更多细节:https://blog.csdn.net/zhaozheng7758/article/details/8623535

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,723评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,080评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,604评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,440评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,431评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,499评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,893评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,541评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,751评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,547评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,619评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,320评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,890评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,896评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,137评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,796评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,335评论 2 342