Java基礎-3、JVM

目錄

 

運行時數據區域、JMM(JVM內存模型)

Minor GC、Full GC

各種回收算法

類加載,爲何使用雙親委派模式?是否有場景可以打破這種模式?

Finalize()方法


運行時數據區域、JMM(JVM內存模型)

 

Minor GC、Full GC

 

Minor GC 新生代

Full GC/Major GC 老年代

-XX:+UseSerialGC

串行GC

串行GC

-XX:+UseParallelGC

PS GC

並行MSC GC

-XX:+UseConcMarkSweepGC

ParNew GC

並行GC

當出現concurrent Mode

Failure時採用串行GC

-XX:+UseParNewGC

並行GC

串行GC

-XX:+UseParallelOldGC

PS GC

並行Compacting GC

-XX:+UseConcMarkSweepGC

-XX:+UseParNewGC

串行GC

併發GC

當出現Concurrent Mode

Failure或promotion failed時採用串行GC

不支持的組合方式

1、-XX:+UseParNewGC -XX:+UseParallelOldGc

2、-XX:+UseParNewGC -XX:+UseSerialGC

判斷對象是否“存活”或“死亡”:

  1. 引用計數算法:

給對象中添加一個引用計數器,每當有一個地方引用它時,計數器的值加1;當引用失效時,計數器的值減;當該對象的計數器的值爲0時,標誌該對象失效。

  1. 跟搜索算法:

通過一系列的名爲“GCRoots”的對象作爲起始點,從這些節點開始向下搜索,搜索過的路徑稱爲引用鏈,當一個對象到GCRoots沒有任何引用鏈相連(用圖論的話來說就是從GC Roots到這個對象不可達)時,則證明對象是不可用的。

各種回收算法

  1. 標記-清除算法

首先標記出所有需要回收的對象,在標記完成後統一回收所有被標記的對象

  1. 複製算法

將可用內存按容量劃分爲大小相等的兩塊,每次使用其中的一塊,當一塊的內存用完了,就將還存活的對象複製到另一塊上面,然後再把已使用過的內存空間一次清空(Eden和Survivor)

  1. 標記-整理算法

標記過程仍然與標記-清除算法一樣,讓所以存活對象都向一端移動,然後直接清理掉邊界意外的內容

  1. 分代收集算法

類加載,爲何使用雙親委派模式?是否有場景可以打破這種模式?

類的生命週期:

類加載雙親委派模型

破壞雙親委派模型:線程上下文類加載器(Thread Context ClassLoader)

Finalize()方法

是Object的protected方法,子類可以覆蓋該方法以實現資源清理工作,GC在回收對象之前調用該方法。

class TestGC{
   
public static TestGC testGC = null;
   
public static void main(String[] args) throws InterruptedException {
       
testGC = new TestGC();
       
testGC = null;
        System.gc();
        Thread.sleep(
500);
       
if (null != testGC) { //此時對象應該處於(reachable, finalized)狀態
           
System.out.println("Yes , I am still alive");
        }
else {
            System.
out.println("No , I am dead");
        }
       
testGC = null;
        System.gc();
        Thread.sleep(
500);
       
if (null != testGC) {
            System.
out.println("Yes , I am still alive");
        }
else {
            System.
out.println("No , I am dead");
        }
    }
   
@Override
   
protected void finalize() throws Throwable {
        
super.finalize();
        System.
out.println("execute method finalize()");
       
testGC = this;
    }
}

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章