一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|JavaScript|易語言|

服務器之家 - 編程語言 - Java教程 - Java中內存區域的劃分與異常詳解

Java中內存區域的劃分與異常詳解

2021-05-08 11:17linuxidc Java教程

最近在看java虛擬相關知識,把每天看到的一些內容做一個歸納總結,下面這篇文章主要給大家介紹了關于Java中內存區域的劃分與異常的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧

前言

java內存區域主要由程序計數器、java 虛擬機棧、本地方法棧、java堆、方法區以及運行時常量池組成。本文將給大家詳細介紹關于java內存區域的劃分與異常的相關內容,下面話不多說了,來一起看看詳細的介紹吧。

運行時數據區域

jvm在運行java程序時候會將內存劃分為若干個不同的數據區域。

Java中內存區域的劃分與異常詳解

程序計數器

線程私有。可看作是 當前線程所執行的字節碼的行號指示器 ,字節碼解釋器的工作是通過改變這個計數值來讀取下一條要執行的字節碼指令。

多線程是通過線程輪流切換并分配處理器執行時間來實現的,任何一個時刻,一個內核只能執行一條線程中的指令。 為了線程切換后能恢復到正確的執行位置,每條線程都需要一個獨立的程序計數器 。這就是一開始說的“線程私有”。如果線程正在執行的方法是java方法,計數器記錄的是虛擬機字節碼的指令地址;如果是native方法,計數器值為空。 程序計數器是唯一一個在java虛擬機規范中沒有規定oom(outofmemoryerror)情況的區域 。

java虛擬機棧

線程私有,生命周期和線程相同。java虛擬機棧描述的是java方法的內存模型:每個方法在執行時都會創建一個棧幀,存儲 局部變量表、操作數棧、動態鏈接、方法出口信息 ,每一個方法從調用到結束,就對應這一個棧幀在虛擬機棧中的進棧和出棧過程。局部變量表保存了各種基本數據類型(int、double、char、byte等)、對象引用(不是對象本身)和returnaddress類型(指向了一條字節碼地址)。

這部分區域可能發生兩種異常:

  • 線程請求的棧深度大于虛擬機所允許的深度,拋出stackoverflowerror;
  • 虛擬機棧擴展時無法申請到足夠的內存,拋出outofmemoryerror。

本地方法棧

上述虛擬機棧為jvm執行java方法服務,本地方法則為執行native服務。其他和虛擬機棧類似,也會拋出stackoverflowerror、outofmemoryerror。

java堆

常說的“棧內存”、“堆內存”,其中前者指的是虛擬機棧,后者說的就是java堆了。 java堆是被線程共享的 。在虛擬機啟動時被創建。

java堆的作用是存放對象實例,java堆可以處于物理上不連續的內存空間中,只要求邏輯上連續即可。

方法區

線程共享的區域。存儲已被虛擬機加載的類信息、常量、靜態變量、即使編譯器編譯后的代碼等數據。方法區無法滿足內存分配需求時,拋出outofmemoryerror。

運行時常量池

運行時常量池 是方法區的一部分 。c用于存放編譯期生成的各種字面常量和符號引用,將在類加載后進入方法區的運行時常量池中存放。 java語言不要求常量只能在編譯期產生,換言之,在運行期間也能將新的常量放入 。

直接內存

直接內存不屬于虛擬機運行時數據區的一部分,也不是內存區域。本機直接內存的分配不會受到java堆的大小限制,但終究是內存,如果各個內存區域總和大于物理內存限制,還是會出現outofmemoryerror。

對象的創建過程

虛擬機遇到一條"new"指令:

  • 首先檢查這個指令的參數是否能在常量池中定位到一個類的符號引用;
  • 檢查這個符號引用代表的類是否已被加載、解析、初始化;(如果沒有,則必須先進行類的加載)
  • 在java堆中為新對象分配內存,所需大小在類加載后就確定了;
  • 將分配到的內存空間都初始化為0(不包括對象頭)
  • 類的初始化,即init方法,吧對象按照程序員的意愿初始化為想要的值。

對象的內存布局

對象在內存中存儲的布局可以分為3塊區域:

  1. 對象頭
  2. 實例數據
  3. 對齊補充

對象頭:存儲對象自身的運行時數據,比如哈希碼、gc分代年齡、鎖狀態標志、線程持有的鎖、偏向線程id等。另外還有一部分是類型指針, 即對象指向它的類元數據的指針,虛擬機通過該指針來確定這個對象屬于哪個類的實例。

實例數據:對象真正有效的信息,在程序中定義的各種類型的字段內容;

對齊補充:非必須,占用符的作用。

對象的訪問定位

java程序通過棧上的引用來操作堆上的實例對象。比如

?
1
person p = new person();

這里p就是引用,new出來的person對象是實例。

這個引用沒有規定要如何定位、訪問堆中的對象具體位置。主流的有兩中訪問方式:

句柄。java堆中會劃分出一塊內存作為句柄池,引用存儲了對象的句柄地址,而句柄中包含了對象實例數據和類型數據。好處是,對象被移動時,只需改變句柄中的地址,引用本身無需修改。
直接指針。 引用中存儲的直接就是對象地址 。好處是速度更快,由于引用直接表示實例對象的地址,節省了一次指針定位操作。sun hotspot使用的正是這種方式。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。

原文鏈接:https://www.linuxidc.com/Linux/2018-06/152788.htm

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 天选之王漫画顾长歌免费阅读 | 美国一级大黄大色毛片 | 国产成人精品日本亚洲网址 | 91免费播放人人爽人人快乐 | wankz视频| 99在线免费视频 | 91桃花视频 | 我与旗袍老师疯狂床震 | 欧美三级不卡在线观线看高清 | 91尤物在线 | 日韩制服丝袜在线观看 | 青青青久在线视频免费观看 | 欧美亚洲另类综合 | 国产男技师 | 99re这里只有精品视频在线观看 | 日本男男gayxxxxx免费 | 精品国产欧美一区二区五十路 | 国产精彩视频 | 久久精选视频 | 国产一区日韩二区欧美三 | 麻豆最新| 99久久精品免费看国产情侣 | 嫩交18xxxx| 深夜视频在线播放 | 久久re这里精品在线视频7 | 四虎影视国产精品婷婷 | 国产精品国产精品国产三级普 | 国产一二在线观看视频网站 | 草草视频免费看 | 小早川怜子在线播放精品 | 四虎影院在线免费观看 | 午夜dj影院在线观看完整版 | 男人曰女人 | 精品无码一区二区三区中文字幕 | 亚洲欧美日韩另类精品一区二区三区 | 男人的天堂在线观看免费 | 欧美亚洲国产另类在线观看 | 四虎影院免费在线 | 亚洲国产精品无码中文字幕 | 好湿好紧太硬了我太爽了网站 | 亚洲国产精品综合福利专区 |