一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術|正則表達式|

服務器之家 - 編程語言 - JAVA教程 - Java垃圾回收器的方法和原理總結

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

2020-07-14 17:43kimy JAVA教程

本篇文章主要介紹了Java垃圾回收器的方法和原理總結,Java垃圾回收器是Java虛擬機的重要模塊,具有一定的參考價值,有興趣的可以了解一下。

什么是Java垃圾回收器

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

回收的機制

依據統計分析可知,Java(包括一些其它高級語言)里面大多數對象生命周期都是短暫的,所以把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。絕大多數的對象都在原始區分配,超過一個垃圾回收操作仍然存活的對象放到存活區。

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

串行回收器(Serial Collector)

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

①年輕代的回收算法(Minor Collection)

把Eden區的存活對象移到To區,To區裝不下直接移到年老代,把From區的移到To區,To區裝不下直接移到年老代,From區里面年齡很大的升級到年老代。 回收結束之后,Eden和From區都為空,此時把From和To的功能互換,From變To,To變From,每一輪回收之前To都是空的。設計的選型為復制。

②年老代的回收算法(Full Collection)

年老代的回收分為三個步驟,標記(Mark)、清除(Sweep)、合并(Compact)。標記階段把所有存活的對象標記出來,清除階段釋放所有死亡的對象,合并階段 把所有活著的對象合并到年老代的前部分,把空閑的片段都留到后面。設計的選型為合并,減少內存的碎片。

并行回收器(Parallel Collector)

使用多個線程同時進行垃圾回收,多核環境里面可以充分的利用CPU資源,減少回收時間,增加JVM生產率,Server模式下的默認回收器。與串行回收器相同,回收期間暫停所有應用線程的執行。通過-XX:+UseParallelGC命令行可選項強制指定。

①年輕代的回收算法(Minor Collection)

使用多個線程回收垃圾,每一個線程的算法與串行回收器相同。

②年老代的回收算法(Full Collection)

年老代依然是單線程的,與串行回收器相同。

并行合并收集器(Parallel Compacting Collection)

年輕代和年老代的回收都是用多線程處理。通過命令可選項-XX:+UseParallelOldGC指定,–XX:ParallelGCThreads=3還可進一步指定參與并行回收的線程數。與串行回收器相同,回收期間暫停所有應用線程的執行。與并行回收器相比,年老代的回收時間更短,從而減少了暫停時間間隔(Pause time)。通過–XX:+UseParallelOldGC命令行可選項強制指定。

①年輕代的回收算法(Minor Collection)

與并行回收器(Parallel Collector)相同

②年老代的回收算法(Full Collection)

年老代分為三個步驟,標記、統計、合并。這里用到分的思想,把年老代劃分為很多個固定大小的區(region)。 標記階段,把所有存活的對象劃分為N組(應該與回收線程數相同),每一個線程獨立的負責自己那一組,標記存活對象的位置以及 所在區(Region)的存活率信息,標記為并行的。統計階段,統計每一個區(Region)的存活率,原則上靠前面的存活率較高,從前到后, 找到值得合并的開始位置(絕大多數對象都存活的區不值得合并),統計階段是串行的(單線程)。合并階段,依據統計階段的信息,多線程 并行的把存活的對象從一個區(Region)復制到另外一個區(Region)。

并發標記清除回收器(Concurrent Mark-Sweep Collector)

又名低延時收集器(Low-latency Collector),通過各種手段使得應用程序被掛起的時間最短。基本與應用程序并發地執行回收操作,沒有合并和復制操作。通過命令行-XX:+UseConcMarkSweepGC指定,在單核或者雙核系統里面還可以指定使用增量式回收模式-XX:+UseConcMarkSweepGC。增量式回收是指把回收操作分為多個片段,執行一個片段之后釋放CPU資源給應用程序,未來的某個時點接著上次的結果繼續回收下去。目的也是減少延時。

①年輕代的回收算法(Minor Collection)

與并行回收器(Parallel Collector)相同

②年老代的回收算法(Full Collection)

分為四個步驟,初始標記(Initial Mark)、并發標記(Concurrent Mark)、再次標記(Remark)、以及并發清理(Concurrent Sweep)。特別注意,沒有合并操作,所以會有碎片。

  • 初始化階段: 暫停應用線程,找出所有存活的對象,耗時比較短,回收器使用單線程。
  • 并發標記階段: 回收器標記操作與應用并發運行,回收器使用單線程標記存活對象。
  • 再次標記:并發標記階段由于應用程序也在運行,這個過程中可能新增或者修改對象。所以再次暫停應用線程,找出所有修改的對象,使用多線程標記。
  • 并發清理:回收器清理操作與應用并發運行,回收器使用單線程清理死亡對象。

Java垃圾回收器的性能評估工具

①–XX:+PrintGCDetails和–XX:+PrintGCTimeStamps

垃圾回收的開始時間,持續時間,每一代的空余內存等信息。

②jmap [options] pid

jamp 2043 查看2043進程里面已經加載的共享對象。通常DLL文件。

jmap -heap 2043 查看內存堆的配置信息以及使用情況。

jmap -permstat 2043 查看永久代的加載情況。

jmap -histo 2043 查看類的加載和內存占用情況。

③jstat [options] pid

jstat -class 2043 class加載、卸載、內存占用情況。

jstat -gc 2043 GC執行情況。

后記

Java提供自動選擇和自動性能優化功能。在做垃圾回收器調優之前,先列出所關注的性能指標,通過命令行告訴JVM你所關注的性能指標,由JVM自動調優,如果不滿意,可以指定垃圾回收器。OutOfMemory通常是由于堆內存不足,調節-Xmx1024m和-XX:MaxPermSize=128m命令行可選項即可。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://blog.csdn.net/kimylrong/article/details/18265807

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 精品国产福利在线观看一区 | www伊人| 扒开老师挠尿口到崩溃刑罚 | 四虎精品永久在线网址 | 亚洲第一色视频 | 女人是男人的未来1分49分 | 99视频九九精品视频在线观看 | 三级全黄的视频 | 十六以下岁女子毛片免费 | 青草视频免费观看在线观看 | 欧美free激情野战hd | 好吊色永久免费视频大全 | 小草视频免费观看在线 | 国产新疆成人a一片在线观看 | 娇妻在床上迎合男人 | 国产精品视频一区二区三区经 | 国产剧情一区二区三区 | 天天色综| 亚洲欧美优优色在线影院 | 亚洲男人第一天堂 | 无码AV免费精品一区二区三区 | 人生路不在线观看完整版 | 亚洲AVAV天堂AV在线网爱情 | 99久久精品99999久久 | japanese人妖xvideos | 小sao货ji巴cao死你视频 | 青青国产在线观看 | 国产 日韩 欧美视频二区 | 日韩在线视频在线 | 9l国产精品久久久久麻豆 | 男人女人性生活视频 | 欧洲肥女大肥臀 | 男模chinesegayxxxx| 深夜在线观看网站 | 99久久免费国产精品热 | 狠狠色婷婷日日综合五月 | 亚洲大片免费观看 | 99精品久久99久久久久久 | 91po国产在线高清福利 | 欧美贵妇videos办公室360 | 国产欧美又粗又猛又爽老 |