jvm優化命令、工具案例

jps查詢出所有的java運行程序

C:\Users>jps
14624 Jps
17600 GgUserApplication
20752 RemoteMavenServer
10616
8652 Launcher

查詢java運行的初始值:jinfo -flags 17600

java系統參數:jinfo -sysprops 17600

jstat
類加載統計:

jstat -class 17600

C:\Users>jstat -class 17600
Loaded  Bytes  Unloaded  Bytes     Time
 11313 20765.3        6     9.4      12.17

Loaded:加載class的數量

Bytes:所佔用空間大小

Unloaded:未加載數量

Bytes:未加載佔用空間

Time:時間

統計垃圾回收

jstat -gc 17600

C:\Users>jstat -gc 17600
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
22528.0 23040.0  0.0    0.0   492544.0 52825.3   215552.0   49778.0   59096.0 56602.6 7936.0 7511.8     11    0.150   3      0.366    0.516

S0C:第一個倖存區的大小

S1C:第二個倖存區的大小

S0U:第一個倖存區的使用大小

S1U:第二個倖存區的使用大小

EC:伊甸園區的大小

EU:伊甸園區的使用大小

OC:老年代大小

OU:老年代使用大小

MC:方法區大小(元空間)

MU:方法區使用大小

CCSC:壓縮類空間大小

CCSU:壓縮類空間使用大小

YGC:年輕代垃圾回收次數

YGCT:年輕代垃圾回收消耗時間

FGC:老年代垃圾回收次數

FGCT:老年代垃圾回收消耗時間

GCT:垃圾回收消耗總時間

堆內存統計

jstat -gccapacity 17600

C:\Users>jstat -gccapacity 17600
 NGCMN    NGCMX     NGC     S0C   S1C       EC      OGCMN      OGCMX       OGC         OC       MCMN     MCMX      MC     CCSMN    CCSMX     CCSC    YGC    FGC
 87040.0 1394688.0 692736.0 22528.0 23040.0 492544.0   175104.0  2789376.0   215552.0   215552.0      0.0 1099776.0  59096.0      0.0 1048576.0   7936.0     11     3

NGCMN:新生代最小容量

NGCMX:新生代最大容量

NGC:當前新生代容量

S0C:第一個倖存區大小

S1C:第二個倖存區的大小

EC:伊甸園區的大小

OGCMN:老年代最小容量

OGCMX:老年代最大容量

OGC:當前老年代大小

OC:當前老年代大小

MCMN:最小元數據容量

MCMX:最大元數據容量

MC:當前元數據空間大小

CCSMN:最小壓縮類空間大小

CCSMX:最大壓縮類空間大小

CCSC:當前壓縮類空間大小

YGC:年輕代gc次數

FGC:老年代GC次數

新生代垃圾回收統計

jstat -gcnew 17600

C:\Users>jstat -gcnew 17600
 S0C    S1C    S0U    S1U   TT MTT  DSS      EC       EU     YGC     YGCT
22528.0 23040.0    0.0    0.0  1  15 22528.0 492544.0  52825.3     11    0.150

S0C:第一個倖存區的大小

S1C:第二個倖存區的大小

S0U:第一個倖存區的使用大小

S1U:第二個倖存區的使用大小

TT:對象在新生代存活的次數

MTT:對象在新生代存活的最大次數

DSS:期望的倖存區大小

EC:伊甸園區的大小

EU:伊甸園區的使用大小

YGC:年輕代垃圾回收次數

YGCT:年輕代垃圾回收消耗時間

新生代內存統計

jstat -gcnewcapacity 17600

C:\Users>jstat -gcnewcapacity 17600
  NGCMN      NGCMX       NGC      S0CMX     S0C     S1CMX     S1C       ECMX        EC      YGC   FGC
   87040.0  1394688.0   692736.0 464896.0  22528.0 464896.0  23040.0  1393664.0   492544.0    11     3

NGCMN:新生代最小容量

NGCMX:新生代最大容量

NGC:當前新生代容量

S0CMX:最大幸存1區大小

S0C:當前倖存1區大小

S1CMX:最大幸存2區大小

S1C:當前倖存2區大小

ECMX:最大伊甸園區大小

EC:當前伊甸園區大小

YGC:年輕代垃圾回收次數

FGC:老年代回收次數

老年代垃圾回收統計

jstat -gcold 17600

   MC       MU      CCSC     CCSU       OC          OU       YGC    FGC    FGCT     GCT
 59096.0  56602.6   7936.0   7511.8    215552.0     49778.0     11     3    0.366    0.516

MC:方法區大小

MU:方法區使用大小

CCSC:壓縮類空間大小

CCSU:壓縮類空間使用大小

OC:老年代大小

OU:老年代使用大小

YGC:年輕代垃圾回收次數

FGC:老年代垃圾回收次數

FGCT:老年代垃圾回收消耗時間

GCT:垃圾回收消耗總時間

老年代內存統計

jstat -gcoldcapacity 17600


C:\Users>jstat -gcoldcapacity 17600
   OGCMN       OGCMX        OGC         OC       YGC   FGC    FGCT     GCT
   175104.0   2789376.0    215552.0    215552.0    11     3    0.366    0.516

OGCMN:老年代最小容量

OGCMX:老年代最大容量

OGC:當前老年代大小

OC:老年代大小

YGC:年輕代垃圾回收次數

FGC:老年代垃圾回收次數

FGCT:老年代垃圾回收消耗時間

GCT:垃圾回收消耗總時間

元數據空間統計

jstat -gcmetacapacity 17600

C:\Users>jstat -gcmetacapacity 17600
   MCMN       MCMX        MC       CCSMN      CCSMX       CCSC     YGC   FGC    FGCT     GCT
       0.0  1099776.0    59096.0        0.0  1048576.0     7936.0    11     3    0.366    0.516

MCMN:最小元數據容量

MCMX:最大元數據容量

MC:當前元數據空間大小

CCSMN:最小壓縮類空間大小

CCSMX:最大壓縮類空間大小

CCSC:當前壓縮類空間大小

YGC:年輕代垃圾回收次數

FGC:老年代垃圾回收次數

FGCT:老年代垃圾回收消耗時間

GCT:垃圾回收消耗總時間

jstat -gcutil 17600

C:\Users\yangxinlei>jstat -gcutil 17600
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
  0.00   0.00  10.81  23.09  95.78  94.65     11    0.150     3    0.366    0.516

S0:倖存1區當前使用比例

S1:倖存2區當前使用比例

E:伊甸園區使用比例

O:老年代使用比例

M:元數據區使用比例

CCS:壓縮使用比例

YGC:年輕代垃圾回收次數

FGC:老年代垃圾回收次數

FGCT:老年代垃圾回收消耗時間

GCT:垃圾回收消耗總時間

jmap查看內容信息

查看某個進程的內存佔用大小

jmap -histo 17600 > ./log.txt

文件內容

num     #instances         #bytes  class name
----------------------------------------------
   1:          5623       47525656  [I
   2:        126740       19063304  [C
   3:         25990        7878072  [B
   4:         40695        3581160  java.lang.reflect.Method
   5:        110797        2659128  java.lang.String
   6:         51806        1657792  java.util.concurrent.ConcurrentHashMap$Node
   7:         12129        1349520  java.lang.Class
   8:         22399        1125168  [Ljava.lang.Object;
   9:         15912        1096160  [Ljava.util.HashMap$Node;
  10:         33217        1062944  java.util.HashMap$Node
  11:         31694        1014208  java.lang.ref.WeakReference
  12:         24426         977040  java.util.LinkedHashMap$Entry
  13:         15264         732672  org.aspectj.weaver.reflect.ShadowMatchImpl
  14:         12794         716464  java.util.LinkedHashMap
  15:         31910         711512  [Ljava.lang.Class;
  16:          7152         514944  java.lang.reflect.Field
  17:         19271         492992  [Ljava.lang.String;
  18:         12247         489880  java.lang.ref.SoftReference
  19:         15264         488448  org.aspectj.weaver.patterns.ExposedState
  20:           462         466384  [Ljava.util.concurrent.ConcurrentHashMap$Node;
  21:         17546         421104  java.util.ArrayList
  22:          8773         421104  java.util.HashMap
  23:          6960         389760  java.beans.MethodDescriptor
  24:         13900         333600  java.beans.MethodRef
  25:         20000         320000  java.lang.Object
  26:          5424         260352  org.springframework.core.ResolvableType
  27:          6464         258560  org.springframework.util.ConcurrentReferenceHashMap$Segment
  28:          7534         241088  java.util.concurrent.locks.ReentrantLock$NonfairSync
  29:          3004         240320  java.lang.reflect.Constructor
  30:          5922         236880  java.util.WeakHashMap$Entry
  31:          7240         231680  java.lang.ref.ReferenceQueue
  32:          3384         221488  [Ljava.lang.reflect.Method;
  33:          6185         197920  java.util.Hashtable$Entry
  34:          6608         187456  [Lorg.springframework.util.ConcurrentReferenceHashMap$Reference;
  35:          1694         162624  org.springframework.beans.GenericTypeAwarePropertyDescriptor
  36:          6464         155136  org.springframework.util.ConcurrentReferenceHashMap$ReferenceManager
  37:          4576         146432  java.util.ArrayList$Itr
  38:          2604         145824  java.lang.Class$ReflectionData
  39:          1894         136368  org.springframework.core.annotation.AnnotationAttributes
  40:          5466         131184  org.springframework.core.MethodClassKey
  41:          5446         130704  java.util.jar.Attributes$Name
  42:          5362         121544  [Ljava.lang.reflect.Type;
  43:          2941         117640  java.lang.ref.Finalizer
  44:          1613         116136  java.beans.PropertyDescriptor
  45:          7243         115888  java.lang.ref.ReferenceQueue$Lock
  46:          1788         114432  org.springframework.core.MethodParameter
  47:          2741         109640  java.util.TreeMap$Entry
  48:          2200         105600  org.springframework.util.ConcurrentReferenceHashMap$SoftEntryReference
  49:          2554         102160  java.util.HashMap$KeyIterator
  50:          4172         100128  sun.reflect.generics.tree.SimpleClassTypeSignature
  51:          4156          99744  java.util.LinkedList$Node
  52:          1493          95552  java.net.URL
  53:          2836          90752  java.util.LinkedList
  54:          1253          85384  [S
  55:          1260          80640  com.mysql.jdbc.ConnectionPropertiesImpl$BooleanConnectionProperty
  56:           570          79680  [Ljava.util.WeakHashMap$Entry;
  57:          4172          78456  [Lsun.reflect.generics.tree.TypeArgument;
  58:           401          77296  [Ljava.util.Hashtable$Entry;
  59:          1265          70840  java.util.concurrent.ConcurrentHashMap$KeyIterator
  60:          4343          69488  java.util.LinkedHashSet
  61:          2854          68496  sun.reflect.annotation.AnnotationInvocationHandler
  62:          1159          64904  java.lang.invoke.MemberName
  63:          3911          62576  sun.reflect.generics.tree.ClassTypeSignature
  64:          3797          60752  java.util.jar.Attributes
  65:          2518          60432  java.util.Collections$UnmodifiableCollection$1
  66:          3738          59808  java.util.HashMap$EntrySet
  67:           982          54992  java.util.zip.ZipFile$ZipFileInputStream
  68:           977          54712  java.util.zip.ZipFile$ZipFileInflaterInputStream
  69:           946          52976  java.lang.Package
  70:           314          52752  org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader$ConfigurationClassBeanDefinition
  71:          2156          51744  org.springframework.util.ConcurrentReferenceHashMap$Entry
  72:          3078          49248  java.util.LinkedHashMap$LinkedKeySet
  73:           767          49088  java.util.concurrent.ConcurrentHashMap
  74:          2974          47584  org.springframework.core.annotation.AnnotationUtils$DefaultValueHolder
  75:          1188          46264  [Z
  76:          2875          46000  org.springframework.core.ResolvableType$DefaultVariableResolver
  77:          1606          44192  [Ljava.lang.CharSequence;
  78:          1092          43680  java.lang.invoke.MethodType
  79:           273          43680  org.springframework.beans.factory.support.RootBeanDefinition
  80:           907          43536  org.apache.tomcat.util.modeler.AttributeInfo

num:序號

instances:實例數量

bytes:佔用空間大小

class name:類名稱

堆信息

jmap -heap 17600
Attaching to process ID 17600, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.121-b13

using thread-local object allocation.
Parallel GC with 4 thread(s)

Heap Configuration:
   MinHeapFreeRatio         = 0
   MaxHeapFreeRatio         = 100
   MaxHeapSize              = 4284481536 (4086.0MB)
   NewSize                  = 89128960 (85.0MB)
   MaxNewSize               = 1428160512 (1362.0MB)
   OldSize                  = 179306496 (171.0MB)
   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 = 504365056 (481.0MB)
   used     = 54519344 (51.99369812011719MB)
   free     = 449845712 (429.0063018798828MB)
   10.809500648673012% used
From Space:
   capacity = 23592960 (22.5MB)
   used     = 0 (0.0MB)
   free     = 23592960 (22.5MB)
   0.0% used
To Space:
   capacity = 23068672 (22.0MB)
   used     = 0 (0.0MB)
   free     = 23068672 (22.0MB)
   0.0% used
PS Old Generation
   capacity = 220725248 (210.5MB)
   used     = 50972656 (48.61131286621094MB)
   free     = 169752592 (161.88868713378906MB)
   23.09326026898382% used

28892 interned Strings occupying 3416424 bytes.

堆內存dump

jmap -dump:format=b,file=eureka.hprof 17600

也可以設置內存溢出自動導出dump文件(內存很大的時候,可能會導不出來)

1.	-XX:+HeapDumpOnOutOfMemoryError
2.	-XX:HeapDumpPath=./   (路徑)

可以用jvisualvm 命令工具導入該dump文件分析

jstack

jstack是用來查看線程死鎖的,但是也是可以jvisualvm查看鎖死

package demo05;

public class DeadLockTest {
    private static Object locak1 = new Object();
    private static Object locak2 = new Object();

    public static void main(String[] args) {
        new Thread(()->{
            synchronized(locak1){
                try {
                    System.out.println("thread1 begin");
                    Thread.sleep(5000);
                }catch (Exception e){

                }
                synchronized ((locak2)){
                    System.out.println("thread1 end");
                }
            }
        }).start();

        new Thread(()->{
            synchronized(locak2){
                try {
                    System.out.println("thread2 begin");
                    Thread.sleep(5000);
                }catch (Exception e){

                }
                synchronized ((locak1)){
                    System.out.println("thread2 end");
                }
            }
        }).start();

        System.out.println("mian thread end");
    }
}

遠程連接jvisualvm

啓動普通的jar程序JMX端口配置:

java -Dcom.sun.management.jmxremote.port=12345
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false -jar foo.jar

tomcat的JMX配置

JAVA_OPTS=-Dcom.sun.management.jmxremote.port=8999
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false

jvisualvm遠程連接服務需要在遠程服務器上配置host(連接ip 主機名),並且要關閉防火牆

jstack找出佔用cpu最高的堆棧信息

1、使用命令top -p ,顯示你的java進程的內存情況,pid是你的java進程號,比如4977

2、按H,獲取每個線程的內存情況

3、找到內存和cpu佔用最高的線程tid,比如4977

4、轉爲十六進制得到 0x1371 ,此爲線程id的十六進制表示

5、執行 jstack 4977|grep -A 10 1371,得到線程堆棧信息中1371這個線程所在行的後面10行

6、查看對應的堆棧信息找出可能存在問題的代碼

自己總結完整java知識地址訪問:https://www.yuque.com/yangxinlei/lodfss

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章