JVM PermGen –您在哪里?
這篇文章介紹了JVM內存結構的一些基礎知識,并快速窺視了PermGen,以了解自Java SE 8出現以來它已消失的地方。
裸基礎
JVM只是系統上運行的另一個進程,魔術始于java命令。 像任何OS進程一樣,它需要內存才能運行。 記住– JVM本身是對硬件的軟件抽象,在其之上運行Java程序,并擁有OS獨立性和WORA (一旦在任何地方運行一次寫入)。
快速介紹JVM內存結構
根據規范,JVM分為5個虛擬內存段。
- 堆
- 方法(非堆)
- JVM堆棧
- 本機堆棧
- PC寄存器
堆
- Java程序中分配的每個對象都需要存儲在內存中。 堆是存儲所有實例化對象的區域。 是的–責怪新操作員填滿Java堆!
- 由所有線程共享
- JVM用盡時會拋出java.lang.OutOfMemoryError
- 使用-Xms和-Xmx JVM選項來調整堆大小
細分為
- 伊甸園 (年輕)–該區域中存在新對象或預期壽命短的對象,并使用-XX:NewSize和-XX:MaxNewSize參數對其進行調節。 GC(垃圾收集器)次要空間
- 幸存者 –仍被引用的對象設法在伊甸園空間的垃圾收集中幸存下來,最終到達該區域。 通過-XX:SurvivorRatio JVM選項進行調節
- 舊 (已租用)–適用于在伊甸園和幸存者空間中可以長期保存垃圾的對象(當然,這是由于纏結的引用所致)。 一個特殊的垃圾收集器負責這個空間。 使用權空間中的對象脫空間處理由GC Major負責
方法范圍
- 也稱為非堆區域(在HotSpot JVM實現中)
- 它分為2個主要子空間
永久 生成 –該區域存儲來自類定義,結構,方法,字段,方法(數據和代碼)和常量的類相關數據。 可以使用-XX:PermSize和-XX:MaxPermSize進行調節。 如果空間不足,則IT會導致java.lang.OutOfMemoryError:PermGen空間。
代碼 緩存 –緩存區域用于存儲編譯的代碼。 編譯后的代碼不過是本機 代碼 (特定于硬件),并且由Oracle HotSpot JVM專用的JIT (及時)編譯器處理。
JVM堆棧
- 與Java類中的方法有很多關系
- 存儲局部變量并調節方法調用,部分結果和返回值
- Java中的每個線程都有自己的堆棧(專用)副本,其他線程無法訪問。
- 使用-Xss JVM選項進行了調整
本機堆棧
- 用于本機方法(非Java代碼)
- 每個線程分配
PC寄存器
- 特定于特定線程的程序計數器
- 包含要執行的JVM指令的地址(對于本機方法,則未定義)
因此,這就是JVM內存段基礎知識。 回到永久的一代。
那么PermGen在哪里?
本質上,PermGen已被完全刪除 d, 并被另一個稱為Metaspace的存儲區域取代 。
元空間–快速事實
- 它是本機堆內存的一部分
- 可以使用-XX:MetaspaceSize和-XX:MaxMetaspaceSize進行調整
- 清理由XX:MetaspaceSize選項驅動的啟動,即達到MetaspaceSize時。
- java.lang.OutOfMemoryError:如果本機空間已用完,將接收元數據空間
- 如果存在PermGen相關的JVM選項,即-XX:PermSize和-XX:MaxPermSize,將被忽略
這顯然只是冰山一角。 為了全面了解JVM,沒有比規范本身更好的參考了 !
您也可以探索
- Java語言規范
- Java 8有什么新功能?
干杯!
翻譯自: https://www.javacodegeeks.com/2014/09/jvm-permgen-where-art-thou.html
總結
以上是生活随笔為你收集整理的JVM PermGen –您在哪里?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java和甜蜜的科学
- 下一篇: 草船借箭人物特点 草船借箭人物特点是什么