真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

如何解析Java對(duì)象引用與JVM自動(dòng)內(nèi)存管理

今天就跟大家聊聊有關(guān)如何解析Java對(duì)象引用與JVM自動(dòng)內(nèi)存管理,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、福州網(wǎng)絡(luò)推廣、微信小程序、福州網(wǎng)絡(luò)營(yíng)銷、福州企業(yè)策劃、福州品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供福州建站搭建服務(wù),24小時(shí)服務(wù)熱線:18980820575,官方網(wǎng)址:www.cdcxhl.com

解析Java對(duì)象引用與JVM自動(dòng)內(nèi)存管理(轉(zhuǎn))[@more@]對(duì)象引用應(yīng)用程序設(shè)計(jì)接口是JDKTM1.2中新定義的。該應(yīng)用程序設(shè)計(jì)接口允許應(yīng)用程序以對(duì)象引用的方式與JVM的內(nèi)存管理器進(jìn)行交互。當(dāng)應(yīng)用程序需管理大量?jī)?nèi)存對(duì)象或者在新的Java對(duì)象創(chuàng)建之前需刪除原有對(duì)象時(shí),Java對(duì)象引用應(yīng)用程序設(shè)計(jì)接口具有相當(dāng)大的用途,例如:

● 基于Web的應(yīng)用程序常常要求顯示大量圖片,當(dāng)用戶離開某一Web頁(yè)時(shí),往往不能確定是否能夠順利的返回。在這種程序中,應(yīng)用Java對(duì)象引用API可以創(chuàng)建這樣一個(gè)環(huán)境,即當(dāng)堆內(nèi)存以最小程度運(yùn)行時(shí),內(nèi)存管理器創(chuàng)建對(duì)象。當(dāng)用戶返回時(shí),應(yīng)用程序就會(huì)重新載入已經(jīng)創(chuàng)建的圖片。

● 應(yīng)用對(duì)象引用隊(duì)列可以創(chuàng)建這樣一個(gè)環(huán)境,當(dāng)通過對(duì)象引用獲得某一對(duì)象時(shí),應(yīng)用程序得到通知。然后,應(yīng)用程序就可以對(duì)相關(guān)對(duì)象進(jìn)行清除操作,同時(shí)使這些對(duì)象在內(nèi)存管理器中合法化。


內(nèi)存管理器的工作機(jī)制


下面將首先介紹未嵌入引用對(duì)象時(shí)內(nèi)存管理器的工作機(jī)制,然后討論引用對(duì)象加入之后Java堆發(fā)生的變化。

內(nèi)存管理器的作用就是識(shí)別程序中不再使用的對(duì)象,并且回收其內(nèi)存。

一個(gè)Java應(yīng)用程序由一系列線程組成,每個(gè)線程執(zhí)行一系列方法,而每個(gè)方法通過參數(shù)或局部變量來引用對(duì)象。這些引用屬于引用集合中的一部分,直接進(jìn)入應(yīng)用程序。另外,引用集合中還包括類庫(kù)中定義的靜態(tài)引用變量,以及通過Java本地接口(JNI)API獲得的引用。引用集合中的所有引用對(duì)象都可以被當(dāng)前應(yīng)用程序獲取,而不必被回收。同樣地,這些對(duì)象可能包含對(duì)其它對(duì)象的引用,也可以被應(yīng)用程序獲取,依此類推。Java堆中的其它對(duì)象視為不可獲取的,而所有這些不可獲取的對(duì)象在內(nèi)存管理中也是合法的。如果一個(gè)不可獲取的對(duì)象使用finalize()方法,任務(wù)就交給了對(duì)象所調(diào)用的收尾器(finalizer)。在內(nèi)存回收期間,不具有收尾器的不可獲取對(duì)象和已經(jīng)調(diào)用收尾器的對(duì)象被簡(jiǎn)單回收。

內(nèi)存回收的算法是不斷變化的,共性的方面是從引用集合中識(shí)別可獲取的對(duì)象以及回收被其它對(duì)象占據(jù)的內(nèi)存空間。

加入引用對(duì)象之后的引用與常規(guī)引用的區(qū)別在于,引用對(duì)象中的引用專門由內(nèi)存管理器來處理。引用對(duì)象封裝了其它一些對(duì)象的引用,我們稱之為指示對(duì)象。在引用對(duì)象創(chuàng)建的同時(shí),也就定義了該引用對(duì)象的指示對(duì)象。

根據(jù)應(yīng)用程序要求,對(duì)象可以是強(qiáng)引用(strong references)、次引用(soft references)、弱引用(weak references)、虛引用(phantom references)的任意組合。為了確定對(duì)象的可獲取程度,JVM內(nèi)存管理器從引用集合出發(fā)遍尋堆中所有到對(duì)象的路徑。當(dāng)?shù)竭_(dá)某對(duì)象的任意路徑都不含有引用對(duì)象時(shí),則稱該對(duì)象具有強(qiáng)獲取能力;當(dāng)路徑中含有一個(gè)或幾個(gè)引用對(duì)象時(shí),根據(jù)內(nèi)存管理器所查詢的引用對(duì)象的類型分別歸為次獲取、弱獲取、虛獲取。

另外,對(duì)象引用API中還定義了引用對(duì)象隊(duì)列(java.lang.ref.ReferenceQueue),這是內(nèi)存管理器對(duì)引用對(duì)象進(jìn)行管理的一種簡(jiǎn)單數(shù)據(jù)結(jié)構(gòu)。值得注意的是,在進(jìn)行引用對(duì)象定義時(shí),要求phantom reference對(duì)象必須產(chǎn)生于一個(gè)引用對(duì)象隊(duì)列,而soft reference和weak reference對(duì)象則無此限制,如:

ReferenceQueue queue = new ReferenceQueue();
PhantomReference pr = new PhantomReference(object, queue);

Soft References 應(yīng)用實(shí)例


下面以在基于web的應(yīng)用程序中使用soft references為例,來說明Java對(duì)象引用與JVM的內(nèi)存管理器進(jìn)行交互的原理。

當(dāng)用戶打開某一web頁(yè)時(shí),applet代碼獲得圖片并且得到顯示。如果在代碼中同時(shí)創(chuàng)建了該圖片對(duì)象的soft references,那么當(dāng)用戶離開該web頁(yè)時(shí),內(nèi)存管理器對(duì)圖片所分配的內(nèi)存是否回收做出選擇。當(dāng)用戶返回該web頁(yè)時(shí),在applet代碼中使用SoftReference.get方法就會(huì)得到圖片才內(nèi)存中是否仍存在的消息。如果在內(nèi)存管理器中未創(chuàng)建該圖片,在web頁(yè)上會(huì)很快得到顯示;否則,applet代碼就會(huì)重新獲取。

下面是Example.java的完整源代碼。



import java.awt.Graphics;import java.awt.Image;import java.applet.Applet;import java.lang.ref.SoftReference;public class Example extends Applet { SoftReference sr = null; public void init() { System.out.println("Initializing"); } public void paint(Graphics g) { Image im = (sr == null) ? null : (Image)(sr.get()); if (im == null) { System.out.println("Fetching image"); im = getImage(getCodeBase(),"yundong.gif"); sr = new SoftReference(im); } System.out.println("Painting"); g.drawImage(im, 25, 25, this); g.drawString("運(yùn)動(dòng)之美",20,20); im = null; /* Clear the strong reference to the image */ } public void start() { System.out.println("Starting"); } public void stop() { System.out.println("Stopping"); }}


在上面的代碼中,對(duì)象image是一個(gè)圖片對(duì)象,傳遞給一個(gè)SoftReference對(duì)象sr。其中image對(duì)象是sr的指示對(duì)象,sr中的引用域是從次引用(soft reference)到 image。


Weak References分析


對(duì)于一個(gè)穩(wěn)定的對(duì)象,比如說線程類對(duì)象,當(dāng)需要獲取外部數(shù)據(jù)時(shí),在程序中應(yīng)用weak references是非常理想的。如果利用引用隊(duì)列創(chuàng)建了某一線程的weak reference,那么當(dāng)線程不再具有強(qiáng)獲取能力時(shí),應(yīng)用程序得到通知,根據(jù)此通知,應(yīng)用程序才能執(zhí)行相關(guān)數(shù)據(jù)對(duì)象的清除工作。

當(dāng)內(nèi)存管理器未發(fā)現(xiàn)strong references 和 soft references 時(shí),我們稱對(duì)象具有弱獲取能力,即在到達(dá)該對(duì)象的路徑中至少包含一個(gè)weak reference。程序中weak references被清除一段時(shí)間后,弱獲取對(duì)象被收尾器收集。由此也可以看出,soft reference和weak reference之間的區(qū)別在于,應(yīng)用soft reference時(shí),內(nèi)存管理器利用算法決定是否創(chuàng)建弱獲取對(duì)象,而應(yīng)用weak reference時(shí),內(nèi)存管理器必須創(chuàng)建次獲取對(duì)象。


引用對(duì)象鏈


當(dāng)?shù)竭_(dá)某一對(duì)象的路徑中含有多個(gè)引用對(duì)象時(shí),就構(gòu)成了引用對(duì)象鏈。內(nèi)存管理器按照由強(qiáng)到弱的順序處理引用對(duì)象,具體處理步驟包括:Soft references、 Weak references、Finalization、Phantom references和創(chuàng)建對(duì)象五個(gè)部分。

當(dāng)內(nèi)存管理器未發(fā)現(xiàn)前三種對(duì)象引用時(shí),我們稱對(duì)象具有虛獲取能力,即在到達(dá)該對(duì)象的路徑中至少包含一個(gè)phantom reference。虛引用對(duì)象直接被收尾器收集,而不被重新創(chuàng)建。當(dāng)內(nèi)存管理器發(fā)現(xiàn)只有phantom references時(shí),對(duì)象就將處于等候phantom reference狀態(tài),應(yīng)用程序向引用隊(duì)列發(fā)出通知,然后對(duì)虛引用對(duì)象調(diào)用clear()方法,將其引用域設(shè)置為null,最后對(duì)不可獲取對(duì)象執(zhí)行收集清除處理任務(wù)。

通常,對(duì)象所具有的獲取能力與引用對(duì)象集合直接路徑中的最弱連接者相同。據(jù)此可以看出:

虛引用對(duì)象具有強(qiáng)獲取能力,其它對(duì)象均具虛獲取能力;

(b)中虛引用對(duì)象和弱引用對(duì)象均具強(qiáng)獲取能力,故次引用對(duì)象和對(duì)象集合具有若獲取能力;

(c)中虛引用對(duì)象、弱引用對(duì)象和次引用對(duì)象均具強(qiáng)獲取能力,那么對(duì)象集合則具次獲取能力。

● 在程序中使用引用對(duì)象API不但可以在一定程度上控制內(nèi)存管理器,實(shí)現(xiàn)內(nèi)存自動(dòng)管理,還可以提高程序的穩(wěn)定性和安全性。

● 引用對(duì)象鏈中各個(gè)對(duì)象的獲取能力與整個(gè)鏈相關(guān)。

看完上述內(nèi)容,你們對(duì)如何解析Java對(duì)象引用與JVM自動(dòng)內(nèi)存管理有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。


新聞名稱:如何解析Java對(duì)象引用與JVM自動(dòng)內(nèi)存管理
分享路徑:http://weahome.cn/article/jhjsjs.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部