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