Java內存區域的劃分

       JVM在執行Java程序時會講它所管理的內存劃分爲若干個數據區域。目前比較流行的劃分方式是將內存區域劃分爲堆(Heap)內存和棧(Stack)內存。這種方法的劃分說明與對象分配關係最爲密切的內存是很多程序員最關注的部分,實際上JVM在執行Java程序時,內存區域的劃分遠遠比這個複雜。根據《JAVA虛擬機規範》的規定,JVM所管理的內存將分爲以下幾個區域。

       1、程序計數器:所佔內存很小。作用:當前線程所執行字節碼的行號指示器。說通俗點就是一個程序可能有很多線程,這個程序計數器是其中每個線程都有的,而這些線程什麼時候執行又是JVM調度的事情,每次一個線程還不能被執行完,這時候程序計數器的作用就出來了,標示了線程執行到哪了,這次線程調度器分配的時間內沒執行完,下次執行此線程,知道從哪開始執行。特點:每個線程都有一個程序計數器,並且各個線程之間的程序計數器相互獨立,互不影響。

        2、Java虛擬機棧:Java虛擬機棧也是線程私有的,與線程的生命週期相同。其描述的是Java方法執行的內存模型:每個方法在執行時都會創建一個棧幀(Stack Frame)用於存儲局部變量表、操作數棧、動態鏈接、方法出口等消息。每一個方法從調用到執行完成的過程,就對應着一個棧幀在虛擬機棧中入棧到出棧的過程。局部變量表存放了編譯期間的已知的各種基本類型、對象引用類型 (相當於一個指針,指向一個對象)。局部變量所需的內存空間在編譯期間完成分配,當進入一個方法時,這個方法需要在幀中分配多大的變量空間是完全確定的,在方法的運行期間不會改變局部變量的大小。引申:棧深度:一個線程中所壓入虛擬機棧的棧幀數目。每次方法調用都會有一個棧幀壓入虛擬機棧,如果線程請求的棧深度大於虛擬機允許的棧深度,則會拋出StackOverflowError異常。

       3、本地(Native)方法棧:與虛擬機棧相似,兩者區別是虛擬機棧爲虛擬機執行Java方法服務,而本地方法棧則爲虛擬機使用到的Native方法服務。注:本地方法:一個java調用非java代碼的接口。

       4、Java堆:JVM所管理的內存最大的一塊。Java堆是被所有線程共享的一片區域,在JVM啓動時創建,此內存區域的唯一目的就是存放對象實例。

       5、方法區:與Java堆一樣,都是各個內存共享的內存區域,用於存儲已經被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯後的代碼等數據。

       6、運行時常量池:方法區的一部分。Class文件除了有類的版本、字段、方法、接口等描述信息外,還有一項是常量池。用於存放編譯期生成的各種字面量和符號引用,這部分內容將在類加載後進入方法區的運行時常量池存放。字面量:文本字符串、聲明爲final的常量值。符號一用:類和接口的完全限定名、字段的名稱和描述符、方法的名稱和描述符。

       7、直接內存:JDK1.4中新加入NIO類,引入了一種基於通道和緩衝區的I/O方式,它可以使用Native函數庫直接分配堆外內存,然後通過一個存儲在Java堆中的DirectByteBuffer對象作爲這塊內存的引用進行操作。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章