聲明:本文只是做一個總結(jié),有關(guān)jvm的詳細(xì)知識可以參考本人之前的系列文章,尤其是那篇:Java虛擬機(jī)詳解04—-GC算法和種類。那篇文章和本文是面試時的重點。
面試必問關(guān)鍵詞:JVM垃圾回收、類加載機(jī)制。
一、Java引用的狀態(tài):
強(qiáng)引用:
用的最廣。我們平時寫代碼時,new一個Object存放在堆內(nèi)存,然后用一個引用指向它,這就是強(qiáng)引用。
* 如果一個對象具有強(qiáng)引用,那垃圾回收器絕不會回收它*。當(dāng)內(nèi)存空間不足,Java虛擬機(jī)寧愿拋出OutOfMemoryError錯誤,使程序異常終止,也不會靠隨意回收具有強(qiáng)引用的對象來解決內(nèi)存不足的問題。
軟引用:
如果一個對象只具有軟引用,則內(nèi)存空間足夠時,垃圾回收器就不會回收它;如果內(nèi)存空間不足了,就會回收這些對象的內(nèi)存。(備注:如果內(nèi)存不足,隨時有可能被回收。)
只要垃圾回收器沒有回收它,該對象就可以被程序使用。軟引用可用來實現(xiàn)內(nèi)存敏感的高速緩存。
弱引用:
弱引用與軟引用的區(qū)別在于:只具有弱引用的對象擁有更短暫的生命周期。
* 每次執(zhí)行GC的時候,一旦發(fā)現(xiàn)了只具有弱引用的對象,不管當(dāng)前內(nèi)存空間足夠與否,都會回收它的內(nèi)存。不過,由于垃圾回收器是一個優(yōu)先級很低的線程,因此不一定會很快發(fā)現(xiàn)那些只具有弱引用的對象*。
虛引用:
“虛引用”顧名思義,就是形同虛設(shè),與其他幾種引用都不同,虛引用并不會決定對象的生命周期。如果一個對象僅持有虛引用,那么它就和沒有任何引用一樣,在任何時候都可能被垃圾回收器回收。
虛引用主要用來跟蹤對象被垃圾回收器回收的活動。
二、Java中的內(nèi)存劃分:
Java程序在運行時,需要在內(nèi)存中的分配空間。為了提高運算效率,就對數(shù)據(jù)進(jìn)行了不同空間的劃分,因為每一片區(qū)域都有特定的處理數(shù)據(jù)方式和內(nèi)存管理方式。
上面這張圖就是jvm運行時的狀態(tài)。具體劃分為如下5個內(nèi)存空間:(非常重要)
- 程序計數(shù)器:保證線程切換后能恢復(fù)到原來的執(zhí)行位置
- 虛擬機(jī)棧:(棧內(nèi)存)為虛擬機(jī)執(zhí)行java方法服務(wù):方法被調(diào)用時創(chuàng)建棧幀–>局部變量表->局部變量、對象引用
- 本地方法棧:為虛擬機(jī)執(zhí)使用到的Native方法服務(wù)
- 堆內(nèi)存:存放所有new出來的東西
- 方法區(qū):存儲被虛擬機(jī)加載的類信息、常量、靜態(tài)常量、靜態(tài)方法等。
- 運行時常量池(方法區(qū)的一部分)
GC對它們的回收:
內(nèi)存區(qū)域中的程序計數(shù)器、虛擬機(jī)棧、本地方法棧這3個 |
 |
|