JVM調優
-一、基礎概念
01.數據類型
① 基本數據類型:byte,short,int,long,char,float,double,Boolean
② 引用數據類型:類類型,接口類型和數組
02.堆與棧
① 棧是運行時單位,而堆是存儲的單位。
② 堆中存的是對象,棧中存的是基本數據類型和堆中對象的引用。
③ 由於程序運行在棧中進行,所以傳遞參數的時候,只存在傳遞基本數據類型和對象引用的問題,所以它都是進行傳值調用。
④ Java中棧的大小通過-Xss來設置。
03.引用類型
① 強引用:聲明對象時虛擬機生成的引用,如果被強引用,則不會被垃圾回收。
② 軟引用:一般被作為緩存來使用,當內存緊張的時候,這種類型引用的空間會被回收;
③ 弱引用:與軟引用差不多,也是作為緩存使用,但是每次垃圾回收肯定會被回收;
-二、基本垃圾回收算法
01.按照基本回收策略分
1) 引用計數法:
2) 復制:
3) 標記整理:
02.按系統線程分
① 串行收集:使用單線程處理所有垃圾回收工作;
② 並行收集:使用多線程處理所有垃圾回收工作;
③ 並發收集:前面 兩個在進行垃圾會收的時候需要暫停整個運行環境,而只有垃圾回收線程在運行,並發收集不需要暫停。
-三、垃圾回收面臨的問題
01.如何區分垃圾:
棧是真正進程開始執行的地方,一個棧是與一個進程相對應的,如果有多個線程的話,必須對這些線程對應的棧進行檢查。
除了棧外還有系統運行時的寄存器,也是存儲程序運行時的數據。
這樣以棧和寄存器的引用為起點,我們就可以找到堆中的對象,又從這些對象找到堆中其他對象的引用,這種逐步擴展,最終以
02.如何處理碎片
“復制方法”和“標記-整理”都可以。
03.如何解決同時存在的對象創建和對象回收問題
垃圾回收線程是回收內存的,而程序運行線程則是消耗內存的,存在矛盾。如果采用先暫停,進行垃圾回收,然後開啟,這樣的問題是:當堆空間持續增大,垃圾回收時間也會增大,對應暫停時間也會增大。可以采用並發垃圾回收。
-四、分代垃圾回收
01.分代垃圾回收
虛擬機中共劃分為三個代:年輕代,年老代,持久代(存放
過程:
新生代分為三個區:Eden區,兩個Survivor區;
剛產生的對象在eden區,這個區滿了以後,還存活的對象將被復制到survivor區(兩個中的一個),當這個survivor區也滿了以後,此區的存活對象被復制到另外一個survivor區,當第二個survivor區對象也滿了以後,將存活的對象復制到年老區。需要註意,兩個survivor區是對稱的,沒有先後關系。
02.觸發垃圾回收的條件
GC的兩種類型:Scavenge GC和Full GC;
Scavenge GC:
當對象生成,並且在Eden區中申請空間失敗,就會出發,對eden區進行清理非存活對象,並且將存活對象放在survivor區中。
Full GC:
年老代被寫滿;
持久代被寫滿;
System.gc()被顯示調用;
上一次GC之後Head的各域分配策略動態變化。
03.選擇合適的垃圾回收算法
串行收集器:使用小型應用;
並行收集器:後臺處理,科學計算;
並發收集器:Web服務器/應用服務器、電信交換、集成開發環境。
-五、常見配置匯總
本文出自 “qb的博客” 博客,謝絕轉載!
JVM調優