JVM调优No1

在这里插入图片描述

前言

说到jvm调优,之前分享了如何使用MAT工具分析堆内存溢出,正是这样,按照以往的原则,不能就这样浅尝辄止,并且之前面试的时候经常被问到,jvm这方面的知识,于是网上搜了很多资料来学习,总结了下一些简单的命令,如果写的不好或者有误的地方,请大家多多指教,评论区请及时指出,我也立即响应。

-XX参数

-XX参数也是非标准参数,主要用于jvm的调优和debug操作。
-XX参数的使用有2种方式,一种是boolean类型,一种是非boolean类型:

  • boolean类型
    • 格式:-XX:[±]
    • 如:-XX:+DisableExplicitGC 表示禁用手动调用gc操作,也就是说调用 System.gc()无效
  • 非boolean类型
    • 格式:-XX:
    • 如:-XX:NewRatio=1 表示新生代和老年代的比值
[root@localhost test]# java -showversion -XX:+DisableExplicitGC Main
openjdk version "1.8.0_232"
OpenJDK Runtime Environment (build 1.8.0_232-b09)
OpenJDK 64-Bit Server VM (build 25.232-b09, mixed mode)

hello jvm

-Xms与-Xmx参数

-Xms与-Xmx分别是设置jvm的堆内存的初始大小和最大堆内存。

  • -Xmx2048m:等价于-XX:MaxHeapSize,设置JVM大堆内存为2048M。

  • -Xms512m:等价于-XX:InitialHeapSize,设置JVM初始堆内存为512M。

适当的调整jvm的内存大小,可以充分利用服务器资源,让程序跑的更快。

[root@localhost test]# java -Xms512m -Xmx2048m Main
hello jvm

查看jvm的运行参数

运行java命令时打印出运行参数

[root@localhost test]# java -XX:+PrintFlagsFinal -version
[Global flags]
     intx ActiveProcessorCount                      = -1                                  {product}
    uintx AdaptiveSizeDecrementScaleFactor          = 4                                   {product}
    uintx AdaptiveSizeMajorGCDecayTimeScale         = 10                                  {product}
    uintx AdaptiveSizePausePolicy                   = 0                                   {product}
    uintx AdaptiveSizePolicyCollectionCostMargin    = 50                                  {product}
    uintx AdaptiveSizePolicyInitializingSteps       = 20                                  {product}
    uintx AdaptiveSizePolicyOutputInterval          = 0                                   {product}

查看正在运行的java进程的参数

如果想要查看正在运行的jvm就需要借助于jinfo命令查看。
首先,启动一个tomcat用于测试,来观察下运行的jvm参数。

wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-7/v7.0.99/bin/apache-tomcat-7.0.99.tar.gz
tar -xzvf apache-tomcat-7.0.99.tar.gz
cd apache-tomcat-7.0.99
cd bin/
./startup.sh

在这里插入图片描述

jps命令

JVM Process Status Tool,显示指定系统内所有的HotSpot虚拟机进程。

jps [options] [hostid]

option参数

  • -l : 输出主类全名或jar路径
  • -q : 只输出LVMID
  • -m : 输出JVM启动时传递给main()的参数
  • -v : 输出JVM启动时显示指定的JVM参数

其中[option]、[hostid]参数也可以不写。

#通过jps 或者  jps ‐l 查看java进程 
[root@localhost bin]# jps -l
13618 org.apache.catalina.startup.Bootstrap
13693 sun.tools.jps.Jps

[root@localhost bin]# jinfo -flags 13618
Attaching to process ID 13618, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.232-b09
Non-default VM flags: -XX:CICompilerCount=2 -XX:InitialHeapSize=31457280 -XX:MaxHeapSize=482344960 -XX:MaxNewSize=160759808 -XX:MinHeapDeltaBytes=196608 -XX:NewSize=10485760 -XX:OldSize=20971520 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops
Command line:  -Djava.util.logging.config.file=/root/test/apache-tomcat-7.0.99/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -Dcatalina.base=/root/test/apache-tomcat-7.0.99 -Dcatalina.home=/root/test/apache-tomcat-7.0.99 -Djava.io.tmpdir=/root/test/apache-tomcat-7.0.99/temp

#查看某一参数的值,用法:jinfo ‐flag <参数名> <进程id> 
[root@localhost bin]# jinfo -flag MaxHeapSize 13618
-XX:MaxHeapSize=482344960

jstat

jstat(JVM statistics Monitoring)是用于监视虚拟机运行时状态信息的命令,它可以显示出虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。

jstat [option] LVMID [interval] [count]

参数

  • [option] : 操作参数
  • LVMID : 本地虚拟机进程ID
  • [interval] : 连续输出的时间间隔
  • [count] : 连续输出的次数

查看class加载统计

[root@localhost bin]# jps
13728 Jps
13618 Bootstrap
[root@localhost bin]# jstat -class 13618
Loaded  Bytes  Unloaded  Bytes     Time
  3066  6918.1        0     0.0       3.86

说明:

  • Loaded:加载class的数量
  • Bytes:所占用空间大小 Unloaded:未加载数量
  • Bytes:未加载占用空间
  • Time:时间

查看编译统计

[root@localhost bin]# jstat -compiler 13618
Compiled Failed Invalid   Time   FailedType FailedMethod
    2099      2       0     5.44          1 com/sun/org/apache/xerces/internal/parsers/AbstractDOMParser startElement

说明:

  • Compiled:编译数量。
  • Failed:失败数量
  • Invalid:不可用数量
  • Time:时间
  • FailedType:
  • 失败类型 FailedMethod:失败的方法

垃圾回收统计

[root@localhost bin]# jstat -gc 13618
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
1024.0 1024.0  0.0   1024.0  8448.0   7707.9   20936.0    13069.8   22704.0 22142.4 2304.0 2117.6     15    0.138   1      0.076    0.215

#也可以指定打印的间隔和次数,每1秒中打印一次,共打印5次 

[root@localhost bin]# jstat -gc 13618  1000 5
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
1024.0 1024.0  0.0   1024.0  8448.0   7802.6   20936.0    13069.8   22704.0 22142.4 2304.0 2117.6     15    0.138   1      0.076    0.215
1024.0 1024.0  0.0   1024.0  8448.0   7802.6   20936.0    13069.8   22704.0 22142.4 2304.0 2117.6     15    0.138   1      0.076    0.215
1024.0 1024.0  0.0   1024.0  8448.0   7802.6   20936.0    13069.8   22704.0 22142.4 2304.0 2117.6     15    0.138   1      0.076    0.215
1024.0 1024.0  0.0   1024.0  8448.0   7802.6   20936.0    13069.8   22704.0 22142.4 2304.0 2117.6     15    0.138   1      0.076    0.215
1024.0 1024.0  0.0   1024.0  8448.0   7802.6   20936.0    13069.8   22704.0 22142.4 2304.0 2117.6     15    0.138   1      0.076    0.215

C即Capacity 总容量,U即Used 已使用的容量

  • S0C : survivor0区的总容量
  • S1C : survivor1区的总容量
  • S0U : survivor0区已使用的容量
  • S1U : survivor1区已使用的容量
  • EC : Eden区的总容量
  • EU : Eden区已使用的容量
  • OC : Old区的总容量
  • OU : Old区已使用的容量
  • PC 当前perm的容量 (KB)
  • PU perm的使用 (KB)
  • YGC : 新生代垃圾回收次数
  • YGCT : 新生代垃圾回收时间
  • FGC : 老年代垃圾回收次数
  • FGCT : 老年代垃圾回收时间
  • GCT : 垃圾回收总消耗时间

jmap的使用以及内存溢出分析

前面通过jstat可以对jvm堆的内存进行统计分析,而jmap可以获取到更加详细的内容, 如:内存使用情况的汇总、对内存溢出的定位与分析。

命令格式

jmap [option] LVMID

option参数:

  • dump : 生成堆转储快照
  • finalizerinfo : 显示在F-Queue队列等待Finalizer线程执行finalizer方法的对象
  • heap : 显示Java堆详细信息
  • histo : 显示堆中对象的统计信息
  • permstat : to print permanent generation statistics
  • F : 当-dump没有响应时,强制生成dump快照

查看内存使用情况

[root@localhost bin]# jps -l
13174 org.apache.catalina.startup.Bootstrap
13212 sun.tools.jps.Jps
[root@localhost bin]# jmap -heap 13174
Attaching to process ID 13174, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.232-b09

using thread-local object allocation.
Mark Sweep Compact GC

Heap Configuration:  #堆内存配置信息 
   MinHeapFreeRatio         = 40
   MaxHeapFreeRatio         = 70
   MaxHeapSize              = 482344960 (460.0MB)
   NewSize                  = 10485760 (10.0MB)
   MaxNewSize               = 160759808 (153.3125MB)
   OldSize                  = 20971520 (20.0MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 0 (0.0MB)

Heap Usage:   # 堆内存的使用情况
New Generation (Eden + 1 Survivor Space): #年轻代
   capacity = 9437184 (9.0MB)
   used     = 7125520 (6.7954254150390625MB)
   free     = 2311664 (2.2045745849609375MB)
   75.50472683376736% used
Eden Space:
   capacity = 8388608 (8.0MB)
   used     = 6076952 (5.795433044433594MB)
   free     = 2311656 (2.2045669555664062MB)
   72.44291305541992% used
From Space:
   capacity = 1048576 (1.0MB)
   used     = 1048568 (0.9999923706054688MB)
   free     = 8 (7.62939453125E-6MB)
   99.99923706054688% used
To Space:
   capacity = 1048576 (1.0MB)
   used     = 0 (0.0MB)
   free     = 1048576 (1.0MB)
   0.0% used
tenured generation:  # 老年代
   capacity = 20971520 (20.0MB)
   used     = 12570176 (11.98785400390625MB)
   free     = 8401344 (8.01214599609375MB)
   59.93927001953125% used

13359 interned Strings occupying 1148672 bytes.

查看内存中对象数量及大小

#查看所有对象,包括活跃以及非活跃的 jmap ‐histo <pid> | more
#查看活跃对象 jmap ‐histo:live <pid> | more

[root@localhost bin]# jps -l
13235 sun.tools.jps.Jps
13174 org.apache.catalina.startup.Bootstrap
[root@localhost bin]# jmap -histo:live 13174 | more

 num     #instances         #bytes  class name
----------------------------------------------
   1:         26236        3667880  [C
   2:          1842        2354584  [B
   3:          2252         925464  [I
   4:         25374         608976  java.lang.String
   5:          5702         501776  java.lang.reflect.Method
   6:         15660         501120  java.util.HashMap$Node
   7:          5249         307992  [Ljava.lang.Object;
   8:          2595         293872  java.lang.Class
   9:           830         186184  [Ljava.util.HashMap$Node;
  10:          4669         149408  java.util.concurrent.ConcurrentHashMap$Node
  11:          5846         127496  [Ljava.lang.Class;
  12:          1946          77840  java.util.LinkedHashMap$Entry
  13:          1043          70344  [Ljava.lang.String;
  14:          1463          70224  java.util.HashMap
  15:          1351          64848  org.apache.tomcat.util.digester.CallMethodRule
  16:          2655          63720  java.util.ArrayList
  17:          1671          53472  com.sun.org.apache.xerces.internal.xni.QName
  18:          3264          52224  java.lang.Object
  19:            66          49728  [Ljava.util.concurrent.ConcurrentHashMap$Node;
  20:           335          45296  [Ljava.lang.reflect.Method;
  21:          1072          42880  java.lang.ref.Finalizer
  22:           866          41568  org.apache.tomcat.util.modeler.AttributeInfo
  23:          1109          35488  java.util.Hashtable$Entry
  24:           655          31440  java.util.concurrent.locks.ReentrantReadWriteLock$NonfairSync
  25:           376          27072  java.lang.reflect.Field
  26:           324          25920  java.lang.reflect.Constructor
  27:           344          24768  java.util.logging.Logger
  #对象说明 
  B  byte 
  C  char 
  D  double 
  F  float 
  I  int 
  J  long 
  Z  boolean 
  [  数组,如[I表示int[] 
  [L+类名 其他对象

将内存使用情况dump到文件

[root@localhost test]# jmap -dump:format=b,file=./dump.dat 13174
Dumping heap to /root/test/dump.dat ...
Heap dump file created
[root@localhost test]# ll
total 27672
drwxr-xr-x. 9 root root      220 Jan  3 23:22 apache-tomcat-7.0.99
-rw-r--r--. 1 root root  9587605 Dec 11 21:44 apache-tomcat-7.0.99.tar.gz
-rw-------. 1 root root 18737999 Jan  4 16:52 dump.dat
-rw-r--r--. 1 root root      433 Jan  3 23:23 Main.class
-rw-r--r--. 1 root root      135 Jan  3 23:23 Main.java

通过jhat对dump文件进行分析

[root@localhost test]# jhat -port 9999 ./dump.dat
Reading from ./dump.dat...
Dump file created Sat Jan 04 16:52:27 CST 2020
Snapshot read, resolving...
Resolving 168454 objects...
Chasing references, expect 33 dots.................................
Eliminating duplicate references.................................
Snapshot resolved.
Started HTTP server on port 9999
Server is ready.

访问:http://port:9999

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值