JAVA垃圾回收機

垃圾回收基本算法

  • 串型回收和並行回收
串行回收始終在一個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 或開源項目等)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章