面試題:Java是如何管理內(nèi)存的?
答案:Java的內(nèi)存管理就是對(duì)象的分配和釋放問題。在Java中,程序員需要通過關(guān)鍵字new 為每個(gè)對(duì)象申請(qǐng)內(nèi)存空間,所有的對(duì)象在堆中分配空間。另外,對(duì)象的釋放是有GC決定和執(zhí)行的。在Java中,內(nèi)存的分配是由程序完成的。而內(nèi)存的釋放室友GC完成的,這種收支兩條線的方法確實(shí)簡化了程序員的工作。但同時(shí),它也加重了JVM的工作。這也是Java程序運(yùn)行速度較慢的原因之一。因?yàn)?/span>GC為了能夠正確釋放對(duì)象,必須監(jiān)控每一個(gè)對(duì)象的運(yùn)行狀態(tài),包括對(duì)象的申請(qǐng)、引用、被引用、賦值等,GC都需要進(jìn)行監(jiān)控。
監(jiān)視對(duì)象狀態(tài)是為了更加準(zhǔn)確、及時(shí)地釋放對(duì)象,而釋放對(duì)象的根本原則就是該對(duì)象不再被引用。
為了更好的理解GC的工作原理,我們可以將對(duì)象考慮為有向圖的頂點(diǎn),將引用關(guān)系考慮為圖的有向邊,有向邊從引用者指向被引用對(duì)象。另外,每個(gè)線程對(duì)象可以作為一個(gè)圖的起始頂點(diǎn),例如,大多程序從main進(jìn)程開始執(zhí)行,那么該圖就是以main進(jìn)程頂點(diǎn)開始的一棵根樹。在這個(gè)有向圖中,根頂點(diǎn)可達(dá)的對(duì)象都是有效對(duì)象,GC將不回收這些對(duì)象。如果某個(gè)對(duì)象與這個(gè)根頂點(diǎn)不可達(dá),那么我們認(rèn)為這個(gè)對(duì)象不再被引用,可以被GC回收。
更多Java知識(shí),Java視頻,Java教程盡在動(dòng)力節(jié)點(diǎn)Java培訓(xùn),關(guān)注動(dòng)力節(jié)點(diǎn)官方微信,獲得一手Java面試題。