package com.itmayiedu.day06;
/**
- 垃圾回收機制概述:
- Java語言中最顯著的一個特點就是引入了垃圾回收機制,使C++程序員最頭疼的內存管理問題
- 迎刃而解,它使得Java程序員在編程的時候不需要考慮內存管理,由於有個垃圾回收機制,
- Java中的對象不再有作用域的概念,只有對象的引用纔有作用域,垃圾回收機制可以有效防止內存泄露,有效的使用空閒的內存
- ps:內存泄露,是指在該內存空間使用完畢之後未回收,再不涉及複雜的數據結構的一般情況下,Java的內存泄露表現爲一個內存生命
- 週期超出了程序需要它的時間長度,我們有時候也將起稱爲對象遊離。
- 垃圾回收機制的算法:
-
引用計數法:
-
給對象添加一個引用計數器,每當有一個地方引用它是,計數器的值就增加1,當引用失效時,計數器的值就減少1,任何時刻計數器都爲0
-
的對象就是不再被使用的。垃圾收集器將回收該對象使用的內存。
-
優點:引用計數器可以很快的執行,交織在程序中,對程序中需要不被長時間打斷的實時環境比較有利。
-
缺點:無法檢測出循環引用,如父對象有一個自對象的引用,子對象反過來引用父對象,這樣他們的引用計數永遠不可能爲0,而且每次加減非常浪費內存。
-
標記清楚算法:
-
一個標記,一個清楚。標記:就是根據特定的算法標出內存中那些對象可以回收,那些對象還可以繼續引用,
-
標記指示回收,那就直接收掉。標記指示對象還能用,那就原地不動。
-
缺點:標記和清楚不存在連續性,效率比較低,清楚之後存在大量的碎片。
-
複製算法:
-
主要用在新生代S0區和S1區
-
S0和S1將可用內存按容量分成大小相等的兩塊。當這塊內存使用完了,就將還存在的對象複製到另外內存上去,然後把使用過的內存空間
-
一次清理掉。這樣使得每次都是對其中的一塊內存進行回收,內存分配時不用考慮內存碎片的複雜情況,只需要移動堆指針,按順序即可,實現簡單
-
運行高效,
-
複製算法的缺點:可使用的內存將爲原來的一半。
-
主要用在老年代裏面。
-
標記壓縮:
-
在標記清除的基礎上做了優化,把存活的對象,壓縮到內存的一端,而後進行垃圾清理。
-
主要用在老年代裏面。連續性不會產生碎片。
-
分代算法:
-
根據內存中對象的存活週期不同,將內存劃分爲幾塊,Java虛擬機中一般把內存劃分爲新生代和老年代,當新創建對象時,一般在新生代,
-
分配內存空間,當新生代垃圾收集器回收幾次後仍然存活的對象會被移動到老年代的內存中m,當大對象在新生代無法找到足夠的連續內存時
-
也直接在老年代中創建。
-
對於新生代和老年代,新生代回收頻率比較高,每次耗費時間比較短,但是對於老年代來說回收頻率比較低,每次回收耗費的時間比較長,
-
因此要儘量減少老年代的垃圾回收的次數。
-
新生代和老年代
- 垃圾回收時的卡頓現象:
-
垃圾回收的任務是識別和回收垃圾對象進行內存清理,爲了讓垃圾回收器可以更高效率的執行,大部分情況下,會要求系統
-
進入一個停頓的狀態,停頓的目的是爲了終止所有的應用線程,只有啊這樣系統纔不會有新的垃圾產生,同時停頓保證了系統狀態在
-
某一個瞬間的一致性,也有利於更好的標記垃圾對象,因此咋垃圾回收時,都會產生應用程序的停頓。
*/
public class Demo01 {
public static void main(String[] args) {
Demo01 demo01 = new Demo01();
demo01 =null;
System.gc();
}
@Override
protected void finalize() throws Throwable {
//gc回收垃圾之前執行。
System.out.println("垃圾回收機制。。。");
super.finalize();
}
}