1. 程式人生 > >深入JVM 原理(五)Java堆記憶體調整引數(調優關鍵)

深入JVM 原理(五)Java堆記憶體調整引數(調優關鍵)

目錄

堆記憶體的引數調整
這裡寫圖片描述

通過之前的分析可以發現,實際上每一塊子記憶體區中都會存在有一部分的可變伸縮區,其基本流程:
如果空間不足,在可變的範圍之內擴大記憶體空間,當一段時間之後發現記憶體空間沒有這麼緊張的時候,再將可變空間進行釋放。所以在整個調整過程之中:

這裡寫圖片描述

-Xms:設定初始分配大小,預設為實體記憶體的“1/64”
-Xmx:最大分配記憶體,預設為實體記憶體的“1/4”

在整個堆記憶體的調整策略之中,有經驗的人基本只會調整兩個引數:“-Xmx”(最大記憶體)、“-Xms”(初始化記憶體)。如果要取得這些記憶體的整體資訊,直接利用Runtime類即可;

System.out.println(“Max_memory=”+Runtime.getRuntime().maxMemory()/(double)1024/1024+”M”);
System.out.println(“Total_memory=”+Runtime.getRuntime().totalMemory()/(double)1024/1024+”M”);

Max_memory=1820.5M (預設最大記憶體)
Total_memory=123.0M (初始化記憶體)

發現預設的情況下分配的記憶體是總記憶體的1/4;;而初始化記憶體為“1/64”;那麼也就是說整個記憶體的可變範圍(伸縮區):123.0M ~ 1820.5M 之間,那麼現在就可能造成程式效能下降;所以,我最好能讓伸縮區的大小為0;即讓 Max_memory 和 Total_memory 保持一致;

(java -Xms2G -Xmx2G TestDemo)

這裡寫圖片描述

Max_memory=1963.0M
Total_memory=1963.0M

那麼這個時候就避免了伸縮區的可調策略,從而提升了整個程式的效能;

範例:觀察GC的詳解日誌(java -Xms2G -Xmx2G -XX:+PrintGCDetails TestDemo)

Max_memory=1963.0M
Total_memory=1963.0M
[GC (System.gc()) [PSYoungGen: 31488K->608K(611840K)] 31488K->616K(2010112K), 0.0149295 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
[Full GC (System.gc()) [PSYoungGen: 608K->0K(611840K)] [ParOldGen: 8K->490K(1398272K)] 616K->490K(2010112K), [Metaspace: 2791K->2791K(1056768K)], 0.0061879 secs] [Times: user=0.02 sys=0.00, real=0.01 secs]
Heap
PSYoungGen total 611840K, used 5248K [0x0000000795580000, 0x00000007c0000000, 0x00000007c0000000)
eden space 524800K, 1% used [0x0000000795580000,0x0000000795aa0178,0x00000007b5600000)
from space 87040K, 0% used [0x00000007b5600000,0x00000007b5600000,0x00000007bab00000)
to space 87040K, 0% used [0x00000007bab00000,0x00000007bab00000,0x00000007c0000000)
ParOldGen total 1398272K, used 490K [0x0000000740000000, 0x0000000795580000, 0x0000000795580000)
object space 1398272K, 0% used [0x0000000740000000,0x000000074007ab88,0x0000000795580000)
Metaspace used 2798K, capacity 4486K, committed 4864K, reserved 1056768K
class space used 304K, capacity 386K, committed 512K, reserved 1048576K

下面再編寫一個程式碼,觀察GC的觸發操作:
範例:測試GC處理(請儲存記憶體空間小)(-Xms10M -Xmx10M -XX:+PrintGCDetails)

Random random = new Random();
String string = “213123”;
while (true)
{
string += string + random.nextInt(8888888)+random.nextInt(8888888);
string.intern(); //強制產生垃圾
}
}

如果在開發之中,你發現程式執行速度變慢,那麼就需要對程式記憶體進行分析:
視覺化工具:jvisualvm (命令列執行此命令) 或 jconsole

這裡寫圖片描述

這裡寫圖片描述

命令檢視:jmap(jmap -heap PID)

這裡寫圖片描述

他會將整個記憶體空間的情況進行取得;即日常開發下可用這兩者方法進行檢視調整堆記憶體;
如果不會調記憶體的話,可直接將-Xms 和 -Xmx 調成一樣大小即可。