1. 程式人生 > >java jvm 內存區域

java jvm 內存區域

最小 清理 java 一個 動態鏈表 地址 新生代 模型 jvm

程序計數器:可以看作是當前線程執行字節碼的行號器。每個線程都有一個自己的程序計數器。字節碼執行判斷 循環等操作是就是改變程序計數器的值來完成操作的。

註意:當前的線程執行的是Native方法的時候,程序計數器的值為空。調用本地方法的時候回重新起一個線程去執行本地方法,當前的線程阻塞到新起的線程執行完畢。

JAVA虛擬機棧:java 虛擬機棧也是線程私有的 。java虛擬機棧是java方法執行的內存模型。每個方法在執行的時候都會創建一個棧幀,這個棧幀用於存儲局部變量表,操作數棧,動態鏈表,方法出口等等信息。
局部變量表存放的是基本的數據類型(long,int ,boolean....),對象的引用類型(指向對象起始地址的引用地址,也可能是指向一個代表對象的句柄或其他與此對象相關的位置。)

本地方法棧 本地方法棧的機制和java虛擬機棧的機制是一樣的,但是本地方法棧監管的是本地方法,即Native方法。

java 堆:對象的實例和數組在堆上分配內存。java堆內存被分為兩個部分即:新生代,老年代。如果要分的再細致一點的話就是Eden, From Survivor,To Survivor空間等。該比例為8:1。每次是用Eden和其中的一個Survivor,當垃圾回收的時候,就將存活的對象復制到另一個Survivor 上,最後清理掉Eden和剛才使用的Survivor。
通過-Xmx(最大)和-Xms(最小)來控制堆內存的大小。

方法區:他本用於存儲已被虛擬機加載的類信息,常量,靜態變量,以及即時編譯後的代碼等數據。

註意該區域的內存回收主要針對的是:常量池的回收和對類型的卸載。
運行時常量池是方法區的一部分,用於存放的是編譯期生成的各種字面量和符號引用。

java jvm 內存區域