JDK 自带调优JVM工具

JDK JRE JVM 的关系

JAVA 代码是如何执行的

 

 

Heap Dump 获取方式

1. 使用 jmap 命令生成 dump 文件

jmap -dump:live,format=b,file=d:\dump\heap.hprof <pid>

2. 使用 jcmd 命令生成 dump 文件

jcmd <pid> GC.heap_dump d:\dump\heap.hprof

3. 使用 JVM 参数获取 dump 文件

  • 1. -XX:+HeapDumpOnOutOfMemoryError
    当OutOfMemoryError发生时自动生成 Heap Dump 文件。

这可是一个非常有用的参数,因为当你需要分析Java内存使用情况时,往往是在OOM(OutOfMemoryError)发生时。

  • 2. -XX:+HeapDumpBeforeFullGC
    当 JVM 执行 FullGC 前执行 dump。
  • 3. -XX:+HeapDumpAfterFullGC
    当 JVM 执行 FullGC 后执行 dump。
  • 4. -XX:+HeapDumpOnCtrlBreak
    交互式获取dump。在控制台按下快捷键Ctrl + Break时,JVM就会转存一下堆快照。
  • 5. -XX:HeapDumpPath=d:\test.hprof
    指定 dump 文件存储路径。

注意:JVM 生成 Heap Dump 的时候,虚拟机是暂停一切服务的。如果是线上系统执行 Heap Dump 时需要注意。

4. 使用其它工具获取dump文件

分析 Heap Dump 的工具都可以获取 Heap Dump 文件。

比如:jdk 自带的工具 jvisualvm。

其它工具:Eclipse memory analyzer(jmat)、JProfiler 等。

 

实例

image.png

1.设置栈大小 2-3.设置堆大小 4.当OutOfMemoryError发生时自动生成 Heap Dump 文件 5.指定文件生成位置

1.效果

image.png

2.采用jdk VisualVM 自带工具 打开

image.png

 

基础故障处理工具

jps:虚拟机的进程状况工具

功能:列出正在运行的虚拟机进程,并显示虚拟机执行的主类(Main Class所在的类),以及这些进程的LVMID,这些LVMID与操作系统的进程ID(PID)是一致的

 

-q:仅输LVMID,省略主类的名称 

-m:输出虚拟机进程启动时传递给main()函数的参数

-l:输出主类的全名,如果执行的时jar包,输出jar包路劲

-v:输出jvm参数 

 

image.png

image.png

 

jstat:虚拟机统计信息监视工具

功能:用于监视虚拟机各种运行状态信息的命令行工具。他可以显示本地多或远程虚拟机进程中类加载,内存,垃圾收集,即时编译等运行时数据。

 1. jstat -gc pid

            可以显示gc的信息,查看gc的次数,及时间。

            其中最后五项,分别是young gc的次数,young gc的时间,full gc的次数,full gc的时间,gc的总时间。

2.jstat -gccapacity pid

            可以显示,VM内存中三代(young,old,perm)对象的使用和占用大小,

            如:PGCMN显示的是最小perm的内存使用量,PGCMX显示的是perm的内存最大使用量,

            PGC是当前新生成的perm内存占用量,PC是但前perm内存占用量。

            其他的可以根据这个类推, OC是old内纯的占用量。

3.jstat -gcutil pid

            统计gc信息统计。

4.jstat -gcnew pid

           年轻代对象的信息。

5.jstat -gcnewcapacity pid

           年轻代对象的信息及其占用量。

6.jstat -gcold pid

          old代对象的信息。

7.stat -gcoldcapacity pid

          old代对象的信息及其占用量。

8.jstat -gcpermcapacity pid

          perm对象的信息及其占用量。

9.jstat -class pid

          显示加载class的数量,及所占空间等信息。

10.jstat -compiler pid

          显示VM实时编译的数量等信息。

11.stat -printcompilation pid

          当前VM执行的信息。

一些术语的中文解释:

S0C:年轻代中第一个survivor(幸存区)的容量 (字节)

S1C:年轻代中第二个survivor(幸存区)的容量 (字节)

S0U:年轻代中第一个survivor(幸存区)目前已使用空间 (字节)

S1U:年轻代中第二个survivor(幸存区)目前已使用空间 (字节)

EC:年轻代中Eden(伊甸园)的容量 (字节)

EU:年轻代中Eden(伊甸园)目前已使用空间 (字节)

OC:Old代的容量 (字节)

OU:Old代目前已使用空间 (字节)

PC:Perm(持久代)的容量 (字节)

PU:Perm(持久代)目前已使用空间 (字节)

YGC:从应用程序启动到采样时年轻代中gc次数

YGCT:从应用程序启动到采样时年轻代中gc所用时间(s)

FGC:从应用程序启动到采样时old代(全gc)gc次数

FGCT:从应用程序启动到采样时old代(全gc)gc所用时间(s)

GCT:从应用程序启动到采样时gc用的总时间(s)

NGCMN:年轻代(young)中初始化(最小)的大小 (字节)

NGCMX:年轻代(young)的最大容量 (字节)

NGC:年轻代(young)中当前的容量 (字节)

OGCMN:old代中初始化(最小)的大小 (字节) 

OGCMX:old代的最大容量 (字节)

OGC:old代当前新生成的容量 (字节)

PGCMN:perm代中初始化(最小)的大小 (字节) 

PGCMX:perm代的最大容量 (字节)   

PGC:perm代当前新生成的容量 (字节)

S0:年轻代中第一个survivor(幸存区)已使用的占当前容量百分比

S1:年轻代中第二个survivor(幸存区)已使用的占当前容量百分比

E:年轻代中Eden(伊甸园)已使用的占当前容量百分比

O:old代已使用的占当前容量百分比

P:perm代已使用的占当前容量百分比

S0CMX:年轻代中第一个survivor(幸存区)的最大容量 (字节)

S1CMX :年轻代中第二个survivor(幸存区)的最大容量 (字节)

ECMX:年轻代中Eden(伊甸园)的最大容量 (字节)

DSS:当前需要survivor(幸存区)的容量 (字节)(Eden区已满)

TT: 持有次数限制

MTT : 最大持有次数限制

image.png

image.png

jinfo:java配置信息工具

功能:实时查看和调整虚拟机各项参数,只能调整在运行期间可写的虚拟机参数值

 

查看系统参数:

jinfo -sysflags 72956

虚拟机的参数可以通过这个命令查看:

java -XX:+PrintFlagsFinal -version | grep manageable

除了通过启动脚本可以设置参数,PrintGC 默认是打开的,因此我们只需要打开 PrintGCDetails 参数。

jinfo -flag +PrintGC 72956
jinfo -flag +PrintGCDetails 72956

关闭 GC 日志的话同理:

jinfo -flag -PrintGC 72956
jinfo -flag -PrintGCDetails 72956

查看是否开启 GC 日志的打印:

jinfo -flag PrintGC 72956
jinfo -flag PrintGCDetails 72956

 

jmap:java内存映像工具

功能:用于生成堆转储快照(heapdump),还可以查询finalize执行队列,java堆和方法区的详细信息,如空间使用率,当前使用那种收集器等。

 

<no option> 如果使用不带选项参数的jmap打印共享对象映射,将会打印目标虚拟机中加载的每个共享对象的起始地址、映射大小以及共享对象文件的路径全称。这与Solaris的pmap工具比较相似。
-dump:[live,]format=b,file=<filename> 使用hprof二进制形式,输出jvm的heap内容到文件, live子选项是可选的,假如指定live选项,那么只输出活的对象到文件. 
-finalizerinfo 打印正等候回收的对象的信息.
-heap 打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情况.
-histo[:live] 打印每个class的实例数目,内存占用,类全名信息. VM的内部类名字开头会加上前缀”*”. 如果live子参数加上后,只统计活的

 

 

Microsoft Windows [版本 10.0.17134.1726]

(c) 2018 Microsoft Corporation。保留所有权利。

C:\Users\Administrator>jps -l

42080

80448 sun.tools.jps.Jps

40412 org.jetbrains.jps.cmdline.Launcher

72956 com.well.studio.MainApplication

C:\Users\Administrator>jmap -heap 72956

Attaching to process ID 72956, please wait...

Debugger attached successfully.

Server compiler detected.

JVM version is 25.181-b13

using thread-local object allocation.

Parallel GC with 4 thread(s)

Heap Configuration:  ##堆配置情况

  MinHeapFreeRatio         = 0 ##最小堆使用比例

  MaxHeapFreeRatio         = 100 ##最大堆可用比例

  MaxHeapSize              = 1816133632 (1732.0MB) ##最大堆空间大小

  NewSize                  = 38273024 (36.5MB) ##新生代分配大小

  MaxNewSize               = 605028352 (577.0MB) ##最大可新生代分配大小

  OldSize                  = 77070336 (73.5MB) ##老生代大小

  NewRatio                 = 2 ##新生代比例

  SurvivorRatio            = 8 ##新生代与suvivor的比例

  MetaspaceSize            = 21807104 (20.796875MB) ##Metaspace扩容时触发FullGC的初始化阈值

  CompressedClassSpaceSize = 1073741824 (1024.0MB)

  MaxMetaspaceSize         = 17592186044415 MB

  G1HeapRegionSize         = 0 (0.0MB)

Heap Usage: ##堆使用情况

PS Young Generation

Eden Space:  ##新生代(伊甸区)

  capacity = 144703488 (138.0MB)

  used     = 124553120 (118.78311157226562MB)

  free     = 20150368 (19.216888427734375MB)

  86.07471853062727% used

From Space: ##survior1区

  capacity = 14155776 (13.5MB)

  used     = 10404288 (9.92230224609375MB)

  free     = 3751488 (3.57769775390625MB)

  73.49853515625% used

To Space: ##survior2 区

  capacity = 14155776 (13.5MB)

  used     = 0 (0.0MB)

  free     = 14155776 (13.5MB)

  0.0% used

PS Old Generation ##老生代使用情况

  capacity = 83886080 (80.0MB)

  used     = 20003576 (19.07689666748047MB)

  free     = 63882504 (60.92310333251953MB)

  23.846120834350586% used

21710 interned Strings occupying 2732136 bytes.

C:\Users\Administrator>

 

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

功能:搭配jmap时用,解析lmap生成的dump文件,其内置了http/web服务器,可在浏览器查看,但功能较为简单,而且一般也不会早期服务器去解析dump文件,所以用VVM等工具会好很多!

 

jstack:java堆栈跟踪工具

功能:用于生成虚拟机当前时刻的线程快照(threaddump/javacore),线程快照就是当前虚拟机每一条线程则正在执行的方法堆栈集合,生成目的为定位线程出现长时间卡顿的与原因,如线程间死锁,死循环,请求外部资源导致的长时间挂起等。

jdk 5 以后 ,java.lang.Thread类新增 getAllStackTraces()方法用于获取虚拟机种所有线程的StackTraceElement对象。使用这个方法通过一些代码封装就可以完成Jstack的大部分功能。

-F 当’jstack [-l] pid’没有相应的时候强制打印栈信息,如果直接jstack无响应时,用于强制jstack,一般情况不需要使用

-l 长列表. 打印关于锁的附加信息,例如属于java.util.concurrent的ownable synchronizers列表,会使得JVM停顿得长久得多

(可能会差很多倍,比如普通的jstack可能几毫秒和一次GC没区别,加了-l 就是近一秒的时间),-l 建议不要用。一般情况不需要使用

-m 打印java和native c/c++ 框架的所有栈信息.可以打印JVM的堆栈,显示上Native的栈帧,一般应用排查不需要使用

线程状态

想要通过jstack命令来分析线程的情况的话,首先要知道线程都有哪些状态,下面这些状态是我们使用jstack命令查看线程堆栈信息时可能会看到的线程的几种状态:

NEW,未启动的。不会出现在Dump中。

RUNNABLE,在虚拟机内执行的。

BLOCKED,受阻塞并等待监视器锁。

WATING,无限期等待另一个线程执行特定操作。

TIMED_WATING,有时限的等待另一个线程的特定操作。

TERMINATED,已退出的。

image.png

Jhsdb:基于服务性代理的调试工具

功能:相当于前几个汇总 , 但jdk9 才正式提供

后续再补

image.png

Jconsole:java监视与管理控制台

功能:Jconsole (Java Monitoring and Management Console),一种基于JMX的可视化监视、管理工具,可以跨服务管理,对远程虚拟机进行监控。

 

image.png

image.png

image.png

image.png

image.png

ManageBean

image.png

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值