jvm常用分析命令

常用jvm命令

jstat

查看java进程的gc状况

/ # jstat -gc 11
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
26112.0 26112.0  0.0   23597.8 209920.0 10723.2   524288.0   160828.1  94592.0 90638.6 10880.0 10134.0  14083  364.899  585   161.727  526.626
/ # jstat -gcutil 11
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
 83.26   0.00  20.78  33.24  95.82  93.14  14084  364.926   585  161.727  526.652

注:结果中涉及到jvm堆内存的相关知识,这里不做详细说明,感兴趣的可以搜索jvm堆内存相关的文章学习研究一下

jstack

查看jvm中栈的信息(线程)

直接查看前50行栈的信息

/ # jstack 11 | head -50
2019-09-09 06:50:10
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.171-b11 mixed mode):

"ActiveMQ InactivityMonitor Worker" #11371 daemon prio=5 os_prio=0 tid=0x00007ff4d0006800 nid=0x2d88 waiting on condition [0x00007ff4b4fd0000]
   java.lang.Thread.State: TIMED_WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x00000000d338aec0> (a java.util.concurrent.SynchronousQueue$TransferStack)
        at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
        at java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue.java:460)
        at java.util.concurrent.SynchronousQueue$TransferStack.transfer(SynchronousQueue.java:362)
        at java.util.concurrent.SynchronousQueue.poll(SynchronousQueue.java:941)
        at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1073)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)

"Attach Listener" #11349 daemon prio=9 os_prio=0 tid=0x00007ff51800d000 nid=0x2cb0 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"http-nio-8402-exec-12" #3103 daemon prio=5 os_prio=0 tid=0x00007ff5147d7000 nid=0xc29 waiting on condition [0x00007ff4b50d1000]
   java.lang.Thread.State: WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x00000000d31e44f8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
        at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
        at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:103)
        at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:31)
        at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Thread.java:748)

"http-nio-8402-exec-11" #3102 daemon prio=5 os_prio=0 tid=0x00007ff5143a4800 nid=0xc28 waiting on condition [0x00007ff4b51d2000]
   java.lang.Thread.State: WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x00000000d31e44f8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
        at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
        at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:103)
        at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:31)
        at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Thread.java:748)

将所有的栈信息备份到指定文件中

/ # jstack 11 >> jstack20190909

按照状态汇总并展示堆栈信息

/ # jstack 11 | grep "java.lang.Thread.State" | sort -nr | uniq -c
     11    java.lang.Thread.State: WAITING (parking)
      2    java.lang.Thread.State: WAITING (on object monitor)
      3    java.lang.Thread.State: TIMED_WAITING (sleeping)
      4    java.lang.Thread.State: TIMED_WAITING (parking)
      3    java.lang.Thread.State: TIMED_WAITING (on object monitor)
     11    java.lang.Thread.State: RUNNABLE
/ #

jmap

查看堆内存中存活的对象实例信息

/ # jmap -histo:live 11 | head -9

 num     #instances         #bytes  class name
----------------------------------------------
   1:        901174       47357792  [C
   2:        898439       21562536  java.lang.String
   3:         58585        5155480  java.lang.reflect.Method
   4:          7803        4511848  [B
   5:        117765        3768480  java.util.concurrent.ConcurrentHashMap$Node
   6:        136149        3267576  java.util.Date

-histo:live只显示存活的对象, 其中11表示进程id, head -9 显示前9个

使用jmap备份堆内存信息

/ # jmap -dump:live,format=b,file=jmap20190909 11
Dumping heap to /jmap20190909 ...
Heap dump file created

-dump 选项可以将当前的heap信息备份下来,live 仅备份存活的对象, format=b 备份成二进制文件, file=[filedir] 备份的文件名称, 11 java进程id

使用jhat分析jmap备份的内存数据,并启动一个web服务进行查看

/ # jhat -port 8899 jmap20190909
Reading from jmap20190909...
Dump file created Mon Sep 09 14:31:18 CST 2019
Snapshot read, resolving...
Resolving 3111305 objects...
Chasing references, expect 622 dots..............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
Eliminating duplicate references..............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
Snapshot resolved.
Started HTTP server on port 8899
Server is ready.

jmap备份后的信息,可以使用jhat进行分析,并启动一个web服务器,方便查看详细的heap信息
-port 指定启动web服务的端口,默认端口号7000, jmap20190909 为上一步jmap备份的文件名

常用的jvm启动参数

java  -jar -Xms256m -Xmx512m -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:NewRatio=2 -XX:SurvivorRatio=8 -Xloggc:/app-gc.log app.jar

-Xms256m 指定最小的堆内存

-Xmx512m 指定最大的堆内存: 动态扩展最大到512m

-XX:+PrintGCDateStamps 打印gc日志,并输出时间戳

-XX:NewRatio=2 指定老年代与年轻代的内存分配比例为 2:1, 即老年代占2/3, 年轻代占1/3

-XX:SurvivorRatio=8 指定年轻代中eden区内存与survivor区内存的比例为 8:1:1

-Xloggc:/app-gc.log 指定gc日志输出的文件

gc日志内容

Java HotSpot(TM) 64-Bit Server VM (25.171-b11) for linux-amd64 JRE (1.8.0_171-b11), built on Mar 28 2018 17:07:08 by "java_re" with gcc 4.3.0 20080428 (Red Hat 4.3.0-8)
Memory: 4k page, physical 8008884k(1129856k free), swap 0k(0k free)
CommandLine flags: -XX:InitialHeapSize=536870912 -XX:MaxHeapSize=805306368 -XX:NewRatio=2 -XX:+PrintGC -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:SurvivorRatio=8 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseParallelGC
2019-08-30T04:07:01.186+0000: 0.709: [GC (Allocation Failure) [PSYoungGen: 139776K->3815K(157184K)] 139776K->3823K(506880K), 0.0158590 secs] [Times: user=0.03 sys=0.00, real=0.02 secs]
2019-08-30T04:07:01.716+0000: 1.239: [GC (Allocation Failure) [PSYoungGen: 143591K->4274K(244736K)] 143599K->4354K(594432K), 0.0062708 secs] [Times: user=0.02 sys=0.00, real=0.01 secs]
2019-08-30T04:07:02.356+0000: 1.880: [GC (Allocation Failure) [PSYoungGen: 231602K->5464K(244736K)] 231682K->5552K(594432K), 0.0057272 secs] [Times: user=0.01 sys=0.01, real=0.01 secs]
2019-08-30T04:07:02.704+0000: 2.228: [GC (Allocation Failure) [PSYoungGen: 232792K->6139K(244736K)] 232880K->6235K(594432K), 0.0057959 secs] [Times: user=0.02 sys=0.00, real=0.00 secs]
2019-08-30T04:07:03.009+0000: 2.533: [GC (Allocation Failure) [PSYoungGen: 233467K->8151K(235520K)] 233563K->8255K(585216K), 0.0096851 secs] [Times: user=0.03 sys=0.00, real=0.01 secs]
2019-08-30T04:07:03.187+0000: 2.711: [GC (Metadata GC Threshold) [PSYoungGen: 103694K->6879K(236032K)] 103798K->6991K(585728K), 0.0078126 secs] [Times: user=0.02 sys=0.01, real=0.01 secs]
2019-08-30T04:07:03.195+0000: 2.719: [Full GC (Metadata GC Threshold) [PSYoungGen: 6879K->0K(236032K)] [ParOldGen: 112K->6743K(349696K)] 6991K->6743K(585728K), [Metaspace: 20923K->20923K(1069056K)], 0.0290297 secs] [Times: user=0.06 sys=0.01, real=0.03 secs]
2019-08-30T04:07:03.557+0000: 3.081: [GC (Allocation Failure) [PSYoungGen: 227328K->2371K(236544K)] 234071K->9122K(586240K), 0.0031362 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
2019-08-30T04:07:03.859+0000: 3.383: [GC (Allocation Failure) [PSYoungGen: 229699K->2796K(252928K)] 236450K->9547K(602624K), 0.0091977 secs] [Times: user=0.03 sys=0.01, real=0.01 secs]
2019-08-30T04:07:04.485+0000: 4.008: [GC (Allocation Failure) [PSYoungGen: 246508K->6477K(250368K)] 253259K->13236K(600064K), 0.0081053 secs] [Times: user=0.02 sys=0.00, real=0.01 secs]
2019-08-30T04:07:04.882+0000: 4.406: [GC (Allocation Failure) [PSYoungGen: 250189K->5376K(252928K)] 256948K->14055K(602624K), 0.0108411 secs] [Times: user=0.04 sys=0.01, real=0.01 secs]
2019-08-30T04:07:05.401+0000: 4.925: [GC (Allocation Failure) [PSYoungGen: 248576K->2195K(252416K)] 257255K->14982K(602112K), 0.0113168 secs] [Times: user=0.03 sys=0.00, real=0.02 secs]
2019-08-30T04:07:06.627+0000: 6.151: [GC (Allocation Failure) [PSYoungGen: 245395K->6632K(251904K)] 258182K->20196K(601600K), 0.0089046 secs] [Times: user=0.03 sys=0.00, real=0.01 secs]
2019-08-30T04:07:06.955+0000: 6.478: [GC (Allocation Failure) [PSYoungGen: 249320K->3013K(252416K)] 262884K->19340K(602112K), 0.0156316 secs] [Times: user=0.05 sys=0.00, real=0.01 secs]
2019-08-30T04:07:07.220+0000: 6.743: [GC (Allocation Failure) [PSYoungGen: 245701K->1897K(252416K)] 262028K->19481K(602112K), 0.0045420 secs] [Times: user=0.02 sys=0.00, real=0.01 secs]
2019-08-30T04:07:07.346+0000: 6.870: [GC (Metadata GC Threshold) [PSYoungGen: 105178K->1275K(252416K)] 122761K->19666K(602112K), 0.0042970 secs] [Times: user=0.01 sys=0.00, real=0.00 secs]
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 198,082评论 5 464
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,231评论 2 375
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 145,047评论 0 327
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,977评论 1 268
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,893评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,014评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,976评论 3 388
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,605评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,888评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,906评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,732评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,513评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,980评论 3 301
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,132评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,447评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,027评论 2 343
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,232评论 2 339

推荐阅读更多精彩内容

  • 夫妻双双离家乡, 养家出门找工忙。 抛子离娘寻出路, 力争过上好时光。 红工帽下灰工装, 夫妻相互帮衬忙。 努力打...
    行者顺达阅读 162评论 0 3
  • 做好自己一切都会改变。 真的是这样吗? 很多时候,会觉得做好了自己,还是看不到自己想要的改变在哪里。是不是很受打击...
    伊凡17阅读 414评论 0 0
  • 关键词,转折。 有句话说的好,要想最快速度的获得幸福感怎么办?答案是三个字,扔东西啊。 最近几年我身边越来越多的朋...
    Curtis2019阅读 199评论 0 0
  • 2018年10月底,L在朋友圈公布他有女朋友之后,虽然从未得到过,但是我却感觉自己失恋了,没有动力去做任何事情。而...
    一个莲子阅读 215评论 0 1
  • 骑车20分钟,现在有点忙呢,等下早班再骑车吧
    SPP164810阅读 75评论 0 0