運行時數據區,主要包括方法區、虛擬機棧、本地方法棧、堆、程序計數器,該部份內存都是線程隔離的。java
而後和其交互的有執行引擎、本地庫接口,此部分線程之間是能夠共享的。算法
一、 引用計數算法spa
給對象添加一個引用計數器,當有一個地方引用它時,計數器值就加1;當引用失效時,計數器值就減1,任什麼時候刻計數器爲0的對象就是不可能再被使用的。使用的案例有微軟的COM技術、使用ActionScript3的FlashPlayer,Python語言。java語言中沒有選用引用計數算法來管理內存,其中最重要的緣由是它很難解決對象之間的相互循環引用的問題。線程
例子:日誌
public class ReferenceCountingGC{ public Object instance = null; private static final int _1MB = 1024*1024; /** * 這個成員屬性惟一意義就是佔點內存,以便能在GC日誌中看清楚是否被回收過 */ private byte[] bigSize = new byte[2*_1MB]; public static void testGC(){ ReferenceCountingGC objA = new ReferenceCountingGC(); ReferenceCountingGC objB = new ReferenceCountingGC(); objA.instance = objB; objB.isstance = objA; objA =null; objB = null; System.gc(); } }
這兩個對象已經不可能再被訪問啦,可是他們之間由於相互的引用着對方,因此他們的引用計數都不爲0。code
二、根搜索算法對象
經過一系列名爲「GC Roots」的對象做爲起始點,從這些節點開始向下搜索,搜索所走過的路徑成爲引用連(Reference Chain),當一個對象到GC Roots沒有任何引用連相連時,則證實該對象是不可達的,則能夠被斷定爲是可回收的對象。blog
JAVA語言中,能夠做爲GC Roots的對象包括下面幾種:接口
1)虛擬機棧(棧幀中的本地變量表)中的引用的對象。ip
2)方法區中的類靜態屬性引用的對象。
3)方法區中常量引用的對象。
4) 本地方法棧中JNI(即通常說的Native方法)的引用的對象。