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