一是棧、二是堆,JVM會自動回收堆中的內存,也就咱們所說的垃圾回收,那JVM怎麼實現垃圾回收的呢? html
在說垃圾回收時仍是說一下,java在JVM運行的內存處理:
首先,當JVM程序運行時會在程序計數器裏分配一個線程的標記,主要標記線程完成狀況,若是線程執行完成,該標記就回收、清空。
而後,因爲程序運行,須要對一些對象引用的保存。JVM就把這些對象的引用保存到棧裏,隨着程序計數器的線程的進行或結束,棧中的引用也就會失效回收、清空等。
最後,因爲堆中保存對象存儲是線程共享的,因此線程是不能爲堆作出內存回收、清空等機制。那這麼回收堆中保存的對象內存,這裏就是JVM的垃圾回收機制。它定時比較若是棧中沒有引用指向堆中的對象,那麼就釋放該內存空間。 java
以上只是個人我的理解,以爲好像JVM的的內存初始和回收就是這樣,但也許這是錯的,那JVM是若是實現回收
堆中的內存?它有什麼機制?什麼實現?
其實我以爲這些事比較難的,JVM不是一兩下就清楚了的,垃圾回收的原理其實沒有必要知道,JVM原本就是來解決內存的問題。我也看了一些關於垃圾回收的原理的一些知識,不過仍是沒有懂起,也許水平在哪裏,不能作實驗,只有理論。但仍是說下吧。
不一樣的JVM,有着不一樣的垃圾回收機制。(Garbage Collection ,GC)垃圾收集組要完成1、回收空間;2、讓堆中的對象排列更整齊。這兩點是GC的主要目的。
垃圾收集的算法主要有以下: 算法
1、引用計數法
這個比較古老的算法,簡單但速度慢,就是把咱們定義在棧中的引用的標記起來,在定時回收標記引用無效的對象。 多線程
二、標記—清掃
sun公司最先就是使用的這種技術,先標記出要回收的對象,而後定時清掃對象。但這樣內存就很雜碎,因爲回收的內存都是處處分佈的。 oracle
三、中止—複製
把內存分紅兩塊,當一塊用完了,就把這塊須要的對象複製到另外的一塊中,而後把這塊清除。 ide
4 自適應/標記—整理
先標記—清掃,再中止—複製,這就是自適應/標記整理。 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就到這來,菜鳥記