JDK8以前,static variables、class metadata存放在PermGen(Permanent Generation)中,JDK8上,static variables、class metadata存放在MetaSpace中。爲何要移除PermGen?java
PermGen 的缺點:google
- PermGen是heap的一部分,使用達到limit時,會出現拋出OOM。雖然能夠指定maximum size,但使用的內存大小不能自動增加。
- 在引入PermGen時,沒有考慮dynamic class loading/unloading,class一旦被加載了,不能被動態unloading,會一直存在直到JVM shut down。
Metaspace的好處:spa
- MetaSpace使用native memory space,它的大小會自動增加,直到操做系統所能提供的,這樣咱們即便不指定MaxSize,也不會出現OOM,除非達到操做系統提供的內存上限。
- MetaSpace中,在JVM運行期間,class能夠被loading,也支持unloading。
上面所述的可能只是分部,極可能說的不全,建議自行google/bing.com。操作系統
移除Permanent Generation的JEP22描述。.net
參考:內存
- https://stackoverflow.com/questions/27131165/what-is-the-difference-between-permgen-and-metaspace