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
-XX:+UseConcurrentMarkSweepGC | 当通过命令行选项XX:+UseConcurrentMarkSweepGC 激活CMS 垃圾收集器时也会缺省自动激活这两个选项 |
-XX:+CMSParallelInitialMarkEnabled | CMS激活多线程的初始标记 |
-XX:CMSParallelRemarkEnabled | CMS激活多线程的重新标记 |
-XX:SoftRefLRUPolicyMSPerMB=0 | 每兆堆空闲空间中SoftReference的存活时间, 软引用业务中很少用 |
-XX:+CMSClassUnloadingEnabled | CMS收集器默认不会对永久代进行垃圾回收。防止永久代内存 耗尽进行Full GC |
-XX:SurvivorRatio=8 | 默认为8,Survivor和Edon的比例是8:1:1, Survivor是有两个的 |
-XX:-UseParNewGC | 如果指定了选项-XX:+UseConcMarkSweepGC选项, 则新生代默认使用ParNew GC策略,此处是关闭 |
-XX:-OmitStackTraceInFastThrow | 关闭jvm吞异常堆栈信息的优化 |
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
-XX:G1HeapRegionSize |
设置的 G1 区域的大小。值是 2 的幂,范围是 1 MB 到 32 MB 之间。目标是根据最小的 Java 堆大小划分出约 2048 个区域。如果巨型分配导致连续的并发周期,并且此类分配导致老年代碎片化,请增加 -XX:G1HeapRegionSize ,这样一来,之前的巨型对象就不再是巨型对象了,而是采用常规的分配路径 |
-XX:G1ReservePercent |
设置作为空闲空间的预留内存百分比,以降低目标空间溢出的风险。默认值是 10%。增加或减少百分比时,请确保对总的 Java 堆调整相同的量 |
-XX:InitiatingHeapOccupancyPercent |
设置触发标记周期的 Java 堆占用率阈值。默认占用率是整个 Java 堆的 45%。通过减少 -XX:InitiatingHeapOccupancyPercent 提前启动标记周期。 |
-XX:NumberOfGCLogFiles |
设置切分GC 日志文件数量 |
-XX:+AlwaysPreTouch | 为避免运行时性能损失,启动应用时使用JVM选项-XX:+AlwaysPreTouch 访问和清零页面
|
-XX:MaxDirectMemorySize=15g | 直接内存最大值,当NIO比较多的应用场景更应当设置 |
-XX:-UseBiasedLocking | jvm默认开启偏向锁,在竞争激烈的应用中,偏向锁会加重系统负担,此处为关闭(+开启,-关闭,=赋值) |
备注:避免使用 -Xmn
选项或 -XX:NewRatio
等其他相关选项显式设置年轻代大小。固定年轻代的大小会覆盖暂停时间目标。
参考:
http://www.cnblogs.com/ityouknow/p/5614961.html
http://www.oracle.com/technetwork/cn/articles/java/g1gc-1984535-zhs.html