JVM参数优化
GC(GarbageCollection)不会在主程序运行期对永久域进行清理。
各主要参数的作用如下 :
-Xms:设置jvm内存的初始大小
-Xmx:设置jvm内存的最大值
-Xmn:设置新域的大小(这个似乎只对 jdk1.4来说是有效的,后来就废弃了)
-Xss:设置每个线程的堆栈大小(也就是说,在相同物理内存下,减小这个值能生成更多的线程)
-XX:NewRatio :设置新域与旧域之比,如-XX:NewRatio = 4就表示新域与旧域之比为1:4
-XX:NewSize:设置新域的初始值
-XX:MaxNewSize :设置新域的最大值
-XX:PermSize:设置永久域的初始值
-XX:MaxPermSize:设置永久域的最大值
-XX:SurvivorRatio=n:设置新域中Eden区与两个Survivor区的比值。(Eden区主要是用来存放新生的对象,而两个 Survivor区则用来存放每次垃圾回收后存活下来的对象)
java.lang.OutOfMemoryError:Java heap space和java.lang.OutOfMemoryError: PermGenspace,其中前者是有关堆内存的内存溢出,可以同过配置-Xms和-Xmx参数来设置,而后者是有关永久域的内存溢出,可以通过配置 -XX:MaxPermSize来设置。
拜读贵博,良心之作。
-Djava.rmi.server.hostname=10.165.22.115
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=”9090″
-Dcom.sun.management.jmxremote.authenticate=”false”
-Dcom.sun.management.jmxremote.ssl=”false”
-XX:+UseConcMarkSweepGC
-Xms4096m
-Xmx6144m
-Xmn2048m
-XX:SurvivorRatio=4
-XX:PermSize=64M
-XX:MaxPermSize=128M
-XX:ReservedCodeCacheSize=64M
-XX:NewSize=128M
-Xloggc:d:gcgc.log
-Djava.security.egd=file:/dev/./urandom
熵
MC & MU & CCSC & CCSU
MC表示Klass Metaspace以及NoKlass Metaspace两者总共committed的内存大小,单位是KB,虽然从上面的定义里我们看到了是capacity,但是实质上计算的时候并不是capacity,而是committed,这个是要注意的
MU这个无可厚非,说的就是Klass Metaspace以及NoKlass Metaspace两者已经使用了的内存大小
CCSC表示的是Klass Metaspace的已经被commit的内存大小,单位也是KB
CCSU表示Klass Metaspace的已经被使用的内存大小
M & CCS
M表示的是Klass Metaspace以及NoKlass Metaspace两者总共的使用率,其实可以根据上面的四个指标算出来,即(CCSU+MU)/(CCSC+MC)
CCS表示的是NoKlass Metaspace的使用率,也就是CCSU/CCSC算出来的
PS:所以我们有时候看到M的值达到了90%以上,其实这个并不一定说明metaspace用了很多了,因为内存是慢慢commit的,所以我们的分母是慢慢变大的,不过当我们committed到一定量的时候就不会再增长了
MCMN & MCMX & CCSMN & CCSMX
MCMN和CCSMN这两个值大家可以忽略,一直都是0
MCMX表示Klass Metaspace以及NoKlass Metaspace两者总共的reserved的内存大小,比如默认情况下Klass Metaspace是通过CompressedClassSpaceSize这个参数来reserved 1G的内存,NoKlass Metaspace默认reserved的内存大小是2* InitialBootClassLoaderMetaspaceSize
CCSMX表示Klass Metaspace reserved的内存大小
综上所述,其实看metaspace最主要的还是看MC,MU,CCSC,CCSU这几个具体的大小来判断metaspace到底用了多少更靠谱