Java基礎(八)-垃圾回收機制、類加載器

垃圾回收機制

針對堆內存而言的。當調用構造方法的時候,創建好一個對象,因爲Java中對每種數據類型都明確的給定了大小,在創建對象的時候,會自動計算大小分配內存,所以在內存的回收和釋放的時候也是由Java自己管理。

java垃圾回收判斷是否回收的算法,有兩種,一個是引用計數法,一個是引用可達法。 
引用計數法,每個對象有一個專門的空間維護一個引用計數器,當該對象被引用時,計數器加一,引用消失時則計數器減一,當該對象引用數爲0時則回收該對象。這個算法有一個好處就是可以及時回收廢棄的對象,而不用等到空間佔滿後在統一回收,但是其無法解決循環引用的情況。 
而引用可達性分析法,則是選取一個root節點,通過該節點是否能夠遍歷到某個對象的方法來判斷該對象是否被回收。root節點的選擇通常是靜態變量,native變量,常量等。 
垃圾回收清除算法有三種 
1.標記清除 
也就是每次GC,會先掃描內存區標記存活對象,而後釋放未被標記的對象空間。這種算法在工作時需要停止工作線程,再進行標記清除,同時會產生內存碎片,而且jvm需要維護一個內存空間表,用於分配內存空間。 
2.複製清除 
將內存區分爲兩個相同大小的區域,先在A上分配對象,當其分配滿後,進行標記操作,而後將標記對象按照內存順序複製到B區域中,最後將A區域全部清除。這種方式可以有效避免內存碎片的問題,但是複製操作會產生額外的耗時,當存活對象多時並不適合使用該算法,因爲複製所產生的耗時會很長。因此這種算法適合對象存活時間短的情況。同時會造成一定的內存浪費。 
3.標記整理 

這種算法就是在標記清除的基礎上爲了避免內存碎片的產生而優化產生的算法。總的過程分爲兩步,分別是標記和整理。

新生代由於其對象存活時間短,且需要經常gc,因此採用效率較高的複製算法。一個對象剛創建的時候是放到新生代的伊甸園區,如果這個對象在棧內存中沒有引用,那麼會在掃描的時候被解析,釋放內存;如果經過一次掃描依然沒有釋放內存,會將其移入新生代的倖存區,倖存區的掃描頻率略低於伊甸園區;如果在倖存區經過多次掃描依然沒有被釋放,會被放入老生代,老生代的掃描頻率遠遠低於新生代的。老生代中的對象一旦被回收,可能會造成程序的卡頓或者崩潰。

老年代和永久代因爲其存活對象時間長,因此使用標記清除或標記整理算法。

發生在新生代的回收稱之爲minor GCGarbage Collect---初代回收

發生在老生代的回收稱之爲full GC---完全回收

類加載器

啓動類加載器/引導類加載器

擴展類加載器

系統類加載器

***雙親委派機制

每個編寫的”.java”拓展名類文件都存儲着需要執行的程序邏輯,這些”.java”文件經過Java編譯器編譯成拓展名爲”.class”的文件,”.class”文件中保存着Java代碼經轉換後的虛擬機指令,當需要使用某個類時,虛擬機將會加載它的”.class”文件,並創建對應的class對象,將class文件加載到虛擬機的內存,這個過程稱爲類加載。

推薦:去網上看吧····作爲一個剛接觸java的小菜鳥 這個屬實有點難度。推薦看這兩個

https://blog.csdn.net/sunxianghuang/article/details/52093189

https://blog.csdn.net/javazejian/article/details/73413292

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