<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # JVM 內存模型/結構和組件 > 原文: [https://howtodoinjava.com/java/garbage-collection/jvm-memory-model-structure-and-components/](https://howtodoinjava.com/java/garbage-collection/jvm-memory-model-structure-and-components/) 每當執行 Java 程序時,都會保留一個單獨的存儲區,用于存儲應用程序代碼的各個部分,這些部分您大致稱為 **JVM 內存**。 盡管不是必需的,但是具有一定的知識對該存儲區進行構造是有益的。 當您開始進行更深層次的工作(例如性能調整)時,它變得尤為重要。 如果沒有很好地了解 JVM 實際如何使用內存以及垃圾回收器如何使用該內存的不同部分,您可能會錯過一些重要的注意事項,以進行更好的內存管理。 從而獲得更好的性能。 在本教程中,我將討論 **JVM 內存**內部的各個部分,然后您將在以后的一篇文章中討論如何使用此信息進行應用程序的性能調整。 ```java Table of Contents JVM memory areas / components - Heap area - Method area and runtime constant pool - JVM stack - Native method stacks - PC registers ``` ## JVM 內存模型/結構 Java 虛擬機定義了在程序執行期間使用的各種**運行時數據區域**。 其中一些數據區域是在 Java 虛擬機啟動時創建的,僅在 Java 虛擬機退出時才被銷毀。 其他數據區域是每個線程的。 在創建線程時創建每個線程的數據區域,并在線程退出時銷毀每個數據區域。 讓我們看一下運行時內存中各個部分的最基本分類。 [![JVM Memory Area Parts](https://img.kancloud.cn/dc/5b/dc5b889e6c2274a57e7e3aa3a8d81bd8_700x160.png)](//howtodoinjava.com/wp-content/uploads/2014/08/JVM-Memory-Area-Parts.jpg) JVM 內存區域部分 讓我們根據 JVM 規范中提到的內容,快速瀏覽每個組件。 ## 堆區域 堆區代表運行時數據區,從中為所有類實例和數組分配內存,并在虛擬機啟動期間創建。 自動存儲管理系統回收對象的堆存儲。 堆可以是固定大小,也可以是動態大小(基于系統的配置),并且分配給堆區域的內存不必是連續的。 *Java 虛擬機實現可以為程序員或用戶提供對堆初始大小的控制,并且,如果可以動態擴展或收縮堆,則可以控制最大和最小堆大小。* 如果計算需要的堆多于自動存儲管理系統所能提供的堆,則Java虛擬機將拋出`OutOfMemoryError`。 ## 方法區域和運行時常量池 方法區域存儲每個類的結構,例如運行時常量池;字段和方法數據; 方法和構造器的代碼,包括用于類,實例和接口初始化的特殊方法。 方法區域是在虛擬機啟動時創建的。 盡管從邏輯上講它是堆的一部分,但是可以或不能將其進行垃圾收集,而我們已經讀到堆中的垃圾收集不是可選的; 這是強制性的。 方法區域可以是固定大小的,或者可以根據計算的需要進行擴展,如果不需要更大的方法區域,則可以縮小。 方法區域的內存不必是連續的。 如果方法區域中的內存不可用于滿足分配請求,則 Java 虛擬機將拋出`OutOfMemoryError`。 ## JVM 棧 每個 JVM 線程都有一個與該線程同時創建的私有棧。 棧存儲幀。 框架用于存儲數據和部分結果,并執行動態鏈接,方法的返回值和調度異常。 它保存局部變量和部分結果,并在方法調用和返回中起作用。 因為除了壓入和彈出幀外,從不直接操縱此棧,所以可以對幀進行堆分配。 與堆類似,此棧的內存不必是連續的。 該規范允許棧的大小可以是固定的,也可以是動態的。 如果具有固定大小,則在創建該棧時可以獨立選擇每個棧的大小。 如果線程中的計算所需的 Java 虛擬機棧超出允許的范圍,則 Java 虛擬機將引發`StackOverflowError`。如果可以動態擴展 Java 虛擬機棧,并嘗試進行擴展,但是可能沒有足夠的內存來實現擴展,或者如果沒有足夠的內存可用于為新線程創建初始 Java 虛擬機棧,則 Java 虛擬機將拋出`OutOfMemoryError`。 ## 本機方法棧 本機方法棧稱為 C 棧; 它支持本機方法(用 Java 編程語言以外的其他語言編寫的方法),通常在創建每個線程時為每個線程分配。 無法加載本機方法并且自身不依賴于常規棧的 Java 虛擬機實現不需要提供本機方法棧。 本機方法棧的大小可以是固定的,也可以是動態的。 如果線程中的計算所需的本機方法堆棧超出允許的范圍,則Java虛擬機將拋出`StackOverflowError`。如果可以動態擴展本機方法堆棧并嘗試進行本機方法堆棧擴展,但可用內存不足,或者如果無法提供足夠的內存來為新線程創建初始本機方法堆棧,則Java虛擬機將拋出`OutOfMemoryError`。 ## PC 寄存器 每個 JVM 線程都有其自己的程序計數器(pc)寄存器。 在任何時候,每個 JVM 線程都在執行單個方法的代碼,即該線程的當前方法。 由于 Java 應用程序可以包含一些本機代碼(例如,使用本機庫),因此本機和非本機方法有兩種不同的方式。 如果該方法不是本機的(即 Java 代碼),則 PC 寄存器包含當前正在執行的 JVM 指令的地址。 如果該方法是本地方法,則未定義 JVM 的 PC 寄存器的值。 Java 虛擬機的 pc 寄存器足夠寬,可以在特定平臺上保存返回地址或本機指針。 目前,這一切都與 JVM 內部的內存區域結構有關。 在接下來的文章中,我將提出一些想法,以使用此信息進行性能調整。 **祝您學習愉快!** **參考**:<http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html>
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看