My java——JVM(垃圾回收)四

My java——JVM(內存域) 中講述了Java在JVM中的內存使用,其實在咱們出來java程序時基本上有兩個地方的內存處理

一是、二是,JVM會自動回收堆中的內存,也就咱們所說的垃圾回收,那JVM怎麼實現垃圾回收的呢? html

    在說垃圾回收時仍是說一下,java在JVM運行的內存處理:
    首先,當JVM程序運行時會在程序計數器裏分配一個線程的標記,主要標記線程完成狀況,若是線程執行完成,該標記就回收、清空。
    而後,因爲程序運行,須要對一些對象引用的保存。JVM就把這些對象的引用保存到裏,隨着程序計數器的線程的進行或結束,棧中的引用也就會失效回收、清空等。
    最後,因爲中保存對象存儲是線程共享的,因此線程是不能爲堆作出內存回收、清空等機制。那這麼回收堆中保存的對象內存,這裏就是JVM的垃圾回收機制。它定時比較若是中沒有引用指向中的對象,那麼就釋放該內存空間。 java

    以上只是個人我的理解,以爲好像JVM的的內存初始和回收就是這樣,但也許這是錯的,那JVM是若是實現回收
堆中的內存?它有什麼機制?什麼實現?
    其實我以爲這些事比較難的,JVM不是一兩下就清楚了的,垃圾回收的原理其實沒有必要知道,JVM原本就是來解決內存的問題。我也看了一些關於垃圾回收的原理的一些知識,不過仍是沒有懂起,也許水平在哪裏,不能作實驗,只有理論。但仍是說下吧。
    不一樣的JVM,有着不一樣的垃圾回收機制。(Garbage Collection ,GC)垃圾收集組要完成1、回收空間;2、讓堆中的對象排列更整齊。這兩點是GC的主要目的。
    垃圾收集的算法主要有以下: 算法

1、引用計數法
    這個比較古老的算法,簡單但速度慢,就是把咱們定義在棧中的引用的標記起來,在定時回收標記引用無效的對象。 多線程

二、標記—清掃
    sun公司最先就是使用的這種技術,先標記出要回收的對象,而後定時清掃對象。但這樣內存就很雜碎,因爲回收的內存都是處處分佈的。 oracle

三、中止—複製
    把內存分紅兩塊,當一塊用完了,就把這塊須要的對象複製到另外的一塊中,而後把這塊清除。 ide

自適應/標記—整理
    先標記—清掃,再中止—複製,這就是自適應/標記整理。 ui

五、分代收集算法
    這種算法只是把內存分紅適合標記—清掃的就作該操做,適合中止—複製就作該操做。 spa

這裏只是簡單的描述,若是有興趣能夠去研究一下。 .net


下面介紹一下收集器的發展 線程

一、Serial收集器
    最先的收集器,在JDK1.3之前是惟一的收集器。

二、ParNew收集器
    是Serial的多線程版本。

三、Parallel Scavenge收集器
    採用的複製算法的新生代收集器。

四、Serial Old收集器
    主要是和Parallel Scavenge搭配使用(JDK1.5)

五、Parallel Old收集器
    採用的標記—整理算法(JDk1.6)。

六、CMS收集器
    主要是重視響應速度,基於 標記—清除算法。

七、G1收集器
    整合收集技術發展最前沿的成功。(JDK1.7)英語好的能夠看
文檔地址http://docs.oracle.com/javase/7/docs/technotes/guides/vm/G1.html

ok就到這來,菜鳥記

相關文章
相關標籤/搜索