国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Java的GC機制

ruicbAndroid / 2805人閱讀

摘要:分代收集主要針對這兩類的對象進行回收。伊甸園空間執行后,將和活著的對象一次性復制到另一個名為的中去,然后清理和執行多次后,依然存活的對象會被轉移至老年代。在年輕代存活對象占用的內存超過時,則多余的對象會放入年老代。

jvm 中,程序計數器、虛擬機棧、本地方法棧都是隨線程而生隨線程而滅,棧幀隨著方法的進入和退出做入棧和出棧操作,實現了自動的內存清理,因此,我們的內存垃圾回收主要集中于 堆和方法區中,在程序運行期間,這部分內存的分配和使用都是動態的。

GC算法: 對象存活判斷

引用計數法:每個對象有一個引用計數屬性,新增一個引用時計數加1,引用釋放時計數減1,計數為0時可以回收。
缺點是無法釋放循環引用的對象。如下圖:

根搜索算法:從GC Roots開始向下搜索,搜索所走過的路徑稱為引用鏈。當一個對象到GC Roots沒有任何引用鏈相連時,則證明此對象是不可用的。
在Java語言中,GC Roots包括:
虛擬機棧中引用的對象。
方法區中類靜態屬性實體引用的對象。
方法區中常量(final)引用的對象。
本地方法棧中JNI引用的對象。


可以看到,該算法可以釋放循環引用的對象(D和E)。

垃圾收集算法

標記/清除算法:當堆中的有效內存空間(available memory)被耗盡的時候,就會停止整個程序(也被成為stop the world),然后進行兩項工作,第一項則是標記,第二項則是清除。

(1)標記:標記的過程其實就是,遍歷所有的GC Roots,然后將所有GC Roots可達的對象標記為存活的對象。
(2)清除:清除的過程將遍歷堆中所有的對象,將沒有標記的對象全部清除掉。

缺點:1、首先,它的缺點就是效率比較低(遞歸與全堆對象遍歷),而且在進行GC的時候,需要停止應用程序,這會導致用戶體驗非常差勁
2、第二點主要的缺點,則是這種方式清理出來的空閑內存是不連續的(碎片化),JVM就不得不維持一個內存的空閑列表,這又是一種開銷。而且在分配數組對象的時候,尋找連續的內存空間會不太好找。

復制(copying)算法:將內存劃分為兩個區間,所有動態分配的對象都只能分配在其中一個區間(稱為活動區間),而另外一個區間(稱為空閑區間)則是空閑的,當有效內存空間耗盡時,JVM將暫停程序運行,開啟復制算法GC線程。將活動區間內的存活對象,全部復制到空閑區間,且嚴格按照內存地址依次排列,與此同時,GC線程將更新存活對象的內存引用地址指向新的內存地址。此時,空閑區間已經與活動區間交換,而垃圾對象現在已經全部留在了原來的活動區間。事實上,在活動區間轉換為空間區間的同時,垃圾對象已經被一次性全部回收。

缺點:1、它浪費了一半的內存。
2、如果對象的存活率很高,我們可以極端一點,假設是100%存活,那么我們需要將所有對象都復制一遍,并將所有引用地址重置一遍。復制這一工作所花費的時間,在對象存活率達到一定程度時,將會變的不可忽視。

標記/整理算法:標記/整理算法與標記/清除算法非常相似,它也是分為兩個階段:標記和整理。

(1)標記:它的第一個階段與標記/清除算法是一模一樣的,均是遍歷GC Roots,然后將存活的對象標記。

(2)整理:移動所有存活的對象,且按照內存地址次序依次排列,然后將末端內存地址以后的內存全部回收。因此,第二階段才稱為整理階段。
優點:標記/整理算法不僅可以彌補標記/清除算法當中,內存區域分散的缺點,也消除了復制算法當中,內存減半的高額代價。
缺點:效率也不高,不僅要標記所有存活對象,還要整理所有存活對象的引用地址。從效率上來說,標記/整理算法要低于復制算法。

總結:1、三個算法都基于根搜索算法去判斷一個對象是否應該被回收,而支撐根搜索算法可以正常工作的理論依據,就是語法中變量作用域的相關內容。因此,要想防止內存泄露,最根本的辦法就是掌握好變量作用域,
2、在GC線程開啟時,或者說GC過程開始時,它們都要暫停應用程序(stop the world)。
3、性能比較
效率:復制算法>標記/整理算法>標記/清除算法(此處的效率只是簡單的對比時間復雜度,實際情況不一定如此)。
內存整齊度:復制算法=標記/整理算法>標記/清除算法。
內存利用率:標記/整理算法=標記/清除算法>復制算法。

分代收集算法

GC分代的基本假設:絕大部分對象的生命周期都非常短暫,存活時間短。
GC將對象數據進行分類。主要是兩類:年輕代(Young Generation),老年代(Old Generation)。分代收集主要針對這兩類的對象進行回收。

年輕代(Young Generation):年輕代含兩種結構,伊甸園空間(1個,占80%)和幸存空間(2個,各占10%)。大多數對象會很快的變得不可達,因此,很多對象會在變成年輕代之后就消失,而這個過程我們稱之為“ minor GC”。由于存活率低,選用復制算法,一旦發生GC,將10%的幸存區間與另外80%伊甸園空間中存活的對象轉移到10%的幸存空間,接下來,將之前90%的內存全部釋放。

年輕代遵循以下規則:
通常剛剛被創建的對象會存放在伊甸園空間。
伊甸園空間執行GC后,將Eden和From活著的對象一次性復制到另一個名為To的Survivor中去,然后清理Eden和From

執行GC多次后,依然存活的對象會被轉移至老年代。

老年代(old Generation):對象來自新生代,如上所說部分對象會不可達,而剩下的從年輕代中存活下來,被拷貝至老年代。老年代所占用的空間要比年輕代多。如上,對象在老年代也會消失,而這個過程被稱之為“major GC”(或者是 “full GC”).老年代中因為對象存活率高、沒有額外空間對它進行分配擔保,就必須使用“標記-清除”或“標記-整理”算法來進行回收。

Permanebt Generation :持久代,或者稱為方法區(method area),通常持久代用來保存類常量以及字符串常量。而特別需要注意這個持久代區域不是用來保存從老年代存活下來的對象的。持久代也可以發生GC。同時這個區域的GC會被看待為 major GC.(使用“標記-清除”或“標記-整理”算法)
永久代主要回收兩種:常量池中的常量,無用的類信息。
要知道常量的回收是相對簡單的,主要是無用的類回收比較麻煩,要注意以下幾點:
類的實例已經全部被回收了
ClassLoader已經被回收
類的對象沒有被引用

通常情況下,以下兩種情況發生的時候,對象會從新生代區域轉到年老帶區域。
1、在年輕代里的每一個對象,都會有一個年齡,當這些對象的年齡到達一定程度時(年齡就是熬過的GC次數,每次GC如果對象存活下來,則年齡加1),則會被轉到年老代,而這個轉入年老代的年齡值,一般在JVM中是可以設置的。

2、在年輕代存活對象占用的內存超過10%時,則多余的對象會放入年老代。這種時候,年老代就是新生代的“備用倉庫”。

參考文章:
https://www.cnblogs.com/sunfi...
http://www.cnblogs.com/ityouk...
http://blog.csdn.net/u0116690...

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/68546.html

相關文章

  • 細述 Java垃圾回收機制→How Java Garbage Collection Works?

    摘要:當一個實例被創建的時候,它最初被存放在堆內存空間的年輕代的區中。老年代或者永久代是堆內存的第二個邏輯部分。在垃圾回收過程中掃描屬于部分的堆內存。一旦實例從堆內存中刪除了,它們原來的位置將空出來給以后分配實例使用。 本文非原創,翻譯自How Java Garbage Collection Works?在Java中為對象分配和釋放內存空間都是由垃圾回收線程自動執行完成的。和C語言不一樣的是...

    cc17 評論0 收藏0
  • Java性能優化之垃圾回收機制

    摘要:年輕代的目標就是盡可能快速的收集掉那些生命周期短的對象。年老代在年輕代中經歷了次垃圾回收后仍然存活的對象,就會被放到年老代中。什么情況下觸發垃圾回收由于對象進行了分代處理,因此垃圾回收區域時間也不一樣。 [TOC] 與C/C++相比,java語言不需要程序員直接控制內存回收,java程序的內存分配和回收都是由JRE在后臺自動進行,JRE會負責回收那些不再使用的內存,這種機制被稱為垃圾...

    philadelphia 評論0 收藏0
  • 樂字節Java|GC垃圾回收機制、package和import語句

    摘要:本文接上一篇樂字節關鍵字關鍵字塊。本文是接著講述垃圾回收機制和語句。一垃圾回收機制全名垃圾回收機制程序員無權調用垃圾回收器。通知運行,但是規范并不能保證立刻運行。若缺省該語句,則指定為無名包。 本文接上一篇:樂字節Java|this關鍵字、static關鍵字、block塊。本文是接著講述JavaGC垃圾回收機制、package 和 import語句。showImg(https://se...

    xuexiangjys 評論0 收藏0
  • 金三銀四面試季節之Java 核心面試技術點 - JVM 小結

    摘要:直接對棧的操作只有兩個,就是對棧幀的壓棧和出棧。中將永久代移除,同時增加元數據區。在中,本地方法棧和虛擬機棧是在同一塊兒區域,這完全取決于技術實現的決定,并未在規范中強制。 原文:https://github.com/linsheng97... 描述一下 JVM 的內存區域 程序計數?(PC,Program Counter Register)。在 JVM 規范中,每個線程都有它自己的...

    XGBCCC 評論0 收藏0
  • Java虛擬機:Java自動內存管理和回收機制

    摘要:所以我們提到的內存回收大都是指堆內存的回收。根據堆內存對對象的代的劃分我們對堆內存有這樣劃分各版本和種類的垃圾回收器各有其用武之地,配合使用它們得到最好的效果十分重要。 這篇文章的素材來自周志明的《深入理解Java虛擬機》。作為Java開發人員,一定程度了解JVM虛擬機的的運作方式非常重要,本文就一些簡單的虛擬機的相關概念和運作機制展開我自己的學習過程。 虛擬機內存分區 java虛擬機...

    xuxueli 評論0 收藏0
  • 譯文-java垃圾回收機制

    摘要:原文出處垃圾回收機制標記清除算法介紹最主要的理論算法之一,在實踐過程中,為了真實情景需要,需要許多調整。因此不會僅僅標記清除,垃圾回收期間,內存整理進程同時在工作。不同內存區域的垃圾收集機制不辣么容易理解。 原文出處:java垃圾回收機制 標記清除算法介紹最主要的理論算法之一,在實踐過程中,為了真實情景需要,需要許多調整。舉一個簡單例子,我們檢查JVM需要做的各種事情,以便我們安全地去...

    Warren 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<