JVM內存結構_gc垃圾回收

Jdk用來編譯項目 ,jre用來運行項目 ,jvm是內存用來存放java運行過程中產生的一切變量,常量,連接,並且把他們合理的分配到內存各個區域

 

 JDK(Java Development Kit) 是 Java 語言的軟件開發工具包(SDK)。在JDK的安裝目錄下有一個jre目錄,裏面有兩個文件夾bin和lib,在這裏可以認爲bin裏的就是jvm,lib中則是jvm工作所需要的類庫,而jvm和 lib合起來就稱爲jre。

 JRE(Java Runtime Environment,Java運行環境),包含JVM標準實現及Java核心類庫。JRE是Java運行環境,並不是一個開發環境,所以沒有包含任何開發工具(如編譯器和調試器)最後JVM也一目瞭然了

 

  JVM是Java Virtual Machine(Java虛擬機)的縮寫,JVM是一種用於計算設備的規範,它是一虛 構出來的計算機,是通過在實際的計算機上仿真模擬各種計算機功能來實現的。

 

  1. Java的內存結構圖

 

 

2.1 方法區

    存放裝載的類數據信息,包括:基本信息:每個類的全限定名、每個類的直接超類的全限定名、該類是類還是接口、該類型的訪問修飾符、直接超接口的全限定名的有序列表。每個已裝載類的詳細信息:運行時常量池、字段信息、方法信息、靜態變量、到類classloader的引用、到類class的引用。

2.2  棧內存

     Java棧內存由局部變量區、操作數棧、幀數據區組成,以幀的形式存放本地方法的調用狀態(包括方法調用的參數、局部變量、中間結果……)。

2.3  堆內存

     堆內存用來存放由new創建的對象和數組。在堆中分配的內存,由Java虛擬機的自動垃圾回收器來管理。

 2.4 本地方法棧內存

     Java通過Java本地接口JNI(Java Native Interface)來調用其它語言編寫的程序,在Java裏面用native修飾符來描述一個方法是本地方法 

 

 

 

  1. 垃圾回收機制

垃圾回收機制就是gc,主要功能就是在java虛擬機中,內存消耗過多的時候清理內存,保障程序運行的一種機制

一幅圖說明gc運行的原理

 

 

3.1 young gen年輕代:

對象被創建時,內存的分配首先發生在年輕代,大部分的對象在創建後很快就不再使用,因此很快變得不可達,於是被年輕代的GC機制清理掉,98%的對象都是很快消亡的,年輕代可以分爲3個區域:Eden區(伊甸園) FORM區 To區(存活區)

3.2 old gen年老代:

對象如果在年輕代存活了足夠長的時間而沒有被清理掉(即在幾次Young GC後存活了下來),則會被複制到年老代,空間一般比年輕代大在年老代上發生的GC次數也比年輕代少(內存不足執行Major GC FullGc),年輕代對象如果在年輕代存活了足夠長的時間而沒有被清理掉(即在幾次Young GC後存活了下來)大數據對象(y代內存不足的情況下,可直接分到老年代)(短命大對象可提前觸發full gc)可通過參數變短命大對象直接進入年老代,full gc可不是什麼好事

3.3young gc:

將在使用的對象複製到另一個區清空本區,清除年輕代區所有對象,在某個區滿的時候觸發,例如 eden區滿之後。將還在使用的對象, 複製到form區,清空eden區,eden區再次滿之後,將eden,form區還在使用的對象轉移到 To區,清空eden區,from區,eden區再次滿之後,將eden,to區的對象複製到 from區保持一個from to這兩個之間有一個是空的!當經過young gc執行一定次數閥值(默認15可更改)後,-對象轉到老年代

 

3.4 full gc :

清除整個內存中無用對象(在年輕,年老代都滿的時候觸發)

收集整個堆,包括young gen、old gen、perm gen(永久代)(如果存在的話)等所有部分的模式。

觸發條件:當young gc後,需要晉升到老年代的對象太多,超過老年代內存(則取消yc 執行 f c)

當大數據對象創建,超過閥值直接到老年代(內存超過閥值後)

 

 

  1. 內存優化方案

線程池  連接池 需要合理使用,儘量減少內存的開闢

程序代碼算法 :在寫代碼的時候,多使用算法,注意整個功能儘量減少變量的創建,注意時間空間複雜度的問題,對象使用完畢後,可置爲null失去指針後可加快gc的回收

Jvm 中各個區塊 大小合理分配(各代大小)達到一個gc時間最小,次數最少,fullg夠長的一個效果

full c週期夠長,避免進行Full GC,方法是調整年輕代和老年代之間的閥值。

優化參數

1.  -XX:NewSize and -XX:MaxNewSize年輕代大小

2.  -XX:NewRatio 新生 老生 比例

3.  -XX:PermSize -XX:MaxPermSize內存大小

4.  -XX:MaxTenuringThreshold 優化young gc掃描閥值 進入年老帶

5.  -XX:PretenureSizeThreshold優化對象數據大小閥值(直接進入年老代的對象)

6.  -XX:SurvivorRatio 規定eden區和其他兩個區的比例大小 Eden:Survivor1:Survivor2=8:1:1.

 

發佈了10 篇原創文章 · 獲贊 0 · 訪問量 493
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章