av手机免费在线观看,国产女人在线视频,国产xxxx免费,捆绑调教一二三区,97影院最新理论片,色之久久综合,国产精品日韩欧美一区二区三区

java語言

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

時間:2025-04-26 16:08:38 java語言 我要投稿
  • 相關(guān)推薦

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

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

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

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

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

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

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

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

  Java虛擬機中有個稱之為垃圾回收器的東西,實際上這個東西也許真正不存在,或者是已經(jīng)集成到JVM中了,但這無關(guān)緊要,我們?nèi)匀豢梢苑Q為為垃圾回收器。

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

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

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

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

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

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

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

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

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

  分別說來有一下幾種:

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

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

  Person p = new Person("aaa");

  p = new Person("bbb");

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

  3、讓相互聯(lián)系的對象稱為“島”對象

  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之前,它們之間是一種三角戀關(guān)系。分別置null,三角戀關(guān)系依然存在,但是三個變量不在使用它們了。三個Person對象就組成了一個孤島,最后死在堆上——被垃圾回收掉。

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

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

  調(diào)用垃圾回收也不一定能保證未使用的對象一定能從內(nèi)存中刪除。

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

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

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

  回收的機制

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

  設計選型(Design Choices)

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

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

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

  回收時暫停應用線程 VS 回收和應用并發(fā)進行

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

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

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

  性能指標(Performance Metrics)

 、偕a(chǎn)率(Throughput)

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

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

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

  ③暫停時間間隔(Pause time)

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

 、芑厥盏念l率(Frequency of collection)

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

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

  如堆的大小。

 、蕖崟r性(Promptness)

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

  垃圾回收的類型

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

 、儆谰么

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

  ②年老代

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

 、勰贻p代

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

  串行回收器(Serial Collector)

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

【總結(jié)Java垃圾回收器的方法和原理】相關(guān)文章:

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

java垃圾回收機制06-28

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

java垃圾回收機制是怎樣的05-21

java使用ConcurrentHashMap和計數(shù)器實現(xiàn)鎖的方法05-31

Java內(nèi)存回收07-17

java實現(xiàn)web服務器的方法05-20

光纖傳感器的原理和特點06-03

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