運行時數據區中包含哪些區域?哪些線程共享?哪些線程獨享?

      網友投稿 987 2025-04-01

      運行時數據區中包含哪些區域?哪些線程共享?哪些線程獨享?【?????】

      Java 虛擬機在執行 Java 程序的過程中會把它管理的內存劃分成若干個不同的數據區域。

      JDK 1.8 和之前的版本略有不同,下面會介紹到。

      區別就是 1.8有一個元數據區替代方法區了。

      那么,Java 8 中 PermGen 為什么被移出 HotSpot JVM 了?我總結了兩個主要原因(詳見:JEP 122: Remove the Permanent Generation):

      由于 PermGen 內存經常會溢出,引發惱人的 java.lang.OutOfMemoryError: PermGen,因此 JVM 的開發者希望這一塊內存可以更靈活地被管理,不要再經常出現這樣的 OOM

      移除 PermGen 可以促進 HotSpot JVM 與 JRockit VM 的融合,因為 JRockit 沒有永久代。

      根據上面的各種原因,PermGen 最終被移除,方法區移至 Metaspace,字符串常量移至 Java Heap。

      程序計數器

      程序計數器(Program Counter Register)是一塊較小的內存空間,由于JVM可以并發執行線程,因此會存在線程之間的切換,而這個時候就程序計數器會記錄下當前程序執行到的位置,以便在其他線程執行完畢后,恢復現場繼續執行。

      JVM會為每個線程分配一個程序計數器,與線程的生命周期相同。

      如果線程正在執行的是應該Java方法,這個計數器記錄的是正在執行虛擬機字節碼指令的地址。

      如果正在執行的是Native方法,計數器的值則為空(undefined)

      注意:程序計數器是唯一一個不會出現 OutOfMemoryError 的內存區域,它的生命周期隨著線程的創建而創建,隨著線程的結束而死亡。

      本地方法棧

      Java虛擬機棧是調用Java方法;本地方法棧是調用本地native方法,可以認為是通過 JNI (Java Native Interface) 直接調用本地 C/C++ 庫,不受JVM控制。

      方法執行完畢后相應的棧幀也會出棧并釋放內存空間,也會出現 StackOverFlowError 和 OutOfMemoryError 兩種錯誤。

      虛擬機棧

      虛擬機棧 描述的是 Java 方法執行的內存模型:

      每個方法在執行的同時都會創建一個棧幀(Stack Frame,是方法運行時的基礎數據結構)用于存儲局部變量表、操作數棧、動態鏈接、方法出口等信息。每一個方法從調用直至執行完成的過程,就對應著一個棧幀在虛擬機棧中入棧到出棧的過程。

      虛擬機棧是每個線程獨有的,隨著線程的創建而存在,線程結束而死亡。

      在虛擬機棧內存不夠的時候會OutOfMemoryError,在線程運行中需要更大的虛擬機棧時會出現StackOverFlowError。

      Java 堆

      運行時數據區中包含哪些區域?哪些線程共享?哪些線程獨享?

      Java 堆是被所有線程共享的一塊內存區域,在虛擬機啟動時創建。此內存區域的唯一目的就是存放對象實例,幾乎所有的對象實例都在這里分配內存。

      堆是垃圾收集器管理的主要區域,又稱為“GC堆”,可以說是Java虛擬機管理的內存中最大的一塊。

      現在的虛擬機(包括HotSpot VM)都是采用分代回收算法。在分代回收的思想中, 把堆分為:新生代+老年代+永久代(1.8沒有了); 新生代 又分為 Eden + From Survivor + To Survivor區。

      方法區

      方法區(Method Area)與 Java 堆一樣,是所有線程共享的內存區域。

      方法區用于存儲已經被虛擬機加載的類信息(即加載類時需要加載的信息,包括版本、field、方法、接口等信息)、final常量、靜態變量、編譯器即時編譯的代碼等。

      方法區邏輯上屬于堆的一部分,但是為了與堆進行區分,通常又叫“非堆”。

      方法區比較重要的一部分是運行時常量池(Runtime Constant Pool),為什么叫運行時常量池呢?是因為運行期間可能會把新的常量放入池中,比如說常見的String的intern()方法。

      元空間

      1.8就把方法區改用元空間了。類的元信息被存儲在元空間中。元空間沒有使用堆內存,而是與堆不相連的本地內存區域。所以,理論上系統可以使用的內存有多大,元空間就有多大,所以不會出現永久代存在時的內存溢出問題。

      可以通過 -XX:MetaspaceSize 和 -XX:MaxMetaspaceSize 來指定元空間的大小。

      Java JVM

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:怎么允許宏(如何不啟用宏)
      下一篇:PV(訪問量)、UV(獨立訪客)、IP(獨立IP) (轉)
      相關文章
      久久精品国产亚洲av四虎| 2048亚洲精品国产| 亚洲AV永久无码精品水牛影视| 亚洲一级片免费看| 亚洲一级特黄无码片| 亚洲国产精品丝袜在线观看| 久久久亚洲精华液精华液精华液 | 亚洲av福利无码无一区二区| 狠狠色伊人亚洲综合成人| 国精无码欧精品亚洲一区| 亚洲精品无码久久久久去q| 亚洲中文字幕无码中文字在线| 国产亚洲精品高清在线| 久久亚洲中文字幕精品一区| 国内精品久久久久久久亚洲| 亚洲色大成网站www永久一区| 亚洲日韩激情无码一区| 亚洲成色WWW久久网站| 亚洲第一福利视频| 亚洲国产情侣一区二区三区| 亚洲人成在线中文字幕| 在线a亚洲老鸭窝天堂av高清| 亚洲色精品VR一区区三区| 亚洲成在人线aⅴ免费毛片| 国产精品亚洲专区无码唯爱网| 国产亚洲女在线线精品| 亚洲性日韩精品国产一区二区| 丝袜熟女国偷自产中文字幕亚洲| 亚洲精品自产拍在线观看| 亚洲国产成人精品不卡青青草原| 亚洲自偷自拍另类12p| 亚洲伊人久久大香线焦| 亚洲色最新高清av网站| 豆国产96在线|亚洲| 亚洲无线观看国产精品| 亚洲高清不卡视频| 亚洲人成人网毛片在线播放| 国产亚洲一卡2卡3卡4卡新区 | 亚洲欧洲日产国码www| 亚洲狠狠成人综合网| 在线亚洲v日韩v|