java gc 总结
1. G1适用于大内存,缺陷是稳定性待检验。
1.1 jvm分配内存超过8G,其中Eden超过4G,推荐使用G1垃圾回收器; Eden区使用复制算法回收内存,G1采用标记-整理;G1把内存划分为小块,优先回收有最大回收度的区域。
1.2 目前市面上小内存JVM大都采用CMS和paraNew配合使用,paraNew是serial的多线程版本。CMS对老年代的回收采用标记-并发清除,再次标记(并发部分新产生垃圾的标记),清理。
1.3 JAVA_OPTS指定GC日志和日志输出格式
-Xloggc:/dev/shm/mq_gc_%p.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps
2. 内存回收时候的引用关系
2.1 引用分为
强引用(不回收)
软引用(内存充足不回收,不足回收)
弱引用(回收)
虚引用(回收)
2.2一般业务代码中使用强引用,其他引用很少使用,其他引用可以在jdk中发现。
强引用举例:
赋值运算,Object o = new Object();
软引用举例:
SoftReference s =new SoftReference(String.class);
软引用使用场景,如应用内缓存,方便内存回收。
3.因为引用计数解决不了循环应用,所以使用引用可达性来决定是否回收内存
reboot:
虚拟机栈中引用的对象(因为在运行,所以不被回收)
类静态变量引用的对象(类静态变量是所有实例共享的,类不回收,静态变量不会被回收;类的所有实例被回收后,并且类的类加载器也被回收,并且不能通过反射使用类,满足3个条件类才会被回收,然后类静态变量才能被回收)
常量引用的对象
JNI引用的对象(比如数据库连接)
附2中jvm参数配置
CMS配置参考:
-Xms4g -Xmx4g -Xmn2g -XX:PermSize=128m -XX:MaxPermSize=320m -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSInitiatingOccupancyFraction=70 -XX:+CMSParallelRemarkEnabled -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+CMSClassUnloadingEnabled -XX:SurvivorRatio=8 -XX:+DisableExplicitGC -XX:-UseParNewGC -verbose:gc -Xloggc:/dev/shm/rmq_srv_gc.log -XX:+PrintGCDetails -XX:-OmitStackTraceInFastThrow -XX:-UseLargePages
G1配置参考:
-Xms8g -Xmx8g -Xmn4g -XX:+UseG1GC -XX:G1HeapRegionSize=16m -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30 -XX:SoftRefLRUPolicyMSPerMB=0 -XX:SurvivorRatio=8 -XX:+DisableExplicitGC
-verbose:gc -Xloggc:/dev/shm/mq_gc_%p.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintAdaptiveSizePolicy -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=30m -XX:-OmitStackTraceInFastThrow -XX:+AlwaysPreTouch -XX:MaxDirectMemorySize=15g -XX:-UseLargePages -XX:-UseBiasedLocking
参考: