extend:
SoftReference类型的fullgc并不会回收掉,fullgc后还没有空间装下对象就会再次发生fullgc回收掉SoftReference类型,如果第二次fullgc后空间还不够,就会产生oom。
元空间有余,间接扩容,如果扩容到MetaspaceSize引发old gc(依据垃圾回收器决定,如果g1 的G1Old cms的CMS),卸载类并扩容,扩容到MaxMetaspaceSize,引发full gc 卸载类。

jstat -gc {pid} 查看jvm内存应用状况

   class {pid} 查看类加载状况   gccause 上次和本次gc的产生的起因   gcutil 查看gc状况

https://blog.csdn.net/yaoqian...

jmap -clstats {pid} 查看类加载状况

    no option: 查看过程的内存映像信息,相似 Solaris pmap 命令。    heap: 显示Java堆详细信息    histo[:live]: 显示堆中对象的统计信息    finalizerinfo: 显示在F-Queue队列期待Finalizer线程执行finalizer办法的对象    dump:<dump-options>:生成堆转储快照    F: 当-dump没有响应时,应用-dump或者-histo参数. 在这个模式下,live子参数有效.    J<flag>:指定传递给运行jmap的JVM的参数

dump进去文件,应用jvisualvm.exe或者其余工具查看文件。jvm命令:jmap -dump:format=b,file=outfile {pid}

java -XX:+PrintFlagsFinal -version:查看jvm信息

$jinfo -flags {pid} :查看过程的jvm参数

   -flag <name> pid:打印指定JVM的参数值    -flag [+|-]<name> pid:设置指定JVM参数的布尔值   

pmap [ -x | -d ] [ -q ] pid:查看过程的内存映像信息

jvm参数
-verbose:class 查看类加载状况
-verbose:gc 查看虚拟机中内存回收状况
-verbose:jni 查看本地办法调用的状况
-XX:+PrintFlagsInitial查看初始值
-XX:+PrintFlagsFinal查看最终的值,因为初始值有可能被批改
-XX:+UnlockExperimentalVMOptions解锁试验参数,JVM中有些试验参数无奈间接赋值,必须先应用此参数能力赋值
-XX:+UnlockDiagnosticVMOptions解锁诊断参数
-XX:+PrintCommandLineFlags打印命令行参数

-XX:MetaspaceSize=N和-XX:MaxMetaspaceSize=N,对于64位JVM来说,元空间的默认初始大小是20.75MB,默认的元空间的最大值是有限。MaxMetaspaceSize用于设置metaspace区域的最大值,这个值能够通过mxbean中的MemoryPoolBean获取到,如果这个参数没有设置,那么就是通过mxbean拿到的最大值是-1,示意无穷大。

因为调整元空间的大小须要Full GC,这是十分低廉的操作,如果利用在启动的时候产生Full GC,通常都是因为永恒代或元空间产生了大小调整,基于这种状况,个别倡议在JVM参数中将MetaspaceSize和MaxMetaspaceSize设置成一样的值

在JVM参数中肯定要设置HeapDumpAfterFullGC和HeapDumpOnOutOfMemoryError两个参数,能够在发送FGC和OOM的时候将过后的Java堆状况记录下来,用于预先剖析;(2)GC日志要独自打印到一个日志文件中,不便剖析,如果不特地设置,GC日志会打印到stdout.log中,会有其余的日志混合在两头,影响问题排查。