jvm调优工具介绍

jvm调优工具介绍jvm实战调优

大家好,又见面了,我是你们的朋友全栈君。

1.java自带的调优工具

1.1 JPS (JVM Process Status Tool),查看当前机器上所有JVM进程的状态和启动参数

命令格式:jps [options] [hostid]

我们可以通过“jps --help”来查看相关帮助。如下为允许使用的options:

1)-q:只列出JVM进程的id,不展示进程的其他信息。

Java代码

jps -q -v
26582
26586
26301
27983
2)-m:输出传递到main方法的参数列表。

3)-l:输出此启动此继承的main方法所在的全package路径、或者JAR的文件路径。

Java代码

jps -l
26582 org.apache.catalina.startup.Bootstrap
27991 sun.tools.jps.Jps
26586 org.jetbrains.jps.cmdline.Launcher
26301 org.jetbrains.plugins.scala.nailgun.NailgunRunner
4)-v:输出JVM进程的系统参数,其中包括-D参数和JAVA_OPTS相关参数。

Java代码

jps -v
18381 Bootstrap -Djava.util.logging.config.file=/opt/deploy/sample-tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Xms256m -Xmx256m -XX:NewSize=128m -XX:+DisableExplicitGC -Dlogs=/data/logs -Dcache=/opt/deploy/sample-tomcat/cache -verbose:gc -XX:+PrintGCDateStamps -XX:+PrintGCDetails -Xloggc:/opt/vipkid/homework/logs/gc.log -Djava.endorsed.dirs=/opt/tomcat/endorsed -Djava.io.tmpdir=/opt/deploy/sample-tomcat/temp
5)-V:输出那些通过flag文件传递给JVM的参数(-XX:Flags=)。

整体来说,jps跟linux的“ps”指令很像,从整体查看当前机器上所有的JVM进程

1.2 jinfo
查看一个JVM进程的全部配置信息,包括系统变量、加载的lib、JAVA_OPTS信息、JDK(JVM)的版本情况等。可以修改flag值
1.3 jstat JVM Statistics Monitoring tool,JVM统计数据监控工具,可以用来查看JVM中GC、类加载等信息。

命令格式:jstat [generalOptions | outputOptions vimd [interval [s|ms] [count]]]

generalOptions没有太大用,我们只需要知道使用“jstat -options”来查看可选参的列表,主要是outputOptions:

1)-class:有关classLoader的行为统计

Java代码

jstat -class 26582
Loaded Bytes Unloaded Bytes Time
13401 28013.1 381 574.4 23.57
loaded:已加载类的个数,bytes:已加载类的字节数,unloaded、bytes:已卸载类的个数和字节数,time:类加载和卸载耗时。

2)-compiler:统计Hotspot中JIT(just-in-time)编译器的行为。(比较少用)

3)-gc:堆GC的行为统计,通过此指令我们能了解heap各个区域的内存使用情况。

Java代码

jstat -gc 26582 2s 100
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
63488.0 10240.0 0.0 10080.0 520192.0 259699.6 1398272.0 1272911.1 92352.0 89826.6 9984.0 9458.4 1089 24.631 11 25.624 50.255
新生代,有三块:eden、survivor0、survivor1,其中EC、S0C、S1C分别表示上述三个区的compacity(KB),EU、S0U、S1U分表表示上述三个区的已使用空间。OC、OU表示救年老代的空间和使用量,PC、PU表示持久带的情况。YGC、YGCT分别表示新生代GC的次数和总时间,FGC、FGCT表示FULL GC的次数和总时间,GCT表示所有GC的总时间。

通常我们可以根据这些参数来观察,JVM内存分布、GC的情况,以便进行调优。(对于互联网系统,通常YGC与FGC相差数倍,即极少的FGC,但是通常YGC会几分钟就会执行一次)

4)-gccapacity:大体作用同-gc,也可以用来查看堆的各区域内存现状。

5)-gccause 展示内容同上,不过包含两个特殊的列“LGCC”、“GCC”,表示导致上次或者本次GC的原因,通常原因都是“内存分配失败”。

6)-gcnew:展示新生代的gc情况,同上。同类型指令还有-gcold。

7)-gcutil:全局的gc行为统计。基本上是上述几个gc指令的汇总。

我们可以使用jps找到jvm的进程ID,然后使用jstat分析特定ID的堆内存情况。

1.4 jmap JVM Memory Map,JVM内存图,通常可以用来查看当前JVM的内存中对象存活情况、跟踪对象创建过程等
1)-dump:[live,] format=b,file=:将JVM堆内存中对象(live表示只dump存活的)dump到执行的文件中,使用hprof格式,此后我们可以使用jhat工具来查看此文件。通常可以使用-dump来分析内存中对象个数和数据状态,比如跟踪某个对象实例的个数,数组的容量变化等。

2)-finalizerinfo:打印出等待finalization的对象信息。如果你的实例有重写终结方法的,可以通过此选项查看。

3)-heap:打印JVM的heap配置信息,比如堆大小、新生代(newSize)等等,以及GC的算法(打印结果的前几行)。这些信息当然也可以通过jstat、jinfo来查看。

Java代码

jmap -heap 26832
using thread-local object allocation.
Parallel GC with 2 thread(s)

Heap Configuration: MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100 MaxHeapSize =
536870912 (512.0MB) NewSize = 178782208
(170.5MB) MaxNewSize = 178782208 (170.5MB)
OldSize = 358088704 (341.5MB) NewRatio
= 2 SurvivorRatio = 8 MetaspaceSize = 21807104 (20.796875MB) CompressedClassSpaceSize = 1073741824
(1024.0MB) MaxMetaspaceSize = 17592186044415 MB
G1HeapRegionSize = 0 (0.0MB) Heap Usage: PS Young
Generation Eden Space: capacity = 102760448 (98.0MB) used
= 54807000 (52.268028259277344MB) free = 47953448 (45.731971740722656MB)
53.33472271354831% used From Space: capacity = 39321600 (37.5MB) used = 7370120 (7.028694152832031MB) free =
31951480 (30.47130584716797MB)
18.743184407552082% used To Space: capacity = 36700160 (35.0MB) used = 0 (0.0MB) free = 36700160 (35.0MB)
0.0% used PS Old Generation capacity = 358088704 (341.5MB) used = 46609072 (44.44987487792969MB) free = 311479632
(297.0501251220703MB)
13.016068778310304% used

4)-histo[:live]:根据每个java class类型,打印出相应类的实例个数、内存占用空间(bytes)的直方图,live选项表示只打印存活的对象个数(和占用空间);这个指令可以帮助我们关注JVM中某种class的实例个数和占用内存量,对分析内存消耗、OOM排查有很大帮助。

Java代码

jmap -histo:live 30402

num #instances #bytes class name

1: 129824 15193328 [C 2: 7631
13005088 [B 3: 127333 3055992 java.lang.String
4: 22984 1308592 [Ljava.lang.Object; 5:
14557 1281016 java.lang.reflect.Method 6: 39153
1252896 java.util.HashMap N o d e 7 : 8843997240 j a v a . l a n g . C l a s s 8 : 7260982096 [ L j a v a . u t i l . H a s h M a p Node 7: 8843 997240 java.lang.Class 8: 7260 982096 [Ljava.util.HashMap Node7:8843997240java.lang.Class8:7260982096[Ljava.util.HashMapNode;

1.5jvisualvm
监控内存泄露,跟踪垃圾回收,执行时内存、cpu分析,线程分析…
怎么远程监控服务可以参考
jvisualvm使用教程
1.6jstackstack trace,用于打印java线程的调用栈(执行栈,瞬时),包括class全名、方法名、行号等,如果指定-m还会打印native帧;不过对于实际工作情况,我们通常用于追踪多线程任务调度过程、对象lock(或者死锁)、并发同步阻塞、IO线程执行状态等;比如排查某个线程为何wait(假死,阻塞等)

1)-l:打印出当前JVM所有的线程状态和执行栈,包括locks(java.util.concurrent)。

Java代码
“http-nio-8080-exec-7” #78 daemon prio=5 os_prio=31 tid=0x00007f876f957000 nid=0x13403 waiting on condition [0x00007000043e8000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
– parking to wait for <0x0000000740994e50> (a java.util.concurrent.locks.AbstractQueuedSynchronizer C o n d i t i o n O b j e c t ) a t j a v a . u t i l . c o n c u r r e n t . l o c k s . L o c k S u p p o r t . p a r k ( L o c k S u p p o r t . j a v a : 175 ) a t j a v a . u t i l . c o n c u r r e n t . l o c k s . A b s t r a c t Q u e u e d S y n c h r o n i z e r ConditionObject) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) at java.util.concurrent.locks.AbstractQueuedSynchronizer ConditionObject)atjava.util.concurrent.locks.LockSupport.park(LockSupport.java:175)atjava.util.concurrent.locks.AbstractQueuedSynchronizerConditionObject.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:1067)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
at java.util.concurrent.ThreadPoolExecutor W o r k e r . r u n ( T h r e a d P o o l E x e c u t o r . j a v a : 617 ) a t o r g . a p a c h e . t o m c a t . u t i l . t h r e a d s . T a s k T h r e a d Worker.run(ThreadPoolExecutor.java:617) at org.apache.tomcat.util.threads.TaskThread Worker.run(ThreadPoolExecutor.java:617)atorg.apache.tomcat.util.threads.TaskThreadWrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)

Locked ownable synchronizers:
– None

如果有死锁时,大概的错误信息如下:

Java代码
Found one Java-level deadlock:

“pool-1-thread-2”:
waiting to lock monitor 0x0237ada4 (object 0x272200e8, a java.lang.Object),
which is held by “pool-1-thread-1”
“pool-1-thread-1”:
waiting to lock monitor 0x0237aa64 (object 0x272200f0, a java.lang.Object),
which is held by “pool-1-thread-2”

2)-m:混合模式,可以打印native帧。 

2.阿里巴巴调优神器arthas(阿尔萨斯)
官方网站:
https://alibaba.github.io/arthas/index.html
根据官方介绍阿尔萨斯可以解决一下问题

当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:

这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?

我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?

遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?

线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!

是否有一个全局视角来查看系统的运行状况?

有什么办法可以监控到JVM的实时运行状态?

怎么快速定位应用的热点,生成火焰图?

Arthas支持JDK 6+,支持Linux/Mac/Winodws,采用命令行交互模式,同时提供丰富的 Tab

下载安装使用可以参考官方网站或者通过一下博客进行详细学习
https://www.cnblogs.com/testfan2019/p/11038791.html

3最后介绍一下其他调优的工具

JProfiler ,NetBeans profiler等
参考一下博文
https://segmentfault.com/a/1190000003940167

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/141626.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python正则匹配中文或数字_Python匹配中文的正则表达式

    python正则匹配中文或数字_Python匹配中文的正则表达式正则表达式并不是Python的一部分。正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分强大。得益于这一点,在提供了正则表达式的语言里,正则表达式的语法都是一样的,区别只在于不同的编程语言实现支持的语法数量不同;但不用担心,不被支持的语法通常是不常用的部分。Python正则表达式简介正则表达式是一个特殊的字符序列,它能帮助你方…

    2022年7月25日
    13
  • js取数组截取

    js取数组截取splice()会删除选定的数组,slice()只会进行选定,pop选定最后一个元素删除并返回最后一个元素的值,length函数判断数组的长度,使用slice选取单个值的时候记得返回的是一个数组类型。constarr=[1,2,7,2,6,0,3,1,5,7,8,9,45,12,34,0,56,12,2]//slice()方法constsliceArr…

    2022年5月2日
    62
  • 大数据开发主要做什么?

    大数据开发主要做什么?写在前面本文隶属于专栏《100个问题搞定大数据理论体系》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和文献引用请见100个问题搞定大数据理论体系解答一个大数据平台架构通常如图所示,大数据开发涵盖了图中从下到上各层的实现,其中主要的部分是采集层、储存层、计算层、模型层和接口层,核心部分是储存层和计算层。各层中功能模块的技术实现会根据实际业务场景不同而有所变化,但仍然是围绕着储存数据和数值计算这两大核心功能来进行的。因此,大数据开发的作用主要集中在以

    2022年6月4日
    41
  • 怎么监控mysql数据变化_mysql数据库数据变化实时监控

    怎么监控mysql数据变化_mysql数据库数据变化实时监控对于二次开发来说,很大一部分就找找文件和找数据库的变化情况对于数据库变化。还没有发现比较好用的监控数据库变化监控软件。今天,我就给大家介绍一个如何使用mysql自带的功能监控数据库变化1、打开数据库配置文件my.ini(一般在数据库安装目录)(D:\MYSQL)2、在数据库的最后一行添加log=log.txt代码3、重启mysql数据库4、去数据库数据目录我的是(D:\MYSQL\dat…

    2022年6月1日
    22
  • wxpython-wxpython教程

    wxpython-wxpython教程wxPython是一个Python包装wxWidgets(这是用C++编写),一个流行的跨平台GUI工具包。由RobinDunn以及HarriPasanen开发,wxPython是作为一个Python扩展模块。就像wxWidgets,wxPython也是一个免费的软件。它可以从官方网站下载:http://wxpython.org.在本网站上可下载wxPython对应操作系统平台二进…

    2022年5月11日
    24
  • 简述struts2拦截器的作用_拦截器什么时候被调用

    简述struts2拦截器的作用_拦截器什么时候被调用如何使用struts2拦截器,或者自定义拦截器。特别注意,在使用拦截器的时候,在Action里面必须最后一定要引用struts2自带的拦截器缺省堆栈defaultStack,如下(这里我是引用了struts2自带的checkbox拦截器): 0(必须加,否则出错)也可以改为对全局Action设置自己需要的拦截器,如下:在struts.xml里面定义全局的配置设

    2022年10月6日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号