1. 程式人生 > >java基本概念

java基本概念

java gc

一、JVM和jdk概念說明:

1.JVM是Java虛擬機,所有的Java程序都在Java虛擬機中運。

2.JDK是Java開發工具包,用來開發Java程序,是整個Java的核心,包括了Java運行環境、Java工具和Java基礎類庫

3.jdk中有一個編譯器,可以把你的java源代碼編譯成可以在虛擬機(jvm)上運行的字節碼(中間代碼).


二、heap和stack的概念區分

1.heap是堆,stack是棧。

2.heap的空間是手動申請和釋放的,heap常用new關鍵字來分配。stack的空間由操作系統自動分配和釋放。

3.heap的空間是很大的自由區,stack空間有限。在Java中,若只是聲明一個對象,則先在棧內存中為其分配地址空間,若再new一下,實例化它,則在堆內存中為其分配地址。

聲明對象(棧中分配地址空間)====》實例化(堆heap中分配地址空間)

4.舉例:數據類型 變量名;這樣定義的東西在棧區。如:Object a =null; 只在棧內存中分配空間

new 數據類型();或者malloc(長度); 這樣定義的東西就在堆區如:Object b =new Object(); 則在堆內存中分配空間

5.面向對象和堆棧的關系:當我們把對象拆開,你會發現,對象的屬性其實就是數據,存放在堆中;而對象的行為(方法),就是運行邏輯,放在棧中。我們在編寫對象的時候,其實就是編寫了數據結構,也編寫了處理數據的邏輯。

6.堆中存的是對象。棧中存的是基本數據類型和堆中對象的引用。一個對象的大小是不可估計的,或者說是可以動態變化的,但是在棧中,一個對象只對應了一個4byte的引用(堆棧分離的好處)。


JVM的heap

JVM堆的設置是指java程序運行過程中JVM可以調配使用的內存空間的設置.JVM在啟動的時候會自動設置Heap size的值,其初始空間(即-Xms)是物理內存的1/64,最大空間(-Xmx)是物理內存的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等選項可進行設置。例如:java -jar -Xmn16m -Xms64m -Xmx128m MyApp.jar如果Heap Size設置偏小,除了這些異常信息外,還會發現程序的響應速度變慢了。Heap Size 最大不要超過可用物理內存的80%,一般的要將-Xms和-Xmx選項設置為相同,wiki的設置為-Xms30g -Xmx30g,物理內存為96G


三、垃圾回收(GC)

GC經常發生的區域是堆區,堆區還可以細分為新生代、老年代,新生代還分為一個Eden區和兩個Survivor區。

1.1 對象優先在Eden中分配,當Eden中沒有足夠空間時,虛擬機將發生一次Minor GC,因為Java大多數對象都是朝生夕滅,所以Minor GC非常頻繁,而且速度也很快;

1.2 Full GC,發生在老年代的GC,當老年代沒有足夠的空間時即發生Full GC,發生Full GC一般都會有一次Minor GC。大對象直接進入老年代,如很長的字符串數組,虛擬機提供一個-XX:PretenureSizeThreadhold參數,令大於這個參數值的對象直接在老年代中分配,避免在Eden區和兩個Survivor區發生大量的內存拷貝;

1.3 發生Minor GC時,虛擬機會檢測之前每次晉升到老年代的平均大小是否大於老年代的剩余空間大小,如果大於,則進行一次Full GC,如果小於,則查看HandlePromotionFailure設置是否允許擔保失敗,如果允許,那只會進行一次Minor GC,如果不允許,則改為進行一次Full GC


參考:https://zhidao.baidu.com/question/1864149247064670867.html

https://zhidao.baidu.com/question/1864149247064670867.html

java基本概念