国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
深入探究JVM(2)

深入探究JVM(2) - 探秘Metaspace

Java 8徹底將永久代移除出了HotSpot JVM,將其原有的數(shù)據(jù)遷移至Java Heap或Metaspace。這一篇文章我們來總結(jié)一下Metaspace(元空間)的特性。如有錯(cuò)誤,敬請指出,謝謝~


一、引言:永久代為什么被移出HotSpot JVM了?

詳見:JEP 122: Remove the Permanent Generation
原因主要有兩個(gè):

  • 1、由于Permanent Generation內(nèi)存經(jīng)常不夠用或發(fā)生內(nèi)存泄露,引發(fā)惱人的java.lang.OutOfMemoryError: PermGen (在Java Web開發(fā)中非常常見)。
  • 2、移除Permanent Generation可以促進(jìn)HotSpot JVM與 JRockit VM的融合,因?yàn)镴Rockit沒有永久代。

This is part of the JRockit and Hotspot convergence effort. JRockit customers do not need to configure the permanent generation (since JRockit does not have a permanent generation) and are accustomed to not configuring the permanent generation.

根據(jù)上面的各種原因,永久代最終被移除,方法區(qū)移至Metaspace,字符串常量移至Java Heap。

二、探秘元空間

由于Metaspace的資料比較少,這里主要是依據(jù)Oracle官方的Java虛擬機(jī)規(guī)范及Oracle Blog里的幾篇文章來總結(jié)的。
首先,Metaspace(元空間)是哪一塊區(qū)域?官方的解釋是:

In JDK 8, classes metadata is now stored in the native heap and this space is called Metaspace.

也就是說,JDK 8開始把類的元數(shù)據(jù)放到本地化的堆內(nèi)存(native heap)中,這一塊區(qū)域就叫Metaspace,中文名叫元空間。

1、優(yōu)點(diǎn)

使用本地化的內(nèi)存有什么好處呢?最直接的表現(xiàn)就是java.lang.OutOfMemoryError: PermGen 空間問題將不復(fù)存在,因?yàn)槟J(rèn)的類的元數(shù)據(jù)分配只受本地內(nèi)存大小的限制,也就是說本地內(nèi)存剩余多少,理論上Metaspace就可以有多大(貌似容量還與操作系統(tǒng)的虛擬內(nèi)存有關(guān)?這里不太清楚),這解決了空間不足的問題。不過,讓Metaspace變得無限大顯然是不現(xiàn)實(shí)的,因此我們也要限制Metaspace的大?。菏褂?strong>-XX:MaxMetaspaceSize參數(shù)來指定Metaspace區(qū)域的大小。JVM默認(rèn)在運(yùn)行時(shí)根據(jù)需要?jiǎng)討B(tài)地設(shè)置MaxMetaspaceSize的大小。
除此之外,它還有以下優(yōu)點(diǎn)(沒有完全理解,先貼出來吧,來自StackOverflow):

  • 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

2、垃圾回收

如果Metaspace的空間占用達(dá)到了設(shè)定的最大值,那么就會(huì)觸發(fā)GC來收集死亡對象和類的加載器。根據(jù)JDK 8的特性,G1和CMS都會(huì)很好地收集Metaspace區(qū)(一般都伴隨著Full GC)。
為了減少垃圾回收的頻率及時(shí)間,控制吞吐量,對Metaspace進(jìn)行適當(dāng)?shù)谋O(jiān)控和調(diào)優(yōu)是非常有必要的。如果在Metaspace區(qū)發(fā)生了頻繁的Full GC,那么可能表示存在內(nèi)存泄露或Metaspace區(qū)的空間太小了。

3、新增參數(shù)

  • -XX:MetaspaceSize是分配給類元數(shù)據(jù)空間(以字節(jié)計(jì))的初始大小(Oracle邏輯存儲(chǔ)上的初始高水位,the initial high-water-mark ),此值為估計(jì)值。MetaspaceSize的值設(shè)置的過大會(huì)延長垃圾回收時(shí)間。垃圾回收過后,引起下一次垃圾回收的類元數(shù)據(jù)空間的大小可能會(huì)變大。
  • -XX:MaxMetaspaceSize是分配給類元數(shù)據(jù)空間的最大值,超過此值就會(huì)觸發(fā)Full GC,此值默認(rèn)沒有限制,但應(yīng)取決于系統(tǒng)內(nèi)存的大小。JVM會(huì)動(dòng)態(tài)地改變此值。
  • -XX:MinMetaspaceFreeRatio表示一次GC以后,為了避免增加元數(shù)據(jù)空間的大小,空閑的類元數(shù)據(jù)的容量的最小比例,不夠就會(huì)導(dǎo)致垃圾回收。
  • -XX:MaxMetaspaceFreeRatio表示一次GC以后,為了避免增加元數(shù)據(jù)空間的大小,空閑的類元數(shù)據(jù)的容量的最大比例,不夠就會(huì)導(dǎo)致垃圾回收。

4、監(jiān)控與調(diào)優(yōu)(待補(bǔ)充)

VisualVM,jstat,jstack可以監(jiān)測元空間的動(dòng)態(tài),后續(xù)將更新這里。


參考資料:

[1]《The Java Virtual Machine Specification, Java SE 8 Edition》, Oracle.
[2]What is the use of Metaspace in Java 8? - StackOverflow
[3]About G1 Garbage Collector, Permanent Generation and Metaspace
[4]JEP 122: Remove the Permanent Generation
[5]PermGen elimination in JDK 8 - StackOverflow

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Metaspace 之一:Metaspace整體介紹(永久代被替換原因、元空間特點(diǎn)、元空間內(nèi)存查看分析方法)
Jvm的崩潰問題解決
元空間介紹
JVM發(fā)生內(nèi)存溢出的8種原因、及解決辦法
10個(gè)經(jīng)典又容易被人疏忽的JVM面試題
Java 8新特性探究(九)跟OOM:Permgen說再見吧
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服