6 款 Java 8 自带工具,有趣分析定位 JVM 问题

临夏娱乐新闻网 2025-10-28

pDeltaBytes=1048576 -XX:NonNMethodCodeHeapSize=5835340 -XX:NonProfiledCodeHeapSize=122911450 -XX:ProfiledCodeHeapSize=122911450 -XX:ReservedCodeCacheSize=251658240 -XX:+SegmentedCodeCache -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseG1GCVM Arguments:java_command: common-mistakes-0.0.1-SNAPSHOT.jar -Xms1g -Xmx1gjava_class_path (initial): common-mistakes-0.0.1-SNAPSHOT.jarLauncher Type: SUN_STANDARD

检视第 15 引和 19 引可以辨认出,我们设为 JVM 变量的方式为不对,-Xms1g 和 -Xmx1g 这两个变量被说是了 Java 应用程序的重启变量 ,整个 JVM 以外最大者缓存是 4GB 有数,而不是 1GB。近来整理了一份最新的面试资料,里面收录了2021年各个大厂的面试题,想闹翻的年以不要错过,游标申领吧!

因此,当我们坚称 JVM 的配置很不情况下的时候,要第一一段时间用作作法来推定变量。除了用作作法推定 JVM 变量外,你也可以复印机 VM 变量和应用程序变量:

System.out.println("VM options");System.out.println(ManagementFactory.getRuntimeMXBean().getInputArguments().stream().collect(Collectors.joining(System.lineSeparator())));System.out.println("Program arguments");System.out.println(Arrays.stream(args).collect(Collectors.joining(System.lineSeparator())));

把 JVM 变量放到 -jar 之前,之后重启应用程序,可以看见如下输显现出,从输显现出也可以推定这次 JVM 变量的配置正确了:

➜ target git:(master) ✗ java -Xms1g -Xmx1g -jar common-mistakes-0.0.1-SNAPSHOT.jar testVM options-Xms1g-Xmx1gProgram argumentstest

jvisualvm

然后,重启另一个重量级作法 jvisualvm 仔细观察一下应用程序,可以在概述显示器最终推定 JVM 变量设为尝试了:

在此期间仔细观察监视显示器可以看见,JVM 的 GC 活动基本上是 10 秒愈演愈烈一次,沙土内依赖于 250MB 到 900MB 之间涨落,活动寄存器数是 22。我们可以在监视显示器看见 JVM 的基本上情况,也可以直接在这里进引手动 GC 和沙土 Dump 系统设计:

jconsole如果决心看见各个缓存七区的 GC 曲线图,可以用作 jconsole 仔细观察。jconsole 也是一个综合性图形界面管控作法,比 jvisualvm 更不方便的一点是,可以用曲线的型式管控各种信息,最主要 MBean 之中的属性值:

jstat

同样,如果很难条件用作图形界面(毕竟在 Linux 服务器上,我们主要用作请求引作法),又决心看见 GC 趋势的话,我们可以用作 jstat 作法。

jstat 作法准许以一般而言的管控次之输显现出 JVM 的各种管控举例来说,比如用作 -gcutil 输显现出 GC 和缓存清空汇总信息,每隔 5 秒输显现出一次,输显现出 100 次,可以看见 Young GC 比较剧烈,而 Full GC 基本上 10 秒一次:

➜ ~ jstat -gcutil 23940 5000 100 S0 S1 E O M CCS YGC YGCT FGC FGCT CGC CGCT GCT 0.00 100.00 0.36 87.63 94.30 81.06 539 14.021 33 3.972 837 0.976 18.968 0.00 100.00 0.60 69.51 94.30 81.06 540 14.029 33 3.972 839 0.978 18.979 0.00 0.00 0.50 99.81 94.27 81.03 548 14.143 34 4.002 840 0.981 19.126 0.00 100.00 0.59 70.47 94.27 81.03 549 14.177 34 4.002 844 0.985 19.164 0.00 100.00 0.57 99.85 94.32 81.09 550 14.204 34 4.002 845 0.990 19.196 0.00 100.00 0.65 77.69 94.32 81.09 559 14.469 36 4.198 847 0.993 19.659 0.00 100.00 0.65 77.69 94.32 81.09 559 14.469 36 4.198 847 0.993 19.659 0.00 100.00 0.70 35.54 94.32 81.09 567 14.763 37 4.378 853 1.001 20.142 0.00 100.00 0.70 41.22 94.32 81.09 567 14.763 37 4.378 853 1.001 20.142 0.00 100.00 1.89 96.76 94.32 81.09 574 14.943 38 4.487 859 1.007 20.438 0.00 100.00 1.39 39.20 94.32 81.09 575 14.946 38 4.487 861 1.010 20.442

其之中,S0 坚称 Survivor0 七区清空平均值,S1 坚称 Survivor1 七区清空平均值,E 坚称 Eden 七区清空平均值,O 坚称据闻七十年代清空平均值,M 坚称元信息七区清空平均值,YGC 坚称同龄代备用短一段时间,YGCT 坚称同龄代备用不间断,FGC 坚称据闻七十年代备用短一段时间,FGCT 坚称据闻七十年代备用不间断。

jstat 请求的变量众多,包含 -class、-compiler、-gc 等。Java 8、Linux/Unix 平台 jstat 作法的明晰简述,你可以检视这里。jstat 时才就会输显现出的连续性,可以不方便我们持续性仔细观察应用程序的各项举例来说。

在此期间带往寄存器显示器可以看见,大量以 Thread 开头的寄存器基本上都是有乐句的 10 秒运引一下,其他一段时间都在休眠,和我们的字符串逻辑匹配:

游标显示器的寄存器 Dump 按钮,可以检视寄存器瞬时的寄存器子应用程序:

jstack

通过请求引作法 jstack,也可以实现爬行寄存器子应用程序的系统设计:

➜ ~ jstack 239402020-01-29 13:08:15Full thread dump Java HotSpot(TM) 64-Bit Server VM (11.0.3+12-LTS mixed mode):..."main" #1 prio=5 os_prio=31 cpu=440.66ms elapsed=574.86s tid=0x00007ffdd9800000 nid=0x2803 waiting on condition [0x0000700003849000] java.lang.Thread.State: TIMED_WAITING (sleeping) at java.lang.Thread.sleep(java.base@11.0.3/Native Method) at java.lang.Thread.sleep(java.base@11.0.3/Thread.java:339) at java.util.concurrent.TimeUnit.sleep(java.base@11.0.3/TimeUnit.java:446) at org.geekbang.time.commonmistakes.troubleshootingtools.jdktool.CommonMistakesApplication.main(CommonMistakesApplication.java:41) at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(java.base@11.0.3/Native Method) at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(java.base@11.0.3/NativeMethodAccessorImpl.java:62) at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(java.base@11.0.3/DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(java.base@11.0.3/Method.java:566) at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48) at org.springframework.boot.loader.Launcher.launch(Launcher.java:87) at org.springframework.boot.loader.Launcher.launch(Launcher.java:51) at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:52)"Thread-1" #13 prio=5 os_prio=31 cpu=17851.77ms elapsed=574.41s tid=0x00007ffdda029000 nid=0x9803 waiting on condition [0x000070000539d000] java.lang.Thread.State: TIMED_WAITING (sleeping) at java.lang.Thread.sleep(java.base@11.0.3/Native Method) at java.lang.Thread.sleep(java.base@11.0.3/Thread.java:339) at java.util.concurrent.TimeUnit.sleep(java.base@11.0.3/TimeUnit.java:446) at org.geekbang.time.commonmistakes.troubleshootingtools.jdktool.CommonMistakesApplication.lambda$null$1(CommonMistakesApplication.java:33) at org.geekbang.time.commonmistakes.troubleshootingtools.jdktool.CommonMistakesApplication$$Lambda$41/0x00000008000a8c40.run(Unknown Source) at java.lang.Thread.run(java.base@11.0.3/Thread.java:834)...

爬行后可以用作类似fastthread ()这样的应用软件统计分析作法来统计分析寄存器子应用程序。

jcmd之后,我们来看一下 Java HotSpot 应用软件的 NMT 连续性。

通过 NMT,我们可以仔细观察细粒度缓存用作情况,设为 -XX:NativeMemoryTracking=summary/detail 可以带入 NMT 连续性,带入后可以用作 jcmd 作法检视 NMT 信息。

我们之后重启一次应用程序,这次加上 JVM 变量以 detail 方式为带入 NMT:

-Xms1g -Xmx1g -XX:ThreadStackSize=256k -XX:NativeMemoryTracking=detail

在这里,我们还增高了 -XX:ThreadStackSize 变量,并将其值设为为 256k,也就是期望把寄存器子应用程序设为为 256KB。我们通过 NMT 仔细观察一下设为是否尝试。

重启应用程序后拒绝执引如下 jcmd 请求,以概要型式输显现出 NMT 结果。可以看见,当前有 32 个寄存器,寄存器子应用程序总共保留了差不多 4GB 有数的缓存。我们说是配置寄存器子应用程序最大者 256KB 啊,为什么就会显现出现 4GB 这么肤浅的数字呢,到底哪里显现出了疑虑呢?

➜ ~ jcmd 24404 VM.native_memory summary24404:Native Memory Tracking:Total: reserved=6635310KB, committed=5337110KB- Java Heap (reserved=1048576KB, committed=1048576KB) (mmap: reserved=1048576KB, committed=1048576KB)- Class (reserved=1066233KB, committed=15097KB) (classes #902) (malloc=9465KB #908) (mmap: reserved=1056768KB, committed=5632KB)- Thread (reserved=4209797KB, committed=4209797KB) (thread #32) (stack: reserved=4209664KB, committed=4209664KB) (malloc=96KB #165) (arena=37KB #59)- Code (reserved=249823KB, committed=2759KB) (malloc=223KB #730) (mmap: reserved=249600KB, committed=2536KB)- GC (reserved=48700KB, committed=48700KB) (malloc=10384KB #135) (mmap: reserved=38316KB, committed=38316KB)- Compiler (reserved=186KB, committed=186KB) (malloc=56KB #105) (arena=131KB #7)- Internal (reserved=9693KB, committed=9693KB) (malloc=9661KB #2585) (mmap: reserved=32KB, committed=32KB)- Symbol (reserved=2021KB, committed=2021KB) (malloc=1182KB #334) (arena=839KB #1)- Native Memory Tracking (reserved=85KB, committed=85KB) (malloc=5KB #53) (tracking overhead=80KB)- Arena Chunk (reserved=196KB, committed=196KB) (malloc=196KB)

之后以 VM.native_memory detail 变量运引 jcmd:

jcmd 24404 VM.native_memory detail

可以看见,有 16 个可疑寄存器,每一个寄存器保留了 262144KB 缓存,也就是 256MB (通过图例红框可以看见,用作关键字 262144KB for Thread Stack from 搜索到了 16 个结果):

只不过,ThreadStackSize 变量的单位是 KB,所以我们如果要设为寄存器子应用程序 256KB,那么应该设为 256 而不是 256k。之后设为正确的变量后,用作 jcmd 最终的测试下:

除了运用于检视 NMT 外,jcmd 还有许多连续性。我们可以通过 help,看见它的所有连续性:

jcmd 24781 help

除了 jps、jinfo、jcmd、jstack、jstat、jconsole、jvisualvm 外,JDK 之中还有一些作法,你可以通过公开软件包检视明晰简述。

公开软件包:

徐州哪个医院治精神病好
上海眼科医院哪个最好
枣庄精神心理医院
肝癌晚期怎么办
风热感冒咳嗽黄痰用什么药
肝癌晚期还有治疗的必要吗
钇90
肝癌中晚期能活多久一般
相关阅读

投资者提问:贵公司矿山用雷管控制器研发进入什么阶段了?能否近期上市?消费市场前...

八卦 2025-10-28

投资者提问:盛公司矿山用桶内转换器共同开发进入什么阶段了?能否最近上市?市场前景如何?董秘却说晓程科技SZ300139:您好!感谢您的关注!电子桶内控制芯片正在飞行测试过程

3月高档车销量位居:奔驰再成“团宠”,奥迪不敌宝马

时尚 2025-10-28

文魏无羡乘联就会的年销量数据说明了,3下半年车市整体平庸并不乐观,不论是汽车、SUV还是MPV细分市场都面临较大的阻力,而这当然也就会让高级车年销量平庸不免风采。从乘

投资者提问:神州高铁如果月内继续亏损,股票是不是要被ST了?公司月内业绩预...

图片 2025-10-28

投资者提问:神州高铁如果今年继续亏蚀,普通股是不是要被ST了?母公司今年绩效预计如何呢?董秘回答神州高铁SZ000008:投资者您好!根据深交所普通股上市原则上,上市母公司

“币值”超高!《中国冰雪之夜》更多细节公布→

时尚 2025-10-28

据CCTV新闻客户端消息,4同月16日晚,由国家体育总局球类运动管理中心与中央广播电视电视台北京总站联合国际性的“中国人冰之夜”户外活动在首都体育馆举行。户外活动在场出炉了中国人冰眷顾公告牌,用

资本提问:你们和投资机构包括券商,基金是什么关系?与中小资本又是什么关...

影视 2025-10-28

按揭追问:你们和海外投资部门包括券商,基金是什么联系?与中小按揭又是什么联系?董秘讲出皓元医药SH688131:敬佩的按揭您好,新公司欢迎任何按揭来新公司实地调查交流,无论

友情链接