垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?...
一、垃圾回收器的基本原理是什么?垃圾回收器可以馬上回收內(nèi)存嗎?有什么辦法主動(dòng)通知虛擬機(jī)進(jìn)行垃圾回收?
? 1、對(duì)于GC來說,當(dāng)程序員創(chuàng)建對(duì)象時(shí),GC就開始監(jiān)控這個(gè)對(duì)象的地址、大小以及使用情況。
? ? ? ?通常,GC采用有向圖的方式記錄和管理堆(heap)中的所有對(duì)象。通過這種方式確定哪些對(duì)象是"可達(dá)的",哪些對(duì)象是"不可達(dá)的"。當(dāng)GC確定一些對(duì)象為"不可達(dá)"時(shí),GC就有責(zé)任回收這些內(nèi)存空間。
? ? ?2、可以。程序員可以手動(dòng)執(zhí)行System.gc(),通知GC運(yùn)行,但是Java語言規(guī)范并不保證GC一定會(huì)執(zhí)行。
二、這里我們?cè)敿?xì)了解一下System.gc()的工作原理:
?Java中的內(nèi)存分配是隨著new一個(gè)新的對(duì)象來實(shí)現(xiàn)的,這個(gè)很簡(jiǎn)單,而且也還是有一些可以“改進(jìn)”內(nèi)存回收的機(jī)制的,其中最顯眼的就是這個(gè)System.gc()函數(shù)。
? 乍一看這個(gè)函數(shù)似乎是可以進(jìn)行垃圾回收的,可事實(shí)并不是那么簡(jiǎn)單。
? 其實(shí)這個(gè)gc()函數(shù)的作用只是提醒虛擬機(jī):程序員希望進(jìn)行一次垃圾回收。但是它不能保證垃圾回收一定會(huì)進(jìn)行,而且具體什么時(shí)候進(jìn)行是取決于具體的虛擬機(jī)的,不同的虛擬機(jī)有不同的對(duì)策。
? 那么下一個(gè)問題就是:gc()進(jìn)行回收的準(zhǔn)則是什么?也就是說什么樣的對(duì)象可以被回收?
簡(jiǎn)單來說就是:沒有被任何可達(dá)變量指向的對(duì)象。這里的可達(dá)是我發(fā)明的……意思就是能夠找到的,那什么樣的是不可達(dá)的呢?
比如說:
1 a.v = b; 2 b.v = c; 3 /* 4 *Watch out ! 5 */ 6 a.v = d;
看一下這段代碼:
第一行:對(duì)象a的變量v指向了對(duì)象b
第二行:對(duì)象b的變量v指向了對(duì)象c
第六行:對(duì)象a的變量v指向了變量d。
這個(gè)時(shí)候,雖然變量c指向的對(duì)象有c以及b.v指向它,但是它們都已經(jīng)不可達(dá)了,為什么?因?yàn)槲ㄒ豢梢哉业剿鼈兊氖莂.v,但是現(xiàn)在a.v指向了d,所以他們就是不可達(dá)的了。
理由也很直觀:沒有任何可達(dá)變量指向你,你還有活下去的理由嗎?你就算活下去誰能找得到你呢?
所以說,C++中將釋放了的指針置為null的習(xí)慣要保留到Java中,因?yàn)檫@有可能是你釋放內(nèi)存的唯一途徑。
最后的箴言:不要頻繁使用gc函數(shù)。
我的建議是:保持代碼健壯(記得將不用的變量置為null),讓虛擬機(jī)去管理內(nèi)存。
轉(zhuǎn)載于:https://www.cnblogs.com/wangjintao-0623/p/9598922.html
總結(jié)
以上是生活随笔為你收集整理的垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 钓鲢鱼水怪怎么装饵料?
- 下一篇: 牛头多少钱啊?