垃圾回收基本算法
- 串型回收和並行回收
串行回收始終在一個CPU上執行回收操作。並行回收則將回收任務分爲好幾步,每步使用不同的CPU執行,這樣加快了執行速度,有點像流水線作業。
- 併發執行和暫停應用程序
併發執行意味着垃圾回收線程可以和用戶線程同時工作,但是系統開銷比較大。暫停應用程序則在垃圾回收器運行時停止用戶線程的執行。
- 壓縮、不壓縮和複製
壓縮則會把活動對象放在一起,並回收剩餘的內存。不壓縮則只是回收不用的內存,對活動對象不做額外的操作。複製則把堆內存分爲兩部分A和B,A爲空閒狀態。將B中的活動對象放入A中,回收B內存。
java堆內存回收
java將對象分爲3代,對每代執行不同的回收策略
Young代
線程執行初期的對象都處於Young代,並且大部分對象會很快進入不可達狀態,使用的回收算法是複製。Young代由1個Eden和2個Survivor組成。絕大部分對象一開始處於Eden區域,等垃圾回收器啓動時,會將可達對象放入其中的一個Survivor中。等到垃圾回收器再次啓動時會將Eden(新產生的)和Survivor中可達對象放入另一個空閒的Survivor中。不斷的進行輪替操作。
Old代
如果Young中的對象長時間處於可達狀態的話會進入Old代。由於Old代對象存活時間很長並隨着新的對象被加入Old代中,會使得Old中的對象越來越多。這使得對Old代對像的回收頻率不用太高,並且需要更長的回收時間,所以採用壓縮算法來處理。
Permanent代
Permanent代主要裝載Class、方法等信息,默認是64M,垃圾回收機制通常不會回收Permanent對象。
JAVA內存回收選項
-Xmx256m 設置虛擬機最大堆內存256MB
-Xms128m 設置堆內存初始容量爲128MB
-XX:MaxNewSize=128m 設置Young代內存最大容量128MB
-XX:MaxPerSize = 64m 設置Permanent代最大容量爲64MB
JAVA內存使用小技巧
使用基本類型時最好不用其包裝類
如String str = “avd”; 不要使用String str = new String(“avd”);
進行字符串連接操作
儘量使用StringBuilder和StringBuffer對象,這兩個對象是變長的。而String對象不是變長的,進行字符串連接是會產生大量的臨時變量。
儘早釋放無用對象的引用
儘量少用靜態變量
緩存經常使用的對象(HashMap 或開源項目等)