日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JVM内存区域划分及其管理机制

發布時間:2025/3/15 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JVM内存区域划分及其管理机制 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
java 虛擬機在執行java程序的過程中會把它所管理的內存劃分為若干個不同的數據區域,如圖。各個區域有各自的用途,以及創建時間和銷毀時間,有的區域隨著虛擬機進程啟動而存在,有些區域則依賴用戶線程的啟動和結束而建立和銷毀。


  • 程序計數器:是一塊較小的內存空間,它的作用可以看做是當前線程所執行的字節碼的行號指示器。在虛擬機的概念模型里(僅是概念模型,各種虛擬機可能會通過一些更高效的方式去實現),字 節碼解釋器工作時就是通過改變這個計數器的值來選取下一條需要執行的字節碼指令,分支、循環、跳轉、異常處理、線程恢復等基礎功能都需要依賴這個計數器來 完成。

    由于Java虛擬機的多線程是通過線程輪流切換并分配處理器執行時間的方式來實現的,在任何一個確定的時刻,一個處理器(對于多核處理器來說是 一個內核)只會執行一條線程中的指令。因此,為了線程切換后能恢復到正確的執行位置,每條線程都需要有一個獨立的程序計數器,各條線程之間的計數器互不影 響,獨立存儲,我們稱這類內存區域為“線程私有”的內存。

    如果線程正在執行的是一個Java方法,這個計數器記錄的是正在執行的虛擬機字節碼指令的地址;如果正在執行的是Natvie方法,這個計數器 值則為空(Undefined)。此內存區域是唯一一個在Java虛擬機規范中沒有規定任何OutOfMemoryError情況的區域。

  • 方法區:在類裝載器加載class文件到內存的過程中,虛擬機會提取其中的類型信息,并將這些信息存儲到方法區。方法區用于存儲已被虛擬機加載的類信息、常量、靜 態變量、即時編譯器編譯后的代碼等數據。由于所有線程都共享方法區,因此它們對方法區數據的訪問必須被設計為是線程安全的。。在JVM規范中,沒有強制要求方法區必須實現垃圾回收。很多人習慣將方法區稱為“永久代”,是因為HotSpot虛擬機以永久代來實現方法區,從而JVM的垃圾收集器可以像管理堆區一樣管理這部分區域,從而不需要專門為這部分設計垃圾回收機制。垃圾回收器在回收的時候,也僅僅針對常量池和對類型的回收。不過自從JDK7之后,Hotspot虛擬機便將運行時常量池從永久代移除了。

  • java堆:用于存儲java程序創建的對象實例及數組,被所有線程共享,在虛擬機啟動時創建,也是垃圾收集器管理的最主要區域,也稱GC堆。

  • java棧:線程私有,生命周期與線程相同。Java棧也稱作虛擬機棧(Java Vitual Machine Stack),也就是我們常常所說的棧,跟C語言的數據段中的棧類似。事實上,Java棧是Java方法執行的內存模型。為什么這么說呢?下面就來解釋一下其中的原因。

    Java棧中存放的是一個個的棧幀,每個棧幀對應一個被調用的方法,在棧幀中包括局部變量表(Local Variables)、操作數棧(Operand Stack)、指向當前方法所屬的類的運行時常量池(運行時常量池的概念在方法區部分會談到)的引用(Reference to runtime constant pool)、方法返回地址(Return Address)和一些額外的附加信息。當線程執行一個方法時,就會隨之創建一個對應的棧幀,并將建立的棧幀壓棧。當方法執行完畢之后,便會將棧幀出棧。 因此可知,線程當前執行的方法所對應的棧幀必定位于Java棧的頂部。講到這里,大家就應該會明白為什么 在 使用 遞歸方法的時候容易導致棧內存溢出的現象了以及為什么棧區的空間不用程序員去管理了(當然在Java中,程序員基本不用關系到內存分配和釋放的事情,因為 Java有自己的垃圾回收機制),這部分空間的分配和釋放都是由系統自動實施的。對于所有的程序設計語言來說,棧這部分空間對程序員來說是不透明的。下圖 表示了一個Java棧的模型:

    局部變量表,是指存放了編譯期間可知的各種基本數據類型(boolean、byte、char、short、int、float、long、double)、對象引用(reference類型)和returnAddress類型(指向了一條字節碼指令的地址)。其中64位長度的long和double類型的數據會占用2個局部變量的空間,其他的只占用1個。局部變量表所需的空間是在編譯時完成分配的,當進入一個方法時,這個方法在幀中分配多大的局部變量空間是完全確定的,因此,在方法運行期間不會改變局部變量表的大小。

    操 作數棧,想必學過數據結構中的棧的朋友想必對表達式求值問題不會陌生,棧最典型的一個應用就是用來對表達式求值。想想一個線程執行方法的過程中,實際上就 是不斷執行語句的過程,而歸根到底就是進行計算的過程。因此可以這么說,程序中的所有計算過程都是在借助于操作數棧來完成的。

    指向運行時常量池的引用,因為在方法執行的過程中有可能需要用到類中的常量,所以必須要有一個引用指向運行時常量。

    方法返回地址,當一個方法執行完畢之后,要返回之前調用它的地方,因此在棧幀中必須保存一個方法返回地址。

    由于每個線程正在執行的方法可能不同,因此每個線程都會有一個自己的Java棧,互不干擾。

  • 本地方法棧:本地方法棧與Java棧的作用和原理非常相似。區別只不過是Java棧是為執行Java方法服務的,而本地方法棧則是為執行本地方法(Native Method)服務的。在JVM規范中,并沒有對本地方發展的具體實現方法以及數據結構作強制規定,虛擬機可以自由實現它。在HotSopt虛擬機中直接就把本地方法棧和Java棧合二為一。

  • 運行時常量池:是方法區的一部分。Class文件中除了有類的版本、字段、方法、接口等描述信息外,還有一項常量池,用于存放編譯期生成的各種字面量和符號引用。


總結

以上是生活随笔為你收集整理的JVM内存区域划分及其管理机制的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产女人和拘做受视频免费 | 天堂一区| 污片在线观看 | 人妻精品一区 | 五月天婷婷丁香 | 一级黄色美女视频 | 中文字幕av久久 | 美女网站视频在线观看 | 国产精品久久精品 | 国产成人精品一区二三区 | 欧美大黄视频 | 亚洲精品一区二区三区在线观看 | 三上悠亚ssⅰn939无码播放 | 中文字幕日日 | 日韩在线黄色 | 涩涩资源网 | 福利av在线 | 91视频在线免费看 | 在线免费观看中文字幕 | 精品动漫一区二区三区的观看方式 | 奇米影视播放器 | 免费高清毛片 | 欧美日韩国产91 | av天天射 | 国产精品女同 | 男人都懂的网站 | 免费吃奶摸下激烈视频 | 99久久久无码国产精品性波多 | 麻豆精品视频在线观看 | 无码国产69精品久久久久同性 | 国产精品51| 亚洲第一成年网 | 亚洲乱视频 | 青青草原国产视频 | 亚洲国产色图 | 78日本xxxxxxxxx59 亚洲图片小说视频 | 一区二区三区网 | 国产青青在线 | 丰满少妇影院 | 欧美一区二区免费在线观看 | 国产成人自拍网站 | 成人国产精品久久 | 伊人网中文字幕 | 国产在线网 | 亚洲第一精品在线 | 久久在线视频免费观看 | 关之琳三级全黄做爰在线观看 | 欧美三级在线播放 | www.com亚洲 | 91精品国产色综合久久不卡98 | 亚洲激情在线观看 | 国产黄色免费 | 91精品国产欧美一区二区成人 | 久久青娱乐 | 青青草青娱乐 | 中文字幕 欧美激情 | xxx精品| 欧美在线一区视频 | 亚洲国产精品久久久 | 久久黄页 | 成人av网站大全 | 久久久久久国产精品三级玉女聊斋 | 国产欧美精品在线 | 超碰成人在线免费观看 | 九九九亚洲 | 九九久久精品视频 | 国产精品果冻传媒潘 | 中国女人一级一次看片 | 国产毛片久久 | 激情网综合 | 91亚洲精品久久久蜜桃 | 日本天堂网在线 | 精品国产网站 | 永久免费看片在线观看 | 好爽…又高潮了毛片免费看 | 91在线观看成人 | 荷兰女人裸体性做爰 | 国产人妖av | 色01看片网| 成人日b视频 | 久久毛片 | 成人午夜免费视频 | 狠狠av | 亚洲黄色小说网 | 黑色丝袜吻戏亲胸摸腿 | 国产黄色片网站 | 久久精品人人 | 久久久99精品免费观看 | 男女久久久 | 国产精品高潮视频 | 黄色小视频免费看 | 麻豆一区二区三区精品视频 | 亚洲av综合色区无码二区爱av | 91精品国产一区二区三区 | 国产福利一区视频 | 综合久草 | 中文字幕日韩欧美 | www.成人| 邻家有女4完整版电影观看 欧美偷拍另类 |