java gc 总结

2017-08-22  本文已影响0人  清风89

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

参考:

http://www.cnblogs.com/ityouknow/p/5614961.html

上一篇 下一篇

猜你喜欢

热点阅读