国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設(shè)計 > 正文

對象引用是怎樣嚴重影響垃圾收集器的

2019-11-18 11:33:07
字體:
供稿:網(wǎng)友

    假如您認為 java 游戲開發(fā)人員是 Java 編程世界的一級方程式賽車手,那么您就會明白為什么他們會如此地重視程序的性能。 游戲開發(fā)人員幾乎天天都要面對的性能問題,往往超過了一般程序員考慮問題的范圍。哪里可以找到這些非凡的開發(fā)人員呢?Java 游戲社區(qū)就是一個好去處。 雖然在這個站點可能沒有很多關(guān)于服務(wù)器端的應(yīng)用,但是我們依然可以從中受益,看看這些“惜比特如金”的游戲開發(fā)人員天天所面對的,我們往往能從中得到寶貴的經(jīng)驗。讓我們開始游戲吧!

  對象泄漏
  游戲程序員跟其他程序員一樣——他們也需要理解 Java 運行時環(huán)境的一些微妙之處,比如垃圾收集。垃圾收集可能是使您感到難于理解的較難的概念之一, 因為它并不能總是毫無遺漏地解決 Java 運行時環(huán)境中堆治理的問題。似乎有很多類似這樣的討論,它的開頭或結(jié)尾寫著:“我的問題是關(guān)于垃圾收集”。

  假如您正面遭遇內(nèi)存耗盡(out-of-memory)的錯誤。于是您使用檢測工具想要找到問題所在,但這是徒勞的。您很輕易想到另外一個比較可信的原因:這是 Java 虛擬機堆治理的問題,而不會認為這是您自己的程序的緣故。但是,正如 Java 游戲社區(qū)的資深專家不止一次地解釋的,Java 虛擬機并不存在任何被證實的對象泄漏問題。實踐證實,垃圾收集器一般能夠精確地判定哪些對象可被收集,并且重新收回它們的內(nèi)存空間給 Java 虛擬機。所以,假如您碰到了內(nèi)存耗盡的錯誤,那么這完全可能是由您的程序造成的,也就是說您的程序中存在著“無意識的對象保留(unintentional object retention)”。

  內(nèi)存泄漏與無意識的對象保留
  內(nèi)存泄漏和無意識的對象保留的區(qū)別是什么呢?對于用 Java 語言編寫的程序來說,確實沒有區(qū)別。兩者都是指在您的程序中存在一些對象引用,但實際上您并不需要引用這些對象。一個典型的例子是向一個集合中加入一些對象以便以后使用它們,但是您卻忘了在使用完以后從集合中刪除這些對象。因為集合可以無限制地擴大,并且從來不會變小,所以當您在集合中加入了太多的對象(或者是有很多的對象被集合中的元素所引用)時,您就會因為堆的空間被填滿而導致內(nèi)存耗盡的錯誤。垃圾收集器不能收集這些您認為已經(jīng)用完的對象,因為對于垃圾收集器來說,應(yīng)用程序仍然可以通過這個集合在任何時候訪問這些對象,所以這些對象是不可能被當作垃圾的。

  對于沒有垃圾收集的語言來說,例如 C++ ,內(nèi)存泄漏和無意識的對象保留是有區(qū)別的。C++ 程序跟 Java 程序一樣,可能產(chǎn)生無意識的對象保留。但是 C++ 程序中存在真正的內(nèi)存泄漏,即應(yīng)用程序無法訪問一些對象以至于被這些對象使用的內(nèi)存無法釋放且返還給系統(tǒng)。令人欣慰的是,在 Java 程序中,這種內(nèi)存泄漏是不可能出現(xiàn)的。所以,我們更喜歡用“無意識的對象保留”來表示這個令 Java 程序員抓破頭皮的內(nèi)存問題。這樣,我們就能區(qū)別于其他使用沒有垃圾收集語言的程序員。

  跟蹤被保留的對象
  那么當發(fā)現(xiàn)了無意識的對象保留該怎么辦呢?首先,需要確定哪些對象是被無意保留的,并且需要找到究竟是哪些對象在引用它們。然后必須安排好 應(yīng)該在哪里釋放它們。最輕易的方法是使用能夠?qū)Χ旬a(chǎn)生快照的檢測工具來標識這些對象,比較堆的快照中對象的數(shù)目,跟蹤這些對象,找到引用這些對象的對象,然后強制進行垃圾收集。有了這樣一個檢測器,接下來的工作相對而言就比較簡單了:

  等待直到系統(tǒng)達到一個穩(wěn)定的狀態(tài),這個狀態(tài)下大多數(shù)新產(chǎn)生的對象都是暫時的,符合被收集的條件;這種狀態(tài)一般在程序所有的初始化工作都完成了之后。
  強制進行一次垃圾收集,并且對此時的堆做一份對象快照。
  進行任何可以產(chǎn)生無意地保留的對象的操作。
  再強制進行一次垃圾收集,然后對系統(tǒng)堆中的對象做第二次對象快照。
  比較兩次快照,看看哪些對象的被引用數(shù)量比第一次快照時增加了。因為您在快照之前強制進行了垃圾收集,那么剩下的對象都應(yīng)該是被應(yīng)用程序所引用的對象,并且通過比較兩次快照我們可以準確地找出那些被程序保留的、新產(chǎn)生的對象。
  根據(jù)您對應(yīng)用程序本身的理解,并且根據(jù)對兩次快照的比較,判定出哪些對象是被無意保留的。
  跟蹤這些對象的引用鏈,找出究竟是哪些對象在引用這些無意地保留的對象,直到您找到了那個根對象,它就是產(chǎn)生問題的根源。

  顯式地賦空(nulling)變量
  一談到垃圾收集這個主題,總會涉及到這樣一個吸引人的討論,即顯式地賦空變量是否有助于程序的性能。賦空變量是指簡單地將 null 值顯式地賦值給這個變量,相對于讓該變量的引用失去其作用域。

QQ病毒 騰訊QQ空間代碼專題 PPT教程專題 ADSL應(yīng)用面面俱到 fireworks教程專題

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 腾冲县| 芒康县| 安平县| 辽中县| 商水县| 大余县| 安阳市| 延津县| 拜泉县| 华蓥市| 平泉县| 敦化市| 大理市| 平利县| 苍溪县| 溆浦县| 赤壁市| 广丰县| 宁陕县| 宁夏| 塔河县| 石台县| 定西市| 壤塘县| 新巴尔虎左旗| 宁化县| 南投市| 柘荣县| 永安市| 呼玛县| 泗阳县| 皮山县| 尼勒克县| 布拖县| 珲春市| 许昌县| 香港 | 溆浦县| 嘉峪关市| 延川县| 平原县|