深入理解JVM - JVM常用命令

Linux 使用 appuser执行命令

sudo -u appuser jps

JVM 常用命令

  • jps(JVM Process Status Tool):显示指定系统内所有的HotSpot虚拟机进程
  • jstat(JVM Statistics Monitoring Tool):用户收集HotSpot虚拟机各方面的运行数据
  • jinfo(Configuration Info for Java):实时查看和调整虚拟机各项参数,在JDK9中集成到了jhsdb
  • jmap(Memory Map for java):生成虚拟机的内存转储快照,在JDK9中集成到了jhsdb
  • jhat(JVM Heap Dump Browser):用户分析heapdump文件,它会建立一个HTTP/HTML服务器,让用户可以在浏览器上查看分析结果,在JDK9中集成到了jhsdb
  • jstack(Stack Trace for Java):生成虚拟机当前时刻的线程快照,在JDK9中集成到了jhsdb
  • jhsdb(Java HotSport Debugger):进程调试器,在JDK9引入

jps

列出当前机器上正在运行的虚拟机进程,jps命令格式:

jps [option] [hostid]

-p: 仅仅显示VM 标示,不显示jar,class, main参数等信息.
-m: 输出主函数传入的参数. 下的hello 就是在执行程序时从命令行输入的参数
-l: 输出应用程序主类完整package名称或jar完整名称.
-v: 列出jvm参数

执行样例:

C:\Users\yuhao.wang3>jps -l
11824 sun.tools.jps.Jps
9860 org.jetbrains.idea.maven.server.RemoteMavenServer
7960

jstat

是用于监视虚拟机各种运行状态信息的命令行工具。它可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据,在没有GUI图形界面,只提供了纯文本控制台环境的服务器上,它将是运行期定位虚拟机性能问题的首选工具。

jstat [ option pid [interval[s|ms] [count]] ]
image.png

假设需要每250毫秒查询一次进程9860垃圾收集状况,一共查询5次,那命令应当是:

C:\Users\yuhao.wang3>jstat -gc 9860 250 5
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
10752.0 10752.0  0.0    0.0   64512.0   867.6    76800.0     8207.2   23808.0 22909.2 3072.0 2769.6      6    0.049   4      0.209    0.258
10752.0 10752.0  0.0    0.0   64512.0   867.6    76800.0     8207.2   23808.0 22909.2 3072.0 2769.6      6    0.049   4      0.209    0.258
10752.0 10752.0  0.0    0.0   64512.0   867.6    76800.0     8207.2   23808.0 22909.2 3072.0 2769.6      6    0.049   4      0.209    0.258
10752.0 10752.0  0.0    0.0   64512.0   867.6    76800.0     8207.2   23808.0 22909.2 3072.0 2769.6      6    0.049   4      0.209    0.258
10752.0 10752.0  0.0    0.0   64512.0   867.6    76800.0     8207.2   23808.0 22909.2 3072.0 2769.6      6    0.049   4      0.209    0.258
  • S0C:表示S0区域总大小
  • S0U:表示S0区域已使用大小

jinfo

查看和修改虚拟机的参数,命令格式:

jinfo [option] pid

jinfo –sysprops 可以查看由System.getProperties()取得的参数
jinfo –flag 未被显式指定的参数的系统默认值
jinfo –flags(注意s)显示虚拟机的参数
jinfo –flag +[参数] 可以增加参数,但是仅限于由java -XX:+PrintFlagsFinal –version查询出来且

执行示例:

C:\Users\yuhao.wang3>jinfo -flags 9860
Attaching to process ID 9860, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.112-b15
Non-default VM flags: -XX:CICompilerCount=3 -XX:InitialHeapSize=264241152 -XX:MaxHeapSize=805306368 -XX:MaxNewSize=268435456 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=88080384 -XX:OldSize=176160768 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
Command line:  -Djava.awt.headless=true -Didea.version==2018.3.2 -Xmx768m -Didea.maven.embedder.version=3.3.9 -Dfile.encoding=GBK

jmap

用于生成堆转储快照(一般称为heapdump或dump文件)。jmap的作用并不仅仅是为了获取dump文件,它还可以查询finalize执行队列、Java堆和永久代的详细信息,如空间使用率、当前用的是哪种收集器等。和jinfo命令一样,jmap有不少功能在Windows平台下都是受限的,除了生成dump文件的-dump选项和用于查看每个类的实例、空间占用统计的-histo选项在所有操作系统都提供之外,其余选项都只能在Linux/Solaris下使用,命令格式:

jmp [option] pid
image.png

生成堆的转存文件:

C:\Users\yuhao.wang3>jmap -dump:live,format=b,file=heap.bin 9860
Dumping heap to C:\Users\yuhao.wang3\heap.bin ...
Heap dump file created

jhat

虚拟机堆转储快照分析工具

分析刚刚生成的文件:

C:\Users\yuhao.wang3>jhat C:\Users\yuhao.wang3\heap.bin
Reading from C:\Users\yuhao.wang3\heap.bin...
Dump file created Tue Jan 14 17:59:13 CST 2020
Snapshot read, resolving...
Resolving 151163 objects...
Chasing references, expect 30 dots..............................
Eliminating duplicate references..............................
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.

屏幕显示“Server is ready.”的提示后,用户在浏览器中输入http://localhost:7000/可以看到分析结果,拖到最下面,主要看"HeapHistogram"。

jstack

jstack(Stack Trace for Java)命令用于生成虚拟机当前时刻的线程快照。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁死循环、请求外部资源导致的长时间等待等都是导致线程长时间停顿的常见原因,命令格式:

jstack [option] pid

-F:当正常输出的请求不被响应时,强制输出线程堆栈
-l:除堆栈外,显示关于锁的附加信息
-m:如果调用到本地方法的话,可以显示C/C++的堆栈

查询死循环示例:

public class JstackDeadWhileTest {

    public static void main(String[] args) {
        int i = 1;
        while (++i > 0) {
            System.out.println(i);
        }
    }
}
C:\Users\yuhao.wang3>jps -l
18244 com.xiaolyuh.JstackDeadWhileTest
5444 org.jetbrains.jps.cmdline.Launcher
7960
10252 sun.tools.jps.Jps
17324 org.jetbrains.kotlin.daemon.KotlinCompileDaemon

C:\Users\yuhao.wang3>jstack -F 18244
Attaching to process ID 18244, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.112-b15
Deadlock Detection:

No deadlocks found.

Thread 14: (state = BLOCKED)


Thread 13: (state = BLOCKED)


Thread 12: (state = BLOCKED)
 - java.lang.Object.wait(long) @bci=0 (Interpreted frame)
 - java.lang.ref.ReferenceQueue.remove(long) @bci=59, line=143 (Interpreted frame)
 - java.lang.ref.ReferenceQueue.remove() @bci=2, line=164 (Interpreted frame)
 - java.lang.ref.Finalizer$FinalizerThread.run() @bci=36, line=209 (Interpreted frame)


Thread 11: (state = BLOCKED)
 - java.lang.Object.wait(long) @bci=0 (Interpreted frame)
 - java.lang.Object.wait() @bci=2, line=502 (Interpreted frame)
 - java.lang.ref.Reference.tryHandlePending(boolean) @bci=54, line=191 (Interpreted frame)
 - java.lang.ref.Reference$ReferenceHandler.run() @bci=1, line=153 (Interpreted frame)


Thread 5: (state = IN_NATIVE)
 - java.io.FileOutputStream.writeBytes(byte[], int, int, boolean) @bci=0 (Compiled frame; information may be imprecise)
 - java.io.FileOutputStream.write(byte[], int, int) @bci=8, line=326 (Compiled frame)
 - java.io.BufferedOutputStream.flushBuffer() @bci=20, line=82 (Compiled frame)
 - java.io.BufferedOutputStream.flush() @bci=1, line=140 (Compiled frame)
 - java.io.PrintStream.write(byte[], int, int) @bci=30, line=482 (Compiled frame)
 - sun.nio.cs.StreamEncoder.writeBytes() @bci=120, line=221 (Compiled frame)
 - sun.nio.cs.StreamEncoder.implFlushBuffer() @bci=11, line=291 (Compiled frame)
 - sun.nio.cs.StreamEncoder.flushBuffer() @bci=15, line=104 (Compiled frame)
 - java.io.OutputStreamWriter.flushBuffer() @bci=4, line=185 (Compiled frame)
 - java.io.PrintStream.write(java.lang.String) @bci=27, line=527 (Compiled frame)
 - java.io.PrintStream.print(int) @bci=5, line=597 (Compiled frame)
 - java.io.PrintStream.println(int) @bci=6, line=736 (Compiled frame)
 - com.xiaolyuh.JstackDeadWhileTest.main(java.lang.String[]) @bci=13, line=14 (Compiled frame)

在代码中可以用java.lang.Thread类的getAllStackTraces()方法用于获取虚拟机中所有线程的StackTraceElement对象。使用这个方法可以通过简单的几行代码就完成jstack的大部分功能,在实际项目中不妨调用这个方法做个管理员页面,可以随时使用浏览器来查看线程堆栈。

性能监控和故障处理工具

image.png

VisualVM:多合-故障处理工具

直接运行命令jvisualvm就可以打开VisualVM工具了。

插件安装

先去这个地址找到对应版本的插件地址(https://xxx/updates.xml.gz):
https://visualvm.github.io/pluginscenters.html

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