JVM內存模型

發展:
cpu轉速快,磁盤讀寫速度跟不上,才設計了內存;
cpu發展,內存讀寫速度遠遠跟不上,為此cpu上加上了高速緩存(帶來緩存一致性問題,需要各個cpu運行遵循一些協議,運行時 保證數據的一致性)。

image

a.多線程就是多條線程并發執行任務;
b.高效的并發編程;
c.多線程共享jvm主存,又各自有自己的工作內存;線程與主存交互,數據由主存拷貝到工作內存,交由線程處理(操作碼+操作數)

image

1.程序計數器
a.一塊很小的內存空間;
b.當前線程執行字節碼文件行號指示器;
c字節碼解釋器通過改變計數器的值來選取下一條需要執行的字節碼值來,分支、循環、跳轉、異常處理、線程恢復都需要依賴這個計數器來完成
*java多線程時通過線程輪流切換分配處理器時間的方式實現,一個處理器一個時刻只會處理一條線程中的指令,為了線程切換后能恢復到正確位置,每條線程都一個私有的程序計數器,各個線程計數器互不影響,獨立存儲,稱為"線程私有內存";
java方法:計數器記錄的是正在執行的虛擬機字節碼指令的地址;
Natvie 方法:唯一Java 虛擬機規范中沒有規定任何OutOfMemoryError的區域,計數器值則為空(Undefined)

2.虛擬機棧(JAVA方法)
a.內存模型,棧”就是現在講的虛擬機棧(虛擬機棧中的局部變量表),Java 方法執行的內存模型;
b.
c.局部變量表存放了編譯期可知的各種基本數據類型(long、double占兩位局部變量空間slot)、對象引用(引用指針,代表對象的句柄,對象相關的位置)和returnAddress 類型(一條字節碼指令的地址);
編譯期完成內存分配,在運行時不會改變局部變量表的大小;
棧OutOfMemoryError 兩種情況:
1).線程請求的棧深度大于虛擬機所允許的深度;
2).擴展時無法申請到足夠的內存
*程序計數器一樣,Java 虛擬機棧(Java Virtual Machine Stacks)也是線程私有的,它的生命周期與線程相同

3、本地方法棧(NATIVE方法)
本地方法棧(Native Method Stacks)與虛擬機棧所發揮的作用是非常相似的
本地方法棧區域也會拋出StackOverflowError 和OutOfMemoryError異常

4.Java 堆
a.Java 虛擬機所管理的內存中最大的一塊,被所有線程共享的一塊內存區域,垃圾收集器管理的主要區域,也被稱做“GC 堆”
b.存放對象實例,幾乎所有的對象實例都在這里分配內存
*幾乎所有的對象實例(所有的對象實例以及數組)都在這里分配內存,JIT 編譯器發展與逃逸分析技術成熟,棧上分配、標量替換優化技術使得所有的對象都分配在堆上漸漸不是那么“絕對”;
收集器基本都采用分代收集算法,細分為:新生代和老年代;細致一點的有Eden 空間、From Survivor 空間、To Survivor 空間等;
線程共享的Java 堆中可能劃分出多個線程私有的分配緩沖區(Thread LocalAllocation Buffer,TLAB),無論怎么劃分都是存儲的都是對象實例,進一步劃分的目的是為了更好地回收內存,或者更快地分配內存;

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 文章轉自 http://blog.csdn.net/u012152619/article/details/4696...
    云狗狗狗狗狗閱讀 616評論 1 4
  • Java虛擬機在執行Java程序的過程中會把它所管理的內存劃分為若干個不同的數據區域。這些區域都有各自不同的用途,...
    join_a922閱讀 355評論 0 0
  • 我們知道,計算機CPU和內存的交互是最頻繁的,內存是我們的高速緩存區,用戶磁盤和CPU的交互,而CPU運轉速度越來...
    join_a922閱讀 284評論 0 0
  • 參考原地址 JVM內存模型 Java虛擬機(Java Virtual Machine=JVM)的內存空間分為五個部...
    流年劃破容顏_cc55閱讀 340評論 0 0
  • 遲子建的小說,文風歷來清麗,但不失沉穩、厚重。是我喜歡的女性作家之一。從她的《北極村童話》,到《額爾古納河右岸》...
    紛紜雜談閱讀 559評論 1 2