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 

-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

上一篇:elasticsearch总结


下一篇:网络协议