一、JVM內存模型?
JVM把內存劃分爲堆,載,方法區。
堆:堆是所有線程共享,虛擬機啓動時創建,主要存放對象和數組,所佔內存比較大。
堆結構包含年輕代,老年代和持久代,其中年輕代又分爲Eden區和2個Survivor區(幸運區)。
-Xms=*** 堆初始化空間大小,默認內存的1/64
-Xmx=*** 堆空間最大值
-XX:NewSize=*** 新生代空間大小
-XX:MaxNewSize=*** 新生代空間最大值
-Xmn=*** 新生代空間大小,這裏包含From、To兩個Survivor區(比例:8:1:1)。
棧:棧是線程獨享的。生命週期和線程相同,主要存儲局部變量和參數等信息。當系統創建一個線程時,會爲該線程分配一個棧空間,
程序在每次調用一個方法時,會爲每個方法創建一個棧幀並PUSH到當前線程對應的棧中。
-Xss=*** 棧空間大小
方法區:方法區是線程共享的,主要存儲類的信息、常量、靜態變量等信息;JDK1.8之後方法區移除,方法去的數據都遷移至元空間,
元空間和方法區類似,不同的是,方法區是在虛擬機中,而元數據是存儲在本地內存中。
-XX:PermSize=***
-XX:MaxPermSize=***
-XX:MetaspaceSize=***
-XX:MaxMetaspaceSize=***
二、GC回收?
GC回收分爲2中,一種是Minor GC,也就是年輕代GC(YGC),一種Major GC, 也就是FULLGC。
無論是YGC還是FULLGC都會使得程序暫停,而進行GC回收活動。所以我們應避免系統出現頻繁的YGC和FULLGC,以及儘量降低GC時長。
因此在做JVM調優時,我們可以從幾個方面入手:
第一、優化代碼邏輯,儘量少創建一次性對象,特別是內存佔用較大的對象
第二、對於頻繁使用的對象,我們可以建立一個對象池,從而避免頻繁的創建對象和回收對象。
第三、可以調整堆大小
三、常用調優工具?
我常用調優GUI工具(JDK自帶):jconsole jVisualVM
以上是對JVM調優的簡單梳理,更多詳細的,請自行探索 ~_~!