jvm從內存模型到垃圾收集器

1. JVM是Java Virtual Machine(Java虛擬機)的縮寫。

是整個java實現跨平臺的最核心的部分,能夠運行以Java語言寫作的軟件程序。

2. jvm 運行時數據區

這裏寫圖片描述
這裏寫圖片描述

3. Java 8的內存分代改進

從永久代到元空間,在小範圍自動擴展永生代避免溢出。

4. JVM垃圾回收機制

jVM中共劃分爲三個代:年輕代、年老代和持久代。 
年輕代:存放所有新生成的對象; 
年老代:在年輕代中經歷了N次垃圾回收仍然存活的對象; 
持久代:用於存放靜態文件,如Java類、方法等。 

新生代的GC爲“minor gc”,老年代的GC”Full Gc 或者Major GC”;
其中用System.gc()強制執行的是Full Gc。 

判斷對象是否需要回收的方法有兩種: 
1.引用計數 
    當某對象的引用數爲0時,便可以進行垃圾收集。 
2.對象引用遍歷 
    如果對象不能從這些根對象到達,則將它作爲垃圾收集。在對象遍歷階段,gc必須記住哪些對象可以到達,以便刪除不可到達的對象,這稱爲標記(marking)對象。

觸發GC(Garbage Collector)的條件: 
 1.GC在優先級最低的線程中運行,一般在應用程序空閒即沒有應用線程在運行時被調用。 
 2.Java堆內存不足時,GC會被調用。

新生代中Eden和Survivor的比例分配等:
   默認比例8:1;大部分對象都是朝生夕死。 
   複製算法的基本思想就是將內存分爲兩塊,每次只用其中一塊,當這一塊內存用完,就將還活着的對象複製到另外一塊上面。複製算法不會產生內存碎片。

5. 對Java內存模型的理解,以及其在併發中的應用

Java內存模型的主要目標: 定義程序中各個變量的訪問規則。 
Java線程之間的通信由Java內存模型(本文簡稱爲JMM)控制。 
所有變量的存儲都在主內存,每條線程還都有自己的工作內存,線程的工作內存中保存了被該線程使用到的變量的主內存副本拷貝。
線程對變量的所有操作必須在工作內存完成,而不能直接讀取主內存中的變量。
不同的線程直接無法訪問對方工作內存中的變量,線程間變量的傳遞均需要通過主內存來完成。
線程間通信: 
  1.首先,線程A把本地內存A中更新過的共享變量刷新到主內存中去。 
  2.然後,線程B到主內存中去讀取線程A之前已更新過的共享變量。

這裏寫圖片描述

6. 指令重排序,內存柵欄等

指令重排序:編譯器或運行時環境爲了優化程序性能而採取的對指令進行重新排序執行的一種手段。
在單線程程序中,對存在控制依賴的操作重排序,不會改變執行結果;但在多線程程序中,對存在控制依賴的操作重排序,可能會改變程序的執行結果。   
volatile修飾(原子性操作),不會進行指令重排序。

7. volatile的語義,它修飾的變量一定線程安全嗎

一個變量被定義爲volatile之後,具備兩重語義:
①保證此變量對所有線程的可見性,即當一條線程修改了這個值,新值對於其他所有線程來說是立即得知的,普通變量需要通過主內存傳遞。
②禁止指令重排序優化。 
Volatile修飾的變量不一定是線程安全的,eg非原子操作a++等。

8. g1和cms區別,吞吐量優先和響應優先的垃圾收集器選擇

CMS收集器:一款以獲取最短回收停頓時間爲目標的收集器,是基於“標記-清除”算法實現的。分爲4個步驟:初始標記、併發標記、重新標記、併發清除。 
G1收集器:面向服務端應用的垃圾收集器,過程:初始標記;併發標記;最終標記;篩選回收。整體上看是“標記-整理”,局部看是“複製”,不會產生內存碎片。 
吞吐量優先的並行收集器:以到達一定的吞吐量爲目標,適用於科學技術和後臺處理等。 
響應時間優先的併發收集器:保證系統的響應時間,減少垃圾收集時的停頓時間。適用於應用服務器、電信領域等。

9. classpath的理解

classpath是javac編譯器的一個環境變量。它的作用與import、package關鍵字有關。 
package的所在位置,就是設置CLASSPATH當編譯器面對import packag這個語句時,它先會查找CLASSPATH所指定的目錄,並檢視子目錄java/util是否存在,然後找出名稱吻合的已編譯文件(.class文件)。如果沒有找到就會報錯! 
動態加載包
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章