jvm——metaspace代替永久代


https://mp.weixin.qq.com/s?__biz=MzIzNjI1ODc2OA==&mid=2650886860&idx=1&sn=f8bc6ab03d7a07022c86bf726209b17c&chksm=f32f6673c458ef657358068a8aea4664d3cbc8a488e6bfd6445c0743140f6fc8bcf9649298b7&scene=21#wechat_redirect

http://www.cnblogs.com/duanxz/p/3520829.html

1.什么時候會觸發fullGC?fullGC頻繁可能的原因是什么?

當metaSpace超過MaxMataSpaceSize設置值時會觸發FullGC,默認是無窮大;

存在類、類加載器導致的內存泄漏或大小不合適

2.metaSpace的組成?

Klass MetaSpace:

  用來存klass的(class文件在jvm中運行時的數據結構);

  一個緊接着Heap的連續的存儲空間;

  這塊內存大小可通過-XX:CompressedClassSpaceSize參數來控制,這個參數默認是1G,但是這塊內存也可以沒有,假如沒有開啟壓縮指針就不會有這塊內存,這時候Klass信息存在NoKlass Metaspace中。

NoKlass MetaSpace:

  專門來存klass相關的其他的內容,比如method,constantPool等;

  這塊內存是由多塊內存組合起來的,所以可以認為是不連續的內存塊組成的;

  NoKlass Mestaspace是由一塊塊內存慢慢組合起來的,在沒有達到限制條件的情況下,會不斷加長這條鏈,讓它可以持續工作。

3.java8中永久代被元數據區取代,有什么好處?

1)把永久代從jvm虛擬機中移除,metaSpace放置於內存中,既節省了JVM的內存空間,又避免了永久代大小設置不合理帶來的困擾。

2)解決永久代的OOM問題。內存空間一般來說是足夠大的,當meatSpace超級大的時候,就被操作系統殺死了。(如果Klass Metaspace用完了,那就會OOM了,不過一般情況下不會)

3)

4.元空間的問題?

元空間虛擬機采用了組塊分配的形式,同時區塊的大小由類加載器類型決定。類信息並不是固定大小,因此有可能分配的空閑區塊和類需要的區塊大小不同,這種情況下可能導致碎片存在。元空間虛擬機目前並不支持壓縮操作,所以碎片化是目前最大的問題。

5.元空間的優化?

-XX:MaxMetaspaceSize:默認是無窮大;功能就是為metaSpace設置一個最大閾值,當metaSpace的內存超過這個值的時候會觸發FullGC;

(我覺得這個內存說的是Klass和NoKlass的總和?為什么元空間的初始大小是21M?這里說的元空間是Klass+NoKlass么? 下面那個-->" -XX:CompressedClassSpaceSize:默認是1G;" 這里給的默認值應該是Klass空間的默認值吧,怎么比元空間的還大?)

 

 -XX:CompressedClassSpaceSize:默認是1G;這個參數主要是設置Klass Metaspace的大小,不過這個參數設置了也不一定起作用,前提是能開啟壓縮指針,假如-Xmx超過了32G,壓縮指針是開啟不來的。

6.什么時候類加載器會被回收?類加載器在metaSpace中么?

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM