參考廖雪峰老師的這篇
JVM調優的正確姿勢: https://www.liaoxuefeng.com/article/1336345083510818
檢視某個JVM程式堆記憶體資訊
更多java工具命令可以在 jdk的bin目錄下看到,命令怎麼用可以使用 -help
# 查詢埠號
C:\Users\admin>netstat -ano|findstr 8081
TCP 0.0.0.0:8081 0.0.0.0:0 LISTENING 8792
TCP [::]:8081 [::]:0 LISTENING 8792
# jmap -heap <pid>
C:\Users\admin>jmap -heap 8792
Attaching to process ID 8792, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.251-b08
using thread-local object allocation.
Parallel GC with 4 thread(s)
Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 2147483648 (2048.0MB)
NewSize = 715653120 (682.5MB)
MaxNewSize = 715653120 (682.5MB)
OldSize = 1431830528 (1365.5MB)
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 536870912 (512.0MB)
CompressedClassSpaceSize = 528482304 (504.0MB)
MaxMetaspaceSize = 536870912 (512.0MB)
G1HeapRegionSize = 0 (0.0MB)
Heap Usage:
PS Young Generation
Eden Space:
capacity = 537395200 (512.5MB)
used = 390193272 (372.11730194091797MB)
free = 147201928 (140.38269805908203MB)
72.60825403725228% used
From Space:
capacity = 89128960 (85.0MB)
used = 27779432 (26.492530822753906MB)
free = 61349528 (58.507469177246094MB)
31.167683320886947% used
To Space:
capacity = 89128960 (85.0MB)
used = 0 (0.0MB)
free = 89128960 (85.0MB)
0.0% used
PS Old Generation
capacity = 1431830528 (1365.5MB)
used = 122896 (0.1172027587890625MB)
free = 1431707632 (1365.382797241211MB)
0.008583138688323874% used
23174 interned Strings occupying 2401368 bytes.
微調JVM啟動引數
JVM引數大致可以分為三類
-
標準指令:
-
開頭,這些是所有的HotSpot
都支援的引數。可以用java -help
列印出來。 -
非標準指令:
-X
開頭,這些指令通常是跟特定的HotSpot
版本對應的。可以用java -X
列印出來。 -
不穩定引數:
-XX
開頭,這一類引數是跟特定HotSpot
版本對應的,並且變化非常大。詳細的文件資料非常少。
在JDK1.8版本下有幾個常用的不穩定指令
java -XX:+PrintCommandLineFlags
:檢視當前命令的不穩定指令
java -XX:+PrintFlagsInitial
:檢視所有不穩定指令的預設值
java -XX:+PrintFlagsFinal
:檢視所有不穩定指令最終生效的實際值
JDK1.8之前元空間叫永久代
STW(Stop-The-World):是指JVM在執行垃圾收集演算法時,所有的使用者執行緒都被掛起(除了垃圾收集幫助器之外)。Java中一種全域性暫停現象,全域性停頓,所有Java程式碼停止,native程式碼可以執行,但不能與JVM互動;這些停頓現象多半是由於GC引起。
堆記憶體預設分配:新生區佔1/3,老年區佔2/3
新生區分為3塊 Eden、From(S0)、To(S1),預設佔比是 8:1:1
# -Xms: 設定堆初始化記憶體大小, 預設是 1/64
# -Xmx: 設定最大分配記憶體大小, 預設是 1/4
# -Xss: 執行緒棧大小
# -XX:MetaspaceSize: 元空間大小
# -XX:MaxMetaspaceSize: 元空間最大大小
java -Xms2G -Xmx2G -Xss1M -XX:MetaspaceSize=512M -XX:MaxMetaspaceSize=512M -jar app.jar
# -XX:MaxGCPauseMillis: GC進行STW的最大停頓時間, JVM將盡可能(但不保證)停頓小於這個時間
# -XX:+UseG1GC 使用G1垃圾收集器
java -Xms2G -Xmx2G -Xss1M -XX:+UseG1GC -XX:MaxGCPauseMillis=100ms -XX:MetaspaceSize=512M -XX:MaxMetaspaceSize=512M -jar app.jar
檢視JVM的一些預設引數
C:\Users\admin>java -XX:+PrintCommandLineFlags -version
-XX:InitialHeapSize=132884864 -XX:MaxHeapSize=2126157824 -XX:+PrintCommandLineFlags
-XX:+UseCompressedClassPointers -XX:+UseCompressedOops
-XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
java version "1.8.0_251"
Java(TM) SE Runtime Environment (build 1.8.0_251-b08)
Java HotSpot(TM) 64-Bit Server VM (build 25.251-b08, mixed mode)
從上面可以看出JDK8預設使用的GC是 ParallelGC
= Parallel Scavenge + Parallel Old
JDK各個版本的GC,來源:https://www.cnblogs.com/zeze/p/6610163.html
新生代
- 1.3:Seriall
- 1.4:ParNew、Parallel Scavenge
老年代
- 1.5:CMS、Serial Old(MSC)
- 1.6:Parallel Old
- 1.7:G1(收集器在JDK 1.7 u4版本正式投入使用)
檢視GC的詳細資訊
C:\Users\admin>java -XX:+PrintGCDetails -version
java version "1.8.0_251"
Java(TM) SE Runtime Environment (build 1.8.0_251-b08)
Java HotSpot(TM) 64-Bit Server VM (build 25.251-b08, mixed mode)
Heap
PSYoungGen total 38400K, used 2005K [0x00000000d5c00000, 0x00000000d8680000, 0x0000000100000000)
eden space 33280K, 6% used [0x00000000d5c00000,0x00000000d5df54b8,0x00000000d7c80000)
from space 5120K, 0% used [0x00000000d8180000,0x00000000d8180000,0x00000000d8680000)
to space 5120K, 0% used [0x00000000d7c80000,0x00000000d7c80000,0x00000000d8180000)
ParOldGen total 87552K, used 0K [0x0000000081400000, 0x0000000086980000, 0x00000000d5c00000)
object space 87552K, 0% used [0x0000000081400000,0x0000000081400000,0x0000000086980000)
Metaspace used 2360K, capacity 4480K, committed 4480K, reserved 1056768K
class space used 255K, capacity 384K, committed 384K, reserved 1048576K