JVM的內存區域


Java虛擬機在執行Java程序的過程中會把它所管理的內存划分為若干個不同的數據區域,

包含程序計數器、虛擬機棧、本地方法棧、Java堆、方法區(運行時常量池)、直接內存等,不同的版本會有所差異

各區域的作用:

 

1、程序計數器:較小的內存空間,當前線程執行的字節碼的行號指示器;各線程之間獨立存儲,互不影響;

 2、虛擬機棧:線程私有,生命周期和線程同生共死,每個方法在執行的同時都會創建一個棧幀用於存儲局部變量表,操作數棧,動態鏈接,方法出口等信息。方法的執行就對應着棧幀在虛擬機棧中入棧和出棧的過程;

        棧里面存放着各種基本數據類型和對象的引用(-Xss) ;-Xss參數是用來調整JAVA虛擬機棧的。一個線程調用多個方法,只會有一個棧。棧的缺省大小為1M

3、本地方法棧:本地方法棧保存的是native方法的信息,當一個JVM創建的線程調用native方法后,JVM不再為其在虛擬機棧中創建棧幀,JVM只是簡單地動態鏈接並直接調用native方法;

   

堆:

方法區(運行時常量池):也叫永久區(永久代),用於存儲已經被虛擬機加載的類信息,常量("zdy","123"等),靜態變量(static變量)等數據(-XX:PermSize;- XX:MaxPermSize;-XX:MetaspaceSize; - XX:MaxMetaspaceSize ),

                在JDK7及之前用的是-XX:PermSize;-XX:MaxPermSize;在JDK8及之后用的是(元數據空間)-XX:MetaspaceSize;-XX:MaxMetaspaceSize

JAVA堆:與我們操作最為緊密的區域,在代碼中用new對象的時候,操作的就是該區域。幾乎是所有的對象都在堆上分配,與堆相關的命令是:(-Xms;-Xmx;-Xmn;-XX:NewSize;-XX:MaxNewSize)

-Xms;堆的最小值
-Xmx;堆的最大值
-Xmn;新生代的大小
-XX:NewSize;新生代的最小值
-XX:MaxNewSize;新生代的最大值

運行時常量池:嚴格來說是方法區的一部分,JDK8及之后運行時常量池放到了堆里面。JDK8之后提出了元數據空間的概念,這個方法區就消失了,方法區從運行時數據區挪到了虛擬機本身管理之外,只受制於物理內存的大小,不再受制於虛擬機的管理內存大小。同時運行時常量池自從1.7之后也挪到了堆中。元空間不是直接內存,直接內存主要用於IO通信。

不同JDK版本之間運行時數據區也是有所不同的。

如JDK6 的時候,常量池是放在方法區中的

 

 

在JDK7的時候,運行時常量池在對中

 

JDK8及之后運行時常量池放到了堆里面

 

 

 

 

棧和堆對比分析 :
棧的特點:
1.以棧幀的方式存儲方法調用的過程,並存儲方法調用過程中基本數據類型的變量(int、short、long、byte、float、double、boolean、char等)以及對象的引用變量,
2.其內存分配在棧上,變量出了作用域就會自動釋放;
3.棧內存歸屬於單個線程,每個線程都會有一個棧內存,其存儲的變量只能在其所屬線程中可見,即棧內存可以理解成線程的私有內存。
棧的內存要遠遠小於堆內存,棧的深度是有限制的,可能發生StackOverFlowError問題
堆的特點:
1.堆內存用來存儲Java中的對象。無論是成員變量,局部變量,還是類變量,它們指向的對象都存儲在堆內存中
2.堆內存中的對象對所有線程可見。堆內存中的對象可以被所有線程訪問

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM