到底谁才是垃圾?
-
强引用(使用频率:☆☆☆☆☆)
-
软引用(使用频率:☆☆☆☆)
-
弱引用(使用频率:☆)
-
虚引用(使用频率:程序员基本不会使用到)
堆内存的详细结构
标记-清除
标记-清除
就没有优点了吗?优点还是有的:速度快
-
优点
-
缺点
标记-复制
-
优点
-
缺点
标记-整理
-
优点
-
缺点
-
1、躲过15次GC。每次垃圾回收后,存活的对象的年龄就会加1,累计加到15次(jdk8默认的),也就是某个对象躲过了15次垃圾回收,那么JVM就认为这个是经常被使用的对象,就没必要再带着年轻代中了。具体的次数可以通过 -XX:MaxTenuringThreshold 来设置在躲过多少次垃圾收集后进去老年代。 -
2、动态对象年龄判断。规则:在某个 Survivor 中,如果有一批对象的大小总是大于该 Survivor 的 50%,那么此时大于等于该批对象年龄的对象机会会直接到老年代中。 -
3、大对象直接进入老年代。-XX:PretenureSizeThreshold 来设置大对象的临界值,大于该值的就被认为是大对象,就会直接进入老年代。
躲过15次 GC
-XX:PretenureSizeThreshold
参数来设置。
动态对象年龄判断
大对象直接进入老年代
-XX:HandlerPromotionFailure
的参数是否设置了,这个参数表示:是否设置空间分配担保。
是:就会判断老年代的剩余的空间的大小是否是大于之前的每一次 MinorGC 后进入老年代的对象的平均的大小
否:那么此时就会进行FULL GC来为老年代腾出一些空间
假设现在开启了空间分配担保,并且发现之前的每次 Minor GC 后的对象的平均大小(假设是10 M)是小于老年代可用空间的大小(假设现在是12 M)的,那么就会认为本次 Minor GC 后差不多也是10 M的对象进入到老年代。但是如果最终垃圾回收剩余存活对象大于13 M,那么就直接 OOM;
java -XX:+PrintCommandLineFlags -version
命令可以查看当前 JVM 使用的垃圾收集器
新生代的垃圾收集器
-XX:UseSerialGC
;开启后,会使用Serial(Young区使用)+Serial Old(Old区使用)组合收集器。新生代、老年代都会使用串行回收收集器,新生代使用【标记-复制算法】老年代使用【标记-整理算法】
-
可控的吞吐量(运行用户的的代码时间/(运行用户的代码时间+垃圾收集时间))。也即运行100分 钟,垃圾收集时间为1分钟,那么吞吐量就是99%。高吞吐量意味着高效的CPU利用率 -
自适应调节策略也是Parallel Scavenge 和 ParNew 的一个重要的区别(虚拟机会根据当前的 系统的运行情况手机性能监控信息,动态的调整这些参数以提供最合适的停顿时间(- XX:MaxGCPauseMillis)或最大的吞吐量) -
如果新生区激活-XX:+UseParallelGC(或者是-XX:UseParallelOldGC他们可以互相激活)老 年区就自动使用Parallel Old,使用Parallel Scavenge收集器 - -XX:ParallelGCThreads=N 表示启动多少个线程 cpu>8 N=5/8 cpu<8 N=实际个数
老年代的垃圾收集器
最近有很多人问,有没有读者交流群,想知道怎么加入。
最近我创建了一些群,大家可以加入。交流群都是免费的,只需要大家加入之后不要随便发广告,多多交流技术就好了。
目前创建了多个交流群,全国交流群、北上广杭深等各地区交流群、面试交流群、资源共享群等。
有兴趣入群的同学,可长按扫描下方二维码,一定要备注:全国 Or 城市 Or 面试 Or 资源,根据格式备注,可更快被通过且邀请进群。
往期推荐
字节跳动将取消大小周,加班要打申请!此前1/3员工不同意,有人担心“一年少赚近10万”
谷歌:. apk 成为历史!
在线求CR,你觉得我这段Java代码还有优化的空间吗?
评论