參考文章
jdk8之后的HotSpot JVM將永久代取出, 取而代之的是Meta Space(元空間)
為什么被移出HotSpot JVM?
1.由于 PermGen 內存經常會溢出休弃,引發(fā)惱人的 java.lang.OutOfMemoryError: PermGen,因此 JVM 的開發(fā)者希望這一塊內存可以更靈活地被管理,不要再經常出現這樣的 OOM
2.移除 PermGen 可以促進 HotSpot JVM 與 JRockit VM 的融合,因為 JRockit 沒有永久代艇炎。
PermGen何去何從?
- 方法區(qū)移至 Metaspace
- 字符串常量移至 Java Heap
- JDK 8 開始把類的元數據放到本地堆內存(native heap)中,這一塊區(qū)域就叫 Metaspace蛔添,中文名叫元空間
使用本地內存的優(yōu)點
OOM問題將不復存在章蚣,因為默認的類的元數據分配只受本地內存大小的限制.
不過應該適當限制 Metaspace 的大小: 使用 -XX:MaxMetaspaceSize
參數來指定 Metaspace 區(qū)域的大小. JVM 默認在運行時根據需要動態(tài)地設置 MaxMetaspaceSize 的大小.
除此之外,它還有以下優(yōu)點
- Take advantage of Java Language Specification property : Classes and associated metadata lifetimes match class loader’s
- Linear allocation only
- No individual reclamation (except for RedefineClasses and class loading failure)
- No GC scan or compaction
- No relocation for metaspace objects
GC行為
如果Metaspace的空間占用達到了設定的最大值蜻懦,那么就會觸發(fā)GC來收集死亡對象和類的加載器甜癞。根據JDK 8的特性,G1和CMS都會很好地收集Metaspace區(qū)(一般都伴隨著Full GC).
為了減少垃圾回收的頻率及時間宛乃,控制吞吐量悠咱,對Metaspace進行適當的監(jiān)控和調優(yōu)是非常有必要的。如果在Metaspace區(qū)發(fā)生了頻繁的Full GC征炼,那么可能表示存在內存泄露或Metaspace區(qū)的空間太小了析既。
What's New?
- 新增加了幾個jvm參數
- 監(jiān)測工具可以監(jiān)測到Meta Space的實時狀態(tài)