您好,登錄后才能下訂單哦!
JVM內存區域有哪些,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
JVM 內存區域主要分為線程私有區域【程序計數器、虛擬機棧、本地方法區】、線程共享區 域【JAVA 堆、方法區】、直接內存。
線程私有數據區域生命周期與線程相同, 依賴用戶線程的啟動/結束 而 創建/銷毀(在 Hotspot VM 內, 每個線程都與操作系統的本地線程直接映射, 因此這部分內存區域的存/否跟隨本地線程的 生/死對應)。
線程共享區域隨虛擬機的啟動/關閉而創建/銷毀。
直接內存并不是 JVM 運行時數據區的一部分, 但也會被頻繁的使用: 在 JDK 1.4 引入的 NIO 提 供了基于 Channel 與 Buffer 的 IO 方式, 它可以使用 Native 函數庫直接分配堆外內存, 然后使用 DirectByteBuffer 對象作為這塊內存的引用進行操作(詳見: Java I/O 擴展), 這樣就避免了在 Java 堆和 Native 堆中來回復制數據, 因此在一些場景中可以顯著提高性能。
程序計數器(線程私有)
一塊較小的內存空間, 是當前線程所執行的字節碼的行號指示器,每條線程都要有一個獨立的 程序計數器,這類內存也稱為“線程私有”的內存。
正在執行 java 方法的話,計數器記錄的是虛擬機字節碼指令的地址(當前指令的地址)。如 果還是 Native 方法,則為空。
這個內存區域是唯一一個在虛擬機中沒有規定任何 OutOfMemoryError 情況的區域。
虛擬機棧(線程私有)
是描述 java 方法執行的內存模型,每個方法在執行的同時都會創建一個棧幀(Stack Frame) 用于存儲局部變量表、操作數棧、動態鏈接、方法出口等信息。每一個方法從調用直至執行完成 的過程,就對應著一個棧幀在虛擬機棧中入棧到出棧的過程。
棧幀( Frame)是用來存儲數據和部分過程結果的數據結構,同時也被用來處理動態鏈接 (Dynamic Linking)、 方法返回值和異常分派( Dispatch Exception)。棧幀隨著方法調用而創建,隨著方法結束而銷毀——無論方法是正常完成還是異常完成(拋出了在方法內未被捕獲的異 常)都算作方法結束。
本地方法區(線程私有)
本地方法區和 Java Stack 作用類似, 區別是虛擬機棧為執行 Java 方法服務, 而本地方法棧則為 Native 方法服務, 如果一個 VM 實現使用 C-linkage 模型來支持 Native 調用, 那么該棧將會是一個 C 棧,但 HotSpot VM 直接就把本地方法棧和虛擬機棧合二為一。
堆(Heap-線程共享)-運行時數據區
是被線程共享的一塊內存區域,創建的對象和數組都保存在 Java 堆內存中,也是垃圾收集器進行 垃圾收集的最重要的內存區域。由于現代 VM 采用分代收集算法, 因此 Java 堆從 GC 的角度還可以 細分為: 新生代(Eden 區、From Survivor 區和 To Survivor 區)和老年代。
方法區/永久代(線程共享)
即我們常說的永久代(Permanent Generation), 用于存儲被 JVM 加載的類信息、常量、靜 態變量、即時編譯器編譯后的代碼等數據. HotSpot VM 把 GC 分代收集擴展至方法區, 即使用 Java 堆的永久代來實現方法區, 這樣 HotSpot 的垃圾收集器就可以像管理 Java 堆一樣管理這部分內存, 而不必為方法區開發專門的內存管理器(永久帶的內存回收的主要目標是針對常量池的回收和類型 的卸載, 因此收益一般很小)。
運行時常量池(Runtime Constant Pool)是方法區的一部分。Class 文件中除了有類的版 本、字段、方法、接口等描述等信息外,還有一項信息是常量池 (Constant Pool Table),用于存放編譯期生成的各種字面量和符號引用,這部分內容將在類加 載后存放到方法區的運行時常量池中。 Java 虛擬機對 Class 文件的每一部分(自然也包括常量 池)的格式都有嚴格的規定,每一個字節用于存儲哪種數據都必須符合規范上的要求,這樣才會 被虛擬機認可、裝載和執行。
看完上述內容,你們掌握JVM內存區域有哪些的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。