首页 → 名言 → 毅力格言
總結java垃圾回收器的方法和原理 總結java垃圾回收器的方法和原理論文
日期:2023-02-24 07:50:50    编辑:网络投稿    来源:网络资源
總結Java垃圾回收器的方法和原理  總結是在某一特定時間段對學習和工作生活或其完成情況,包括取得的成績、存在的問題及得到的經驗和教訓加以回顧和分析的書面材料,它能幫我
为你推荐:
  • 網名有創意逗比昵稱
  • 總結Java垃圾回收器的方法和原理

      總結是在某一特定時間段對學習和工作生活或其完成情況,包括取得的成績、存在的問題及得到的經驗和教訓加以回顧和分析的書面材料,它能幫我們理順知識結構,突出重點,突破難點,不如靜下心來好好寫寫總結吧。總結你想好怎么寫了嗎?下面是小編精心整理的總結Java垃圾回收器的方法和原理,歡迎大家借鑒與參考,希望對大家有所幫助。

    總結Java垃圾回收器的方法和原理

      總結Java垃圾回收器的方法和原理 1

      一、認識Java的自動垃圾回收

      垃圾回收是Java語言的一大特性,方便了編程,是以消耗性能為代價的。而垃圾在這里只無用的對象。而C++是需要程序員自己寫析構函數來釋放內存的,麻煩,也有可能忘記而導致內存泄露。

      Java語言對內存的分配管理是通過JVM內部機制決定的。程序員可以不關心其處理。

      二、垃圾回收的原理和意義

      Java虛擬機中有個稱之為垃圾回收器的東西,實際上這個東西也許真正不存在,或者是已經集成到JVM中了,但這無關緊要,我們仍然可以稱為為垃圾回收器。

      垃圾回收器的作用是查找和回收(清理)無用的對象。以便讓JVM更有效的使用內存。

      垃圾回收器的運行時間是不確定的,由JVM決定,在運行時是間歇執行的。雖然可以通過System.gc()來強制回收垃圾,但是這個命令下達后無法保證JVM會立即響應執行,但經驗表明,下達命令后,會在短期內執行你的請求。JVM通常會感到內存緊缺時候去執行垃圾回收操作。

      垃圾回收過于頻繁會導致性能下降,過于稀疏會導致內存緊缺。這個JVM會將其控制到最好,不用程序員擔心。但有些程序在短期會吃掉大量內存,而這些恐怖的對象很快使用結束了,這時候也許有必要強制下達一條垃圾回命令,這是很有必要的,以便有更多可用的物理內存。

      從上面了解到,沒有用的對象就是垃圾。準確的說,當沒有任何線程訪問一個對象時,該對象就符合垃圾回收的條件。

      對于String,存在一個字符串池,這個不屬于本文討論的范圍,字符串池中的垃圾回收,算法和這里所討論的垃圾回收完全是兩碼事。但是不得不說的是,字符串的胡亂拼接,往往導致性能急劇下降,尤其是在龐大的循環語句中,拼接字符串就是在讓程序慢性自殺。這也是很多Java程序員容易犯的毛病。

      字符串既然是池,就是為了緩沖,為了有更高的命中率,因此垃圾回收的頻率也許會比JVM對象垃圾回收器要低很多。

      垃圾回收器僅僅能做的是盡可能保證可用內存的使用效率,讓可用內存得到高效的管理。程序員可以影響垃圾回收的執行,但不能控制。

      三、通過編程影響垃圾回收

      雖然程序員無法控制JVM的垃圾回收機制。但是可以通過編程的手段來影響,影響的方法是,讓對象符合垃圾回收條件。

      分別說來有一下幾種:

      1、將無用對象賦值為null.

      2、重新為引用變量賦值。比如:

      Person p = new Person("aaa");

      p = new Person("bbb");

      這樣,new Person("aaa")這個對象就是垃圾了——符合垃圾回收條件了。

      3、讓相互聯系的對象稱為“島”對象

      Person p1 = new Person("aaa");

      Person p2 = new Person("bbb");

      Person p3 = new Person("ccc");

      p1=p2; p2=p3; p3=p1;

      p1=null; p2=null; p3=null;

      在沒有對p1、p2、p3置null之前,它們之間是一種三角戀關系。分別置null,三角戀關系依然存在,但是三個變量不在使用它們了。三個Person對象就組成了一個孤島,最后死在堆上——被垃圾回收掉。

      4、強制的垃圾回收System.gc()

      實際上這里的強制,是程序員的意愿、建議,什么時候執行是JVM的垃圾回收器說了算。

      調用垃圾回收也不一定能保證未使用的對象一定能從內存中刪除。

      唯一能保證的是,當你內存在極少的情況,垃圾回收器在程序拋出OutofMemaryException之前運行一次。

      總結Java垃圾回收器的方法和原理 2

      Java垃圾回收器是Java虛擬機(JVM)的三個重要模塊(另外兩個是解釋器和多線程機制)之一,為應用程序提供內存的自動分配(Memory Allocation)、自動回收(Garbage Collect)功能,這兩個操作都發生在Java堆上(一段內存快)。某一個時點,一個對象如果有一個以上的引用(Rreference)指向它,那么該對象就為活著的(Live),否則死亡(Dead),視為垃圾,可被垃圾回收器回收再利用。垃圾回收操作需要消耗CPU、線程、時間等資源,所以容易理解的是垃圾回收操作不是實時的發生(對象死亡馬上釋放),當內存消耗完或者是達到某一個指標(Threshold,使用內存占總內存的比列,比如0.75)時,觸發垃圾回收操作。有一個對象死亡的例外,java.lang.Thread類型的對象即使沒有引用,只要線程還在運行,就不會被回收。

      回收的機制

      依據統計分析可知,Java(包括一些其它高級語言)里面大多數對象生命周期都是短暫的,所以把Java內存分代管理。分代的目的無非就是為不同代的內存塊運用不同的'管理策略(算法),從而最大化性能。相對于年老代,通常年輕代要小很多,回收的頻率高,速度快。年老代則回收頻率低,耗時長。內存在年輕代里面分配,年輕代里面的對象經過多個回收周期依然存活的會自動晉升到年老代。

      設計選型(Design Choices)

      設計選型影響JVM垃圾回收器的實現難度,以及JVM的性能指標,適用于不同的場景。描述的是回收算法的風格特點。

      單線程串行回收 VS 多線程并行回收

      回收操作自身是否多線程處理的問題。單線程回收的優點是簡單,易實現,碎片少,適用于單核的機器。多線程并行回收在多核機器上面可以充分的利用CPU資源,減少回收的時間,增加生產力,缺點是復雜且可能有部分碎片沒有回收。

      回收時暫停應用線程 VS 回收和應用并發進行

      回收操作時是否暫停應用線程的問題。暫停應用線程的優點是簡單、準確、清理得比較干凈、清理的時間也短(CPU資源獨占),缺點是暫停應用線程之后會造成垃圾回收周期內應用的回應時間拉長,實時性非常高的系統比較敏感。回收和應用線程并行處理的優點是應用反應時間比較平穩、缺點是實現難度大、清理頻率高、可能有碎片。

      不合并釋放的內存片段 VS 合并釋放的內存片段 VS 把活著的復制到新的地方

      這三個選型描述的是如何管理死亡的內存塊片段。死亡的內存片段通常散落在堆的各個地方,如果不加以管理會有兩個問題,內存分配的時候因查找可用的內存而導致速度慢,小的碎片會導致內存的浪費(比如大的數組要求大的連續內存片段)。管理有兩種方式,把活著的內存挪到內存塊的某一端,記錄可用內存的開始位置,或者干脆把活著的內存復制到一個新的內存區域,原來的內存塊整個空出來。

      性能指標(Performance Metrics)

      ①生產率(Throughput)

      一個較長的周期(長的周期才有意義)內,非回收時間占總時間的比率。度量系統的運行效率。

      ②垃圾回收花費(Garbage Collection overhead)

      一個較長的周期內,回收時間占總時間的比率。與生產率相對應,加起來為100%。

      ③暫停時間間隔(Pause time)

      Java虛擬機在回收垃圾的時候,有的算法會暫停所有應用線程的執行,某些系統可能對暫停的時間間隔比較敏感。

      ④回收的頻率(Frequency of collection)

      平均多久會發生回收操作。

      ⑤內存占用的大小(Footprint)

      如堆的大小。

      ⑥、實時性(Promptness)

      自一個對象死亡起,經過多久該對象所占用內存被回收。

      垃圾回收的類型

      所有的回收器類型都是基于分代技術。Java HotSpot虛擬機包含三代,年輕代(Young Generation)、年老代(Old Generation)、永久代(Permanent Generation)。

      ①永久代

      存儲類、方法以及它們的描述信息。可以通過-XX:PermSize=64m和-XX:MaxPermSize=128m兩個可選項指定初始大小和最大值。通常 我們不需要調節該參數,默認的永久代大小足夠了,不過如果加載的類非常多,不夠用了,調節最大值即可。

      ②年老代

      主要存儲年輕代中經過多個回收周期仍然存活從而升級的對象,當然對于一些大的內存分配,可能也直接分配到永久代(一個極端的例子是年輕代根本就存不下)。

      ③年輕代

      絕大多數的內存分配回收動作都發生在年輕代。如下圖所示, 年輕代被劃分為三個區域,原始區(Eden)和兩個小的存活區(Survivor),兩個存活區按功能分為From和To。絕大多數的對象都在原始區分配,超過一個垃圾回收操作仍然存活的對象放到存活區。

      串行回收器(Serial Collector)

      單線程執行回收操作,回收期間暫停所有應用線程的執行,client模式下的默認回收器,通過-XX:+UseSerialGC命令行可選項強制指定。

    【總結Java垃圾回收器的方法和原理】相關文章:

    java垃圾回收的方法是什么10-31

    java垃圾回收算法講解11-01

    java垃圾回收機制10-31

    java垃圾回收機制是怎樣的12-08

    Java內存回收03-24

    java使用ConcurrentHashMap和計數器實現鎖的方法08-17

    Java 語言與C語言中垃圾回收的不同方式09-04

    Java工作原理09-22

    java實現web服務器的方法11-02

    这里有更多你想看的
  • 值得認真品讀的人生
    • 本类最新
    • 精品图文
    • 时尚
    • 新闻
    • 生活
    • 视觉
    • 微爱
      栏目ID=88的表不存在(操作类型=0)

    头条推荐

    热门推荐

    特别推荐

    返回顶部