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中么?