欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java垃圾回收器的方法和原理總結(jié)

 更新時(shí)間:2016年12月15日 09:08:59   作者:kimy  
本篇文章主要介紹了Java垃圾回收器的方法和原理總結(jié),Java垃圾回收器是Java虛擬機(jī)的重要模塊,具有一定的參考價(jià)值,有興趣的可以了解一下。

什么是Java垃圾回收器

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

回收的機(jī)制

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

設(shè)計(jì)選型(Design Choices)

設(shè)計(jì)選型影響JVM垃圾回收器的實(shí)現(xiàn)難度,以及JVM的性能指標(biāo),適用于不同的場(chǎng)景。描述的是回收算法的風(fēng)格特點(diǎn)。

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

回收操作自身是否多線程處理的問(wèn)題。單線程回收的優(yōu)點(diǎn)是簡(jiǎn)單,易實(shí)現(xiàn),碎片少,適用于單核的機(jī)器。多線程并行回收在多核機(jī)器上面可以充分的利用CPU資源,減少回收的時(shí)間,增加生產(chǎn)力,缺點(diǎn)是復(fù)雜且可能有部分碎片沒(méi)有回收。

回收時(shí)暫停應(yīng)用線程 VS 回收和應(yīng)用并發(fā)進(jìn)行

回收操作時(shí)是否暫停應(yīng)用線程的問(wèn)題。暫停應(yīng)用線程的優(yōu)點(diǎn)是簡(jiǎn)單、準(zhǔn)確、清理得比較干凈、清理的時(shí)間也短(CPU資源獨(dú)占),缺點(diǎn)是暫停應(yīng)用線程之后會(huì)造成垃圾回收周期內(nèi)應(yīng)用的回應(yīng)時(shí)間拉長(zhǎng),實(shí)時(shí)性非常高的系統(tǒng)比較敏感?;厥蘸蛻?yīng)用線程并行處理的優(yōu)點(diǎn)是應(yīng)用反應(yīng)時(shí)間比較平穩(wěn)、缺點(diǎn)是實(shí)現(xiàn)難度大、清理頻率高、可能有碎片。

不合并釋放的內(nèi)存片段 VS 合并釋放的內(nèi)存片段 VS 把活著的復(fù)制到新的地方

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

性能指標(biāo)(Performance Metrics)

①、生產(chǎn)率(Throughput)

一個(gè)較長(zhǎng)的周期(長(zhǎng)的周期才有意義)內(nèi),非回收時(shí)間占總時(shí)間的比率。度量系統(tǒng)的運(yùn)行效率。

②、垃圾回收花費(fèi)(Garbage Collection overhead)

一個(gè)較長(zhǎng)的周期內(nèi),回收時(shí)間占總時(shí)間的比率。與生產(chǎn)率相對(duì)應(yīng),加起來(lái)為100%。

③、暫停時(shí)間間隔(Pause time)

Java虛擬機(jī)在回收垃圾的時(shí)候,有的算法會(huì)暫停所有應(yīng)用線程的執(zhí)行,某些系統(tǒng)可能對(duì)暫停的時(shí)間間隔比較敏感。

④、回收的頻率(Frequency of collection)

平均多久會(huì)發(fā)生回收操作。

⑤、內(nèi)存占用的大小(Footprint)

如堆的大小。

⑥、實(shí)時(shí)性(Promptness)

自一個(gè)對(duì)象死亡起,經(jīng)過(guò)多久該對(duì)象所占用內(nèi)存被回收。

垃圾回收的類(lèi)型

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

①永久代

存儲(chǔ)類(lèi)、方法以及它們的描述信息??梢酝ㄟ^(guò)-XX:PermSize=64m和-XX:MaxPermSize=128m兩個(gè)可選項(xiàng)指定初始大小和最大值。通常 我們不需要調(diào)節(jié)該參數(shù),默認(rèn)的永久代大小足夠了,不過(guò)如果加載的類(lèi)非常多,不夠用了,調(diào)節(jié)最大值即可。

②年老代

主要存儲(chǔ)年輕代中經(jīng)過(guò)多個(gè)回收周期仍然存活從而升級(jí)的對(duì)象,當(dāng)然對(duì)于一些大的內(nèi)存分配,可能也直接分配到永久代(一個(gè)極端的例子是年輕代根本就存不下)。

③年輕代

絕大多數(shù)的內(nèi)存分配回收動(dòng)作都發(fā)生在年輕代。如下圖所示, 年輕代被劃分為三個(gè)區(qū)域,原始區(qū)(Eden)和兩個(gè)小的存活區(qū)(Survivor),兩個(gè)存活區(qū)按功能分為From和To。絕大多數(shù)的對(duì)象都在原始區(qū)分配,超過(guò)一個(gè)垃圾回收操作仍然存活的對(duì)象放到存活區(qū)。

串行回收器(Serial Collector)

單線程執(zhí)行回收操作,回收期間暫停所有應(yīng)用線程的執(zhí)行,client模式下的默認(rèn)回收器,通過(guò)-XX:+UseSerialGC命令行可選項(xiàng)強(qiáng)制指定。

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

把Eden區(qū)的存活對(duì)象移到To區(qū),To區(qū)裝不下直接移到年老代,把From區(qū)的移到To區(qū),To區(qū)裝不下直接移到年老代,F(xiàn)rom區(qū)里面年齡很大的升級(jí)到年老代。 回收結(jié)束之后,Eden和From區(qū)都為空,此時(shí)把From和To的功能互換,F(xiàn)rom變To,To變From,每一輪回收之前To都是空的。設(shè)計(jì)的選型為復(fù)制。

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

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

并行回收器(Parallel Collector)

使用多個(gè)線程同時(shí)進(jìn)行垃圾回收,多核環(huán)境里面可以充分的利用CPU資源,減少回收時(shí)間,增加JVM生產(chǎn)率,Server模式下的默認(rèn)回收器。與串行回收器相同,回收期間暫停所有應(yīng)用線程的執(zhí)行。通過(guò)-XX:+UseParallelGC命令行可選項(xiàng)強(qiáng)制指定。

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

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

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

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

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

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

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

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

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

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

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

又名低延時(shí)收集器(Low-latency Collector),通過(guò)各種手段使得應(yīng)用程序被掛起的時(shí)間最短?;九c應(yīng)用程序并發(fā)地執(zhí)行回收操作,沒(méi)有合并和復(fù)制操作。通過(guò)命令行-XX:+UseConcMarkSweepGC指定,在單核或者雙核系統(tǒng)里面還可以指定使用增量式回收模式-XX:+UseConcMarkSweepGC。增量式回收是指把回收操作分為多個(gè)片段,執(zhí)行一個(gè)片段之后釋放CPU資源給應(yīng)用程序,未來(lái)的某個(gè)時(shí)點(diǎn)接著上次的結(jié)果繼續(xù)回收下去。目的也是減少延時(shí)。

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

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

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

分為四個(gè)步驟,初始標(biāo)記(Initial Mark)、并發(fā)標(biāo)記(Concurrent Mark)、再次標(biāo)記(Remark)、以及并發(fā)清理(Concurrent Sweep)。特別注意,沒(méi)有合并操作,所以會(huì)有碎片。

  • 初始化階段: 暫停應(yīng)用線程,找出所有存活的對(duì)象,耗時(shí)比較短,回收器使用單線程。
  • 并發(fā)標(biāo)記階段: 回收器標(biāo)記操作與應(yīng)用并發(fā)運(yùn)行,回收器使用單線程標(biāo)記存活對(duì)象。
  • 再次標(biāo)記:并發(fā)標(biāo)記階段由于應(yīng)用程序也在運(yùn)行,這個(gè)過(guò)程中可能新增或者修改對(duì)象。所以再次暫停應(yīng)用線程,找出所有修改的對(duì)象,使用多線程標(biāo)記。
  • 并發(fā)清理:回收器清理操作與應(yīng)用并發(fā)運(yùn)行,回收器使用單線程清理死亡對(duì)象。

Java垃圾回收器的性能評(píng)估工具

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

垃圾回收的開(kāi)始時(shí)間,持續(xù)時(shí)間,每一代的空余內(nèi)存等信息。

②jmap [options] pid

jamp 2043 查看2043進(jìn)程里面已經(jīng)加載的共享對(duì)象。通常DLL文件。

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

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

jmap -histo 2043 查看類(lèi)的加載和內(nèi)存占用情況。

③jstat [options] pid

jstat -class 2043 class加載、卸載、內(nèi)存占用情況。

jstat -gc 2043 GC執(zhí)行情況。

后記

Java提供自動(dòng)選擇和自動(dòng)性能優(yōu)化功能。在做垃圾回收器調(diào)優(yōu)之前,先列出所關(guān)注的性能指標(biāo),通過(guò)命令行告訴JVM你所關(guān)注的性能指標(biāo),由JVM自動(dòng)調(diào)優(yōu),如果不滿(mǎn)意,可以指定垃圾回收器。OutOfMemory通常是由于堆內(nèi)存不足,調(diào)節(jié)-Xmx1024m和-XX:MaxPermSize=128m命令行可選項(xiàng)即可。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java面試題篇之Sleep()方法與Wait()方法的區(qū)別詳解

    Java面試題篇之Sleep()方法與Wait()方法的區(qū)別詳解

    這篇文章主要給大家介紹了關(guān)于Java面試題篇之Sleep()方法與Wait()方法區(qū)別的相關(guān)資料,wait()是Object類(lèi)中的方法,而sleep()是Thread類(lèi)中的靜態(tài)方法,wait()方法用于多個(gè)線程之間的協(xié)作和通信,而sleep()方法用于線程的休眠,需要的朋友可以參考下
    2024-07-07
  • SpringBoot靜態(tài)資源路徑配置及主頁(yè)顯示

    SpringBoot靜態(tài)資源路徑配置及主頁(yè)顯示

    這篇文章主要介紹了SpringBoot靜態(tài)資源路徑配置及主頁(yè)顯示,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • java實(shí)現(xiàn)汽車(chē)租賃系統(tǒng)

    java實(shí)現(xiàn)汽車(chē)租賃系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)汽車(chē)租賃系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • Spring Batch讀取txt文件并寫(xiě)入數(shù)據(jù)庫(kù)的方法教程

    Spring Batch讀取txt文件并寫(xiě)入數(shù)據(jù)庫(kù)的方法教程

    這篇文章主要給大家介紹了Spring Batch讀取txt文件并寫(xiě)入數(shù)據(jù)庫(kù)的方法,SpringBatch 是一個(gè)輕量級(jí)、全面的批處理框架。這里我們用它來(lái)實(shí)現(xiàn)文件的讀取并將讀取的結(jié)果作處理,處理之后再寫(xiě)入數(shù)據(jù)庫(kù)中的功能。需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-04-04
  • java中l(wèi)ist使用時(shí)需避免的場(chǎng)景總結(jié)

    java中l(wèi)ist使用時(shí)需避免的場(chǎng)景總結(jié)

    眾所周知,Java為開(kāi)發(fā)者提供了多種集合類(lèi)的實(shí)現(xiàn),其中幾乎所有業(yè)務(wù)代碼都需要用到List,但List的錯(cuò)誤使用也會(huì)導(dǎo)致諸多問(wèn)題,所以本文我們就來(lái)看一看幾個(gè)錯(cuò)誤使用List的場(chǎng)景吧
    2023-10-10
  • Mybatis邏輯分頁(yè)與物理分頁(yè)P(yáng)ageHelper使用解析

    Mybatis邏輯分頁(yè)與物理分頁(yè)P(yáng)ageHelper使用解析

    這篇文章主要為大家介紹了Mybatis邏輯分頁(yè)與物理分頁(yè)P(yáng)ageHelper使用解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • 使用@Autowired 注入RedisTemplate報(bào)錯(cuò)的問(wèn)題及解決

    使用@Autowired 注入RedisTemplate報(bào)錯(cuò)的問(wèn)題及解決

    這篇文章主要介紹了使用@Autowired 注入RedisTemplate報(bào)錯(cuò)的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • Java設(shè)計(jì)模式之訪問(wèn)者模式使用場(chǎng)景及代碼示例

    Java設(shè)計(jì)模式之訪問(wèn)者模式使用場(chǎng)景及代碼示例

    這篇文章主要介紹了Java設(shè)計(jì)模式之訪問(wèn)者模式使用場(chǎng)景及代碼示例,小編覺(jué)得還是挺不錯(cuò)的,這里分享給大家,供需要的朋友參考。
    2017-11-11
  • 詳解Spring注解 @Configuration

    詳解Spring注解 @Configuration

    @Configuration 是 Spring 中的一個(gè)注解,它用于標(biāo)記一個(gè)類(lèi)為配置類(lèi),通過(guò)配置類(lèi)可以定義和組裝 Spring Bean,并且支持高度靈活的配置方式。本問(wèn)詳細(xì)介紹了Spring注解 @Configuration,感興趣的小伙伴可以參考一下
    2023-04-04
  • java synchronized關(guān)鍵字的用法

    java synchronized關(guān)鍵字的用法

    synchronized關(guān)鍵字我們大家都知道是線程同步關(guān)鍵字.總結(jié)一下日常的使用方法,還有一個(gè)坑.
    2016-05-05

最新評(píng)論