六月婷婷综合激情-六月婷婷综合-六月婷婷在线观看-六月婷婷在线-亚洲黄色在线网站-亚洲黄色在线观看网站

明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

垃圾收集器與Java編程

[摘要]垃圾收集器(Garbage Collector,GC)對Java程序員來說,基本上是透明的,但是一個優秀的Java程序員必須了解GC的工作原理、如何優化GC的性能、如何與GC進行有限的交互,因為有一些應用程序對性能要求較高,例如嵌入式系統、實時系統等,只有全面提升內存的管理效率 ,才能提高整個應用...
垃圾收集器(Garbage Collector,GC)對Java程序員來說,基本上是透明的,但是一個優秀的Java程序員必須了解GC的工作原理、如何優化GC的性能、如何與GC進行有限的交互,因為有一些應用程序對性能要求較高,例如嵌入式系統、實時系統等,只有全面提升內存的管理效率 ,才能提高整個應用程序的性能。本篇文章首先簡單介紹GC的工作原理之后,然后再對GC的幾個關鍵問題進行深入探討,最后提出一些Java程序設計建議,從GC角度提高Java程序的性能。

  GC的基本原理

  Java的內存管理實際上就是對象的管理,其中包括對象的分配和釋放。

  對于程序員來說,分配對象使用new關鍵字;釋放對象時,只要將對象所有引用賦值為null,讓程序不能夠再訪問到這個對象,我們稱該對象為"不可達的"。GC將負責回收所有"不可達"對象的內存空間。

  對于GC來說,當程序員創建對象時,GC就開始監控這個對象的地址、大小以及使用情況。通常,GC采用有向圖的方式記錄和管理堆(heap)中的所有對象(詳見 參考資料1 )。通過這種方式確定哪些對象是"可達的",哪些對象是"不可達的"。當GC確定一些對象為"不可達"時,GC就有責任回收這些內存空間。但是,為了保證GC能夠在不同平臺實現的問題,Java規范對GC的很多行為都沒有進行嚴格的規定。例如,對于采用什么類型的回收算法、什么時候進行回收等重要問題都沒有明確的規定。因此,不同的JVM的實現者往往有不同的實現算法。這也給Java程序員的開發帶來行多不確定性。本文研究了幾個與GC工作相關的問題,努力減少這種不確定性給Java程序帶來的負面影響。

  增量式GC( Incremental GC )

  GC在JVM中通常是由一個或一組進程來實現的,它本身也和用戶程序一樣占用heap空間,運行時也占用CPU。當GC進程運行時,應用程序停止運行。因此,當GC運行時間較長時,用戶能夠感到Java程序的停頓,另外一方面,如果GC運行時間太短,則可能對象回收率太低,這意味著還有很多應該回收的對象沒有被回收,仍然占用大量內存。因此,在設計GC的時候,就必須在停頓時間和回收率之間進行權衡。一個好的GC實現允許用戶定義自己所需要的設置,例如有些內存有限有設備,對內存的使用量非常敏感,希望GC能夠準確的回收內存,它并不在意程序速度的放慢。另外一些實時網絡游戲,就不能夠允許程序有長時間的中斷。增量式GC就是通過一定的回收算法,把一個長時間的中斷,劃分為很多個小的中斷,通過這種方式減少GC對用戶程序的影響。雖然,增量式GC在整體性能上可能不如普通GC的效率高,但是它能夠減少程序的最長停頓時間。


  Sun JDK提供的HotSpot JVM就能支持增量式GC。HotSpot JVM缺省GC方式為不使用增量GC,為了啟動增量GC,我們必須在運行Java程序時增加-Xincgc的參數。HotSpot JVM增量式GC的實現是采用Train GC算法。它的基本想法就是,將堆中的所有對象按照創建和使用情況進行分組(分層),將使用頻繁高和具有相關性的對象放在一隊中,隨著程序的運行,不斷對組進行調整。當GC運行時,它總是先回收最老的(最近很少訪問的)的對象,如果整組都為可回收對象,GC將整組回收。這樣,每次GC運行只回收一定比例的不可達對象,保證程序的順暢運行。

  詳解finalize函數

  finalize是位于Object類的一個方法,該方法的訪問修飾符為protected,由于所有類為Object的子類,因此用戶類很容易訪問到這個方法。由于,finalize函數沒有自動實現鏈式調用,我們必須手動的實現,因此finalize函數的最后一個語句通常是super.finalize()。通過這種方式,我們可以實現從下到上實現finalize的調用,即先釋放自己的資源,然后再釋放父類的資源。

  根據Java語言規范,JVM保證調用finalize函數之前,這個對象是不可達的,但是JVM不保證這個函數一定會被調用。另外,規范還保證finalize函數最多運行一次。

  很多Java初學者會認為這個方法類似與C++中的析構函數,將很多對象、資源的釋放都放在這一函數里面。其實,這不是一種很好的方式。原因有三,其一,GC為了能夠支持finalize函數,要對覆蓋這個函數的對象作很多附加的工作。其二,在finalize運行完成之后,該對象可能變成可達的,GC還要再檢查一次該對象是否是可達的。因此,使用finalize會降低GC的運行性能。其三,由于GC調用finalize的時間是不確定的,因此通過這種方式釋放資源也是不確定的。

  通常,finalize用于一些不容易控制、并且非常重要資源的釋放,例如一些I/O的操作,數據的連接。這些資源的釋放對整個應用程序是非常關鍵的。在這種情況下,程序員應該以通過程序本身管理(包括釋放)這些資源為主,以finalize函數釋放資源方式為輔,形成一種雙保險的管理機制,而不應該僅僅依靠finalize來釋放資源。



主站蜘蛛池模板: 日韩推理片在线免费看网站 | 日韩视频精品在线 | 青青在线播放 | 日本免费网站在线观看 | 天天射天天搞 | 欧美一区二区三区四区五区六区 | 日韩免费a级在线观看 | 午夜视频免费观看 | 日产精品卡二卡三卡四卡乱码视频 | 齐天大性床战铁扇公主 | 色婷婷中文字幕在线一区天堂 | 手机看片国产精品 | 四虎影院观看视频 | 碰91精品国产91久久婷婷 | 婷婷97狠狠的狠狠的爱 | 午夜欧美福利 | 五月天婷婷丁香中文在线观看 | 日韩乱码中文字幕视频 | 日本成人免费 | 四虎永久在线观看视频精品 | 日日夜干 | 日本在线观看高清不卡免v 日本在线观看a | 日本一区午夜爱爱 | 特级黄色淫片 | 五月天婷婷免费观看视频在线 | 四虎永久在线精品免费影视 | 最新版天堂中文在线官网 | 香蕉视频在线观看网址 | 自拍 亚洲 | 日韩成人在线播放 | 在线播放国产区 | 我的秘密饭店 电视剧免费观看 | 五月婷婷激情四射 | 青青草a| 欧美一级视频在线观看 | 四虎国产永久免费久久 | 婷婷 色天使 | 日本不卡视频一区二区 | 日本一区午夜爱爱 | 天天干天天干天天干 | 求欧美精品网址 |