1. 程式人生 > >JVM調優

JVM調優

運行環境 垃圾回收 double 虛擬機 多線程 jvm

-一、基礎概念

01.數據類型

① 基本數據類型:byte,short,int,long,char,float,double,Boolean

② 引用數據類型:類類型,接口類型和數組

02.堆與棧

① 棧是運行時單位,而堆是存儲的單位。

② 堆中存的是對象,棧中存的是基本數據類型和堆中對象的引用。

③ 由於程序運行在棧中進行,所以傳遞參數的時候,只存在傳遞基本數據類型和對象引用的問題,所以它都是進行傳值調用。

④ Java中棧的大小通過-Xss來設置。

03.引用類型

① 強引用:聲明對象時虛擬機生成的引用,如果被強引用,則不會被垃圾回收。

② 軟引用:一般被作為緩存來使用,當內存緊張的時候,這種類型引用的空間會被回收;

③ 弱引用:與軟引用差不多,也是作為緩存使用,但是每次垃圾回收肯定會被回收;

-二、基本垃圾回收算法

01.按照基本回收策略分

1) 引用計數法:

2) 復制:

3) 標記整理:

02.按系統線程分

① 串行收集:使用單線程處理所有垃圾回收工作;

② 並行收集:使用多線程處理所有垃圾回收工作;

③ 並發收集:前面 兩個在進行垃圾會收的時候需要暫停整個運行環境,而只有垃圾回收線程在運行,並發收集不需要暫停。

-三、垃圾回收面臨的問題

01.如何區分垃圾:

棧是真正進程開始執行的地方,一個棧是與一個進程相對應的,如果有多個線程的話,必須對這些線程對應的棧進行檢查。

除了棧外還有系統運行時的寄存器,也是存儲程序運行時的數據。

這樣以棧和寄存器的引用為起點,我們就可以找到堆中的對象,又從這些對象找到堆中其他對象的引用,這種逐步擴展,最終以

null引用或者基本數據類型結束,這樣就形成了一顆以Java棧中所對應的對象為根結點的對象樹,如果有多個引用就會有多個對象樹。在對象樹上,都是當前所需要的對象,不能被垃圾回收。而其他剩余對象,則被視為無法被引用的對象,可以被當做垃圾回收。

02.如何處理碎片

“復制方法”和“標記-整理”都可以。

03.如何解決同時存在的對象創建和對象回收問題

垃圾回收線程是回收內存的,而程序運行線程則是消耗內存的,存在矛盾。如果采用先暫停,進行垃圾回收,然後開啟,這樣的問題是:當堆空間持續增大,垃圾回收時間也會增大,對應暫停時間也會增大。可以采用並發垃圾回收。

-四、分代垃圾回收

01.分代垃圾回收

虛擬機中共劃分為三個代:年輕代,年老代,持久代(存放

Java類的類信息)

過程:

新生代分為三個區:Eden區,兩個Survivor區;

剛產生的對象在eden區,這個區滿了以後,還存活的對象將被復制到survivor區(兩個中的一個),當這個survivor區也滿了以後,此區的存活對象被復制到另外一個survivor區,當第二個survivor區對象也滿了以後,將存活的對象復制到年老區。需要註意,兩個survivor區是對稱的,沒有先後關系。

02.觸發垃圾回收的條件

GC的兩種類型:Scavenge GCFull GC;

Scavenge GC:

當對象生成,並且在Eden區中申請空間失敗,就會出發,對eden區進行清理非存活對象,並且將存活對象放在survivor區中。

Full GC

年老代被寫滿;

持久代被寫滿;

System.gc()被顯示調用;

上一次GC之後Head的各域分配策略動態變化。

03.選擇合適的垃圾回收算法

串行收集器:使用小型應用;

並行收集器:後臺處理,科學計算;

並發收集器:Web服務器/應用服務器、電信交換、集成開發環境。

-五、常見配置匯總

技術分享

技術分享

技術分享

技術分享

技術分享

技術分享

技術分享

技術分享

技術分享

技術分享

技術分享

技術分享

技術分享

技術分享

技術分享

技術分享

技術分享




本文出自 “qb的博客” 博客,謝絕轉載!

JVM調優