什么是fullGC:
從年輕代空間(包括 Eden 和 Survivor 區域)回收內存被稱為 Minor GC,對老年代GC稱為Major GC,而Full GC是對整個堆來說的,在最近幾個版本的JDK里默認包括了對永久代即方法區的回收(JDK8中無永久帶了),出現Full GC的時候經常伴隨至少一次的Minor GC,但非絕對的。
會引發fullGC的幾種情況:https://blog.csdn.net/qq_38384440/article/details/81710887
分析的話需要從JVM內存結構說起(根據JDK版本會有所調整):
a、JVM內存模型(圖片來自網絡):
b、我們主要看一下堆的構成(圖片來自網絡):
1.JVM中堆空間可以分成三個大區,新生代、老年代、永久代
2.新生代可以划分為三個區,Eden區,兩個幸存區
c、生存情況(圖片來自網絡):
定位問題:
工具:JDK自帶的Jmap等工具:%JAVA_HOME%/bin/jmap
1、查看JVM參數命令:ps -ef |grep java
2、top命令查看PID
1、top命令查看PID
>top
空閑:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
159910 admin 20 0 6593m 2.2g 16m S 3.7 27.4 2:32.04 java
2270 root 20 0 296m 25m 6792 S 1.3 0.3 0:04.93 python
普通任務:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
159910 admin 20 0 6725m 2.9g 9452 S 20.6 35.8 59:38.10 java
644 root 20 0 238m 4356 3168 S 1.7 0.1 27:24.38 alisentry_cli
多線程任務:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
159910 admin 20 0 6818m 4.4g 9648 S 182.7 54.9 74:45.76 java
644 root 20 0 238m 4356 3168 S 0.8 0.1 27:30.43 alisentry_cli
3、jmap命令
注意[B 對象 ,這是一個byte數組,可以dump內存中的數據查看內容,會發現實際上就是傳輸的表數據
>sudo -u admin /opt/taobao/java/bin/jmap -histo:live 159910 | more
num #instances #bytes class name
空閑:
1: 16391 110613520 [Ljava.lang.Object;
2: 108702 31890616 [C
3: 8075 12048648 [B
普通任務:
1: 6740 163115880 [B
2: 16773 110638024 [Ljava.lang.Object;
3: 110747 32302984 [C
多線程任務開啟:
1: 9468 2065856344 [B
2: 18254 110830840 [Ljava.lang.Object;
3: 130436 34780696 [C
查看堆棧信息:
啟動任務后:
$sudo -u admin /opt/taobao/java/bin/jmap -heap 159910
Attaching to process ID 2438, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.66-b60
using parallel threads in the new generation.
using thread-local object allocation.
Concurrent Mark-Sweep GC
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 4294967296 (4096.0MB)
NewSize = 2147483648 (2048.0MB)
MaxNewSize = 2147483648 (2048.0MB)
OldSize = 2147483648 (2048.0MB)
NewRatio = 2
SurvivorRatio = 10
MetaspaceSize = 268435456 (256.0MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 268435456 (256.0MB)
G1HeapRegionSize = 0 (0.0MB)
Heap Usage:
New Generation (Eden + 1 Survivor Space):新生代區內存分布,包含伊甸園區+Survivor區
capacity = 1968570368 (1877.375MB)
used = 1965707016 (1874.6442947387695MB)
free = 2863352 (2.7307052612304688MB)
99.85454662700683% used
Eden Space:Eden區內存分布
capacity = 1789657088 (1706.75MB)
used = 1788720872 (1705.8571548461914MB)
free = 936216 (0.8928451538085938MB)
99.94768740859477% used
From Space(S1):其中一個Survivor區的內存分布
capacity = 178913280 (170.625MB)
used = 176986144 (168.78713989257812MB)
free = 1927136 (1.837860107421875MB)
98.92286587110806% used
To Space(S2):另一個Survivor區的內存分布
capacity = 178913280 (170.625MB)
used = 0 (0.0MB)
free = 178913280 (170.625MB)
0.0% used
concurrent mark-sweep generation(永久代,fullGC位置):
capacity = 2147483648 (2048.0MB)
used = 2147235096 (2047.7629623413086MB)
free = 248552 (0.23703765869140625MB)
99.98842589557171% used
32663 interned Strings occupying 3788288 bytes.
查找定位堆棧線程異常:
FULL GC 詳情:sudo -u admin /opt/taobao/java/bin/jstack 159910
參考地址:
http://www.cnblogs.com/myna/p/7573843.html
https://www.cnblogs.com/kongzhongqijing/articles/3621163.html
top命令,查看java PID 為29037
ps -ef | grep java 查看java進程及相關參數
jMap:
sudo -u admin /opt/taobao/java/bin/jmap -heap 29037
sudo -u admin /opt/taobao/java/bin/jmap -histo:live 29037 | more
sudo -u admin /opt/taobao/java/bin/jmap -heap 29037
sudo -u admin /opt/taobao/java/bin/jmap -dump:format=b,file=/home/admin/mem.dat 29037
sudo -u admin /opt/taobao/java/bin/jstack 29037