天天看點

Thinking in Java:第五章-初始化與清理

1:初始化和清理是設計安全的兩個問題。(記憶體) 2:java使用構造器在使用者有能力操作對象之前初始化。 3:人類的語言具有備援性,即使漏掉幾個詞,也可以根據語境推測出語義。機器的語言要求精确性。 4:重載方法:相同的函數名,不同的參數清單,不能用傳回值類型來區分重載函數。 5:this關鍵字:表示“調用方法的那個對象”。 6:使用本地方法配置設定的記憶體塊java垃圾收集器不能回收這部分記憶體。需要程式員自己搞定。 7:垃圾回收算法:一:回收空間。二:使得堆中對象緊湊排列,可以是實作一種高速的,有“無限空間”可以配置設定的堆模型。

//敲重點,垃圾回收算法

jvm體系結構

Thinking in Java:第五章-初始化與清理

圖檔來源:網絡,侵删

java堆記憶體

Thinking in Java:第五章-初始化與清理

圖檔來源:網絡,侵删

新生代(Young Generation) Eden空間(Eden space,任何執行個體都通過Eden空間進入運作時記憶體區域) S0 Survivor空間(S0 Survivor space,存在時間長的執行個體将會從Eden空間移動到S0 Survivor空間) S1 Survivor空間 (存在時間更長的執行個體将會從S0 Survivor空間移動到S1 Survivor空間) 老年代(Old Generation)執行個體将從S1提升到Tenured(老年代) 永久代(Permanent Generation)包含類、方法等細節的元資訊(在java se8中被移除)

1:引用計數法:(簡單但很慢的垃圾回收技術) 每個對象都有一個引用計數器,當有引用連接配接到對象時,計數加1,當引用離開作用域或者引用被置為null(Java 編譯器能選擇給執行個體賦 null 值,進而标記執行個體為可回收。),計數減1。垃圾回收會在含有全部對象的清單上周遊,當發現某個對象的引用計數為0時,就釋放其空間。(對象之間存在互動引用不能清理)。

2:對于所有活的對象,一定可以追溯到他在堆棧或者靜态存儲區的引用。是以,從堆棧或者靜态存儲區開始,周遊所有的引用,就能找到所有的引用。 2.1:停止-複制 先停止程式運作,然後将所存活的對象從目前堆複制到另一個堆。 有兩個問題:1:需要兩個堆。2:程式運作穩定後隻會産生少量垃圾,很浪費。 2.2:标記-清理 如果沒有新垃圾産生,一些jvm就會由“停止-複制”轉換到“标記-清理”模式。 從堆棧或者靜态存儲區開始,周遊所有的引用,就能找到所有的引用,每當找到一個活的對象,就給對象一個标記,标記完成後,清理動作才開始。沒有被标記的對象會被釋放,但是這時剩下的堆空間是不連續的(記憶體碎片化),需要重新整理。

3:java 4中垃圾回收器 3.1串行垃圾回收器(Serial Garbage Collector) 3.2并行垃圾回收器(Parallel Garbage Collector) 3.3并發标記掃描垃圾回收器(CMS Garbage Collector) 3.4G1垃圾回收器(G1 Garbage Collector) G1垃圾回收器:G1垃圾回收器适用于堆記憶體很大的情況,他将堆記憶體分割成不同的區域,并且并發的對其進行垃圾回收。G1也可以在回收記憶體之後對剩餘的堆記憶體空間進行壓縮。并發掃描标記垃圾回收器在STW情況下壓縮記憶體。G1垃圾回收會優先選擇第一塊垃圾最多的區域

4:GC監控與分析:jdk自帶的工具是Java VisualVM(路徑:\Java\jdk1.8.0\bin)