1. 程式人生 > >java內存劃分

java內存劃分

本地 native .cn 運行時數據區域 難學 net over jvm 文章

java內存模型是學習java的基礎,如果了解的不夠透徹將很難學好java。所以不論理論知識多麽的枯燥,也需要去記住並理解。最重要的是理解,不然後面的java路肯定是荊棘叢生。

多做筆記肯定是有好處,把不理解的東西寫出來。去網上查閱資料,把認為正確的比較精華的東西整理一下。就算復制一些資料,以後在自己的博客裏查找也比較方便,自己有心得時也可以補充。

言歸正傳 想要理解java內存的劃分就需要知道java的特性以及運行機制,java的跨平臺,多態 等

1 . java程序是在 jvm運行的,所以java內存的劃分 實際就是虛擬機內存的劃分。(因為java的跨平臺特性,不同平臺只需要下載相應版本的jre。所以java程序在jvm內運行)

2 .java程序的運行機制 請參考另一篇文章 https://www.cnblogs.com/zjf6666/p/9184374.html

二 . java運行時數據區域的劃分

有篇文章畫的圖片 挺好的,總結了內存的劃分。

技術分享圖片

1.程序計數器 (program counter,pc)

  從百科的定義來看,程序計數器是用於存放下一條指令所在單元的地址的地方。

程序計數器是一塊較小的內存空間,它的作用可以看作是當前線程所執行的字節碼的行號指示器。在虛擬機的概念模型裏字節碼解釋器工作時就是通過改變這個計數器的值來選取下一條需要執行的字節碼指令,分支、循環、跳轉、異常處理、線程恢復等基礎功能都需要依賴這個計數器來完成。- - 《深入理解Java虛擬機》

特性

  1. 因為處理器在一個確定時刻只會執行一個線程中的指令,線程切換後,是通過計數器來記錄執行痕跡的,因而可以看出,程序計數器是每個線程私有的。
  2. 如果執行的是java方法,那麽記錄的是正在執行的虛擬機字節碼指令的地址的地址,如果是native方法,計數器的值為空(undefined)。
  3. 這個內存區域是唯一一個在java虛擬界規範中沒有規定任何OutOfMemoryError的情況的區域。(由於程序計數器中存儲的數據所占空間的大小不會隨程序的執行而發生改變,因此,對於程序計數器是不會發生內存溢出現象(OutOfMemory)的) 更多可以參考https://blog.csdn.net/leaf_0303/article/details/78953669

2 .本地方法棧

  本地方法棧與Java棧的作用和原理非常相似。區別只不過是Java棧是為執行Java方法服務的,而本地方法棧則是為執行本地方法(Native Method)服務的。

在JVM規範中,並沒有對本地方發展的具體實現方法以及數據結構作強制規定,虛擬機可以自由實現它。在HotSopt虛擬機中直接就把本地方法棧和Java棧合二為一。

同虛擬機棧相同,Java虛擬機規範對這個區域也規定了兩種異常情況StackOverflowErrorOutOfMemoryError異常。

程序計數器 和 本地方法棧 對我們來說不是太重要

3 虛擬機棧(java 棧)

  

  

java內存劃分