JVM-運行時數據區

来源:http://www.cnblogs.com/lrh-xl/archive/2016/03/15/5277585.html
-Advertisement-
Play Games

-->位元組碼解釋器工作就是通過改變這個計數器的值來選取下一條需要執行的位元組碼指令,分支、迴圈、跳轉、異常處理、線程恢復等基礎功能都需要依賴計數器來完成。 -->為了線程切換後能恢復到正確的執行位置,每條線程都需要一個獨立的程式計數器,各條線程之間計數器互不影響,獨立存儲,我們稱這類記憶體區域為"線程私


                                                                                運行時數據區示意圖

                                     

1.程式計數器(Program Counter Register):是一塊較小的記憶體空間,它可以看作是當前線程所執行的位元組碼的行號指示器。

  -->位元組碼解釋器工作就是通過改變這個計數器的值來選取下一條需要執行的位元組碼指令,分支、迴圈、跳轉、異常處理、線程恢復等基礎功能都需要依賴計數器來完成。

  -->為了線程切換後能恢復到正確的執行位置,每條線程都需要一個獨立的程式計數器,各條線程之間計數器互不影響,獨立存儲,我們稱這類記憶體區域為"線程私有"的記憶體。

  -->此記憶體區域是唯一一個Java虛擬機規範中沒有規定任何OutOfMemoryError情況的區域。

  

2.Java虛擬機棧(Java Virtual Machine Stacks):是線程私有的,它的生命周期與線程相同。虛擬機棧描述的是Java方法執行的記憶體模型:每個方法在執行的同時都會創建一個棧幀(Stack Frame)用於存儲局部變數表、操作數棧、動態鏈接、方法出口等信息。每個方法從調用直至執行完成的過程,就對應著一個棧幀在虛擬機棧中入棧和出棧的過程。

  -->局部變數表存放了編譯期可知的各種基本數據類型(boolean 、 byte 、char 、short、int 、 float 、 long 、 double ),對象引用(reference類型,它不等同與對象本身,可能是一個指向對象起始地址的引用指針,也可能是指向一個代表對象的句柄或其他與此對象相關的位置)和returnAddress類型(指向了一條位元組碼指令的地址)。

  -->局部變數表所需的記憶體空間在編譯期間完成分配,當進入一個方法時,這個方法需要在幀中分配多大的局部空間是完全確定的,在方法運行期間不會改變局部變數表的大小。

  -->Java虛擬機棧會出現的兩種異常狀況:

    a)如果線程請求的棧深度大於虛擬機所允許的深度,將拋出StackOverflowError異常。

    b)如果虛擬機可以動態擴展(當前大部分的Java虛擬機都可以動態擴展,只不過Java虛擬機規範中也允許固定長度的虛擬機棧),如果擴展時無法申請到足夠的記憶體,就會拋出OutOfMemoryError異常。

3.本地方法棧(Native Method Stack):為虛擬機使用的Native方法服務。在虛擬機規範中對本地方法棧中方法使用的語言,使用方式與數據結構並沒有強制規定,因此,具體的虛擬機可以自由實現它。

  -->本地方法棧區域也會拋出StackOverflowError和OutOfMemoryError異常。

4.Java堆(Java Heap):是Java虛擬機所管理的記憶體中最大的一塊。Java堆是被所有線程共用的一塊記憶體區域,在虛擬機啟動時創建。此記憶體區域的唯一目的就是存放對象實例,幾乎所有的對象實例都在這裡分配記憶體。

  -->Java堆是垃圾收集器管理的主要區域,也稱“GC堆”。

  -->從記憶體回收角度看,Java堆分為:新生代和老年代,再細分為:Eden空間、FromSurvivor空間、ToSurvivor空間等。

  -->從記憶體分配的角度看,線程共用的Java堆中可能劃分出多個線程私有的分配緩衝區(Thread Local Allocation Buffer , TLAB)。

  -->Java堆可以處於物理上不連續的記憶體空間中,只要邏輯上是連續的即可。

5.方法區(Method Area):是各個線程共用的記憶體區域,他用於存儲已被虛擬機載入的類信息、常量、靜態變數、即時編譯器編譯後的代碼等數據。別名Non-Heap(非堆)

  -->Java虛擬機規範對方法區的限制非常寬鬆,不需要連續的記憶體空間和可以選擇固定大小或者課拓展,可以選擇不實現垃圾收集。

  -->垃圾收集行為在方法區比較少出現,這區域的記憶體回收目標是針對常量池的回收和對類型的卸載。

  -->當方法區無法滿足記憶體分配需求時,將拋出OutOfMemoryError異常。

6.運行時常量池(Runtime Constant Pool):是方法區的一部分。

  -->class文件中除了有類的版本、欄位、方法、介面等描述信息外,還有一項信息是常量池(Constant Pool Table),用於存放編譯期生成的各種字面量和符號引用,這部分內容將在類載入後進入方法區的運行時常量池中存放。

  -->除了保存class文件中描述的符號引用外,還會把翻譯出來的直接引用也存放在與形式常量池中。

  -->運行時常量池相對於class文件常量池的另外一個重要特征是具備動態性。

  -->當常量池無法申請到記憶體空間時會拋出OutOfMemoryError異常。

7.直接記憶體(Direct Memory):不是虛擬機運行時數據區的一部分,也不是Java虛擬機規範中定義的記憶體區域,但是這一部分記憶體被頻繁使用,也可能導致OutOfMemoryError異常出現。











您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  •  
  • 本文章詳細的介紹了在php學習中的最基礎的內容包括了基本數據類型、變數類型、操作符等入門都會要接觸到的東西。-php支持的基本數據類型:Integer:整數Float(Double,雙精度值):浮點數,表示所有實數String:字元串Boolean:布爾值,true/falseArray:保存具有相
  • 必知:軟體企業要求基礎軟體工程師具備六大基本素質,即良好的編碼能力、自覺的規範意識和團隊精神、認識和運用資料庫的能力、較強的英語閱讀和寫作能力、具有軟體工程的概念和求知欲和進取心。                   1.良好的編碼能力。軟體人員的一個重要職責是把用戶的需求功能用某種電腦語言予以實
  • python利用or在列表解析中調用多個函數.py
  • 2.在定義常量的時候C語言中定義為const而JAVA中為final3.在JAVA聲明成員變數的時候,使用static來定義。4.在JAVA中的boolean類型只包括true和false,但是在C中非0為true,0為false5.在JAVA中byte、short、int、long其存儲空間分別為
  • 今天幫同學想用C實現數組的折半查找,本來演算法挺簡單的,可是折騰了好幾個小時才發現問題在哪,這個sizeof坑人不淺啊。 明白這裡了,附上一篇C實現折半的代碼  
  • 一、Java的特點:一次編譯,到處運行時間。   C語言在windows下執行:C源程式(.c)——>編譯 windows可執行文件(.exe)——>windows操作系統  Java語言:Java源文件——>編譯 Java位元組碼文件(.class)——>JVM虛擬機下 (能直接解釋Java位元組碼C
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...