深入理解java虚拟机---读后笔记(垃圾回收)
運行時數據區,主要包括方法區、虛擬機棧、本地方法棧、堆、程序計數器,該部分內存都是線程隔離的。
然后和其交互的有執行引擎、本地庫接口,此部分線程之間是可以共享的。
1、 引用計數算法
給對象添加一個引用計數器,當有一個地方引用它時,計數器值就加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。
2、根搜索算法
通過一系列名為“GC Roots”的對象作為起始點,從這些節點開始向下搜索,搜索所走過的路徑成為引用連(Reference Chain),當一個對象到GC Roots沒有任何引用連相連時,則證明該對象是不可達的,則可以被判定為是可回收的對象。
JAVA語言中,可以作為GC Roots的對象包括下面幾種:
1)虛擬機棧(棧幀中的本地變量表)中的引用的對象。
2)方法區中的類靜態屬性引用的對象。
3)方法區中常量引用的對象。
4) 本地方法棧中JNI(即一般說的Native方法)的引用的對象。
轉載于:https://www.cnblogs.com/Eunice-mogu/p/5315450.html
總結
以上是生活随笔為你收集整理的深入理解java虚拟机---读后笔记(垃圾回收)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL自增长主键探究
- 下一篇: EXCEL 数字+E+数字 自动识别为指