(1).Java的內存結構,也就是運行時的數據區域:
程序計數器:
程序計數器是一個較小的內存空間,他可以看做當前線程所執行的字節碼的行號指示器,由於java虛擬機的多線程是通過線程輪流切換並分配處理器的執行時間來實現的,任何一個確定的時刻,一個處理器(對應於多核中的一個內核)都只會執行一個線程中的指令,因此為了線程切換后內回到正確的位置,每個線程都有一個獨立的程序計數器,各線程之間的程序計數器互不影響,我們稱為線程私有內存 唯一一個沒有內存溢出的區域。
java虛擬機棧:
Java虛擬機棧也是線程私有的,他描述的是java方法執行的內存模型,每個方法執行的同時都要創建一個棧幀,用於儲存局部變量表,操作數棧,動態鏈接,方法出口,等信息,每一個方法從調用到執行完成,都對應一個棧幀在虛擬機棧中從入棧到出棧的過程
局部變量表放置了,編譯器可知的各種基本數據類型,和對象引用
本地方法棧:
類似虛擬機棧,存儲執行本地方法(native)時所需要的數據、指令、返回地址。
方法區:
和java堆是一樣,是各個線程共享的內存區域,它用於儲存已經被虛擬機加載的,類信息,常量(1.7之后有變化,String常量存在heap中),靜態變量,即時編譯器(JIT)編譯后的代碼。
堆:
堆是JVM所管理的內存中最大的一塊,是被所有Java線程鎖共享的,不是線程安全的,在JVM啟動時創建。堆是存儲Java對象的地方,這一點Java虛擬機規范中描述是:所有的對象實例以及數組都要在堆上分配。Java堆是GC管理的主要區域,從內存回收的角度來看,由於現在GC基本都采用分代收集算法,所以Java堆還可以細分為:新生代和老年代;新生代再細致一點有Eden空間、From Survivor空間、To Survivor空間等。
(2).垃圾回收機制
詳見我另一篇博客:GC算法
(3).可達性算法
1 虛擬機棧中的引用對象
2 方法區中類靜態屬性引用的對象
3 方法區中常量引用的對象
4 本地方法占中jin引用的對象