点击上方蓝字关注我们 文末有惊喜
jvm在每次minor gc之前,都会计算老年代的剩余可用空间,如果可用空间小于年轻代里面所有对象之和,如果没有配置担保参数(“-XX:-HandlePromotionFailure),这个时候就会直接执行full gc,如果配置了担保参数,就不会立即发生full gc,这个时候需要判断老年代可用空间是否大于之前每次minor gc后移动到老年代的平均大小,如果大于,则还是执行minor gc,否则执行 full gc ,流程图如下:
给对象中添加一个引用计数器,每当有一个地方引用它,计数器就加1;当引用 失效,计数器就减1;任何时候计数器为0的对象就是不可能再被使用的。这个方法实现简单,效率高,但是目前主流的虚拟机中并没有选择这个算法来管 理内存,其最主要的原因是它很难解决对象之间相互循环引用的问题
这个算法的基本思想就是通过一系列的称为 “GC Roots” 的对象作为起点, 从这些节点开始向下搜索,找到的对象都标记为非垃圾对象,其余未标记的对象 都是垃圾对象 GC Roots根节点:线程栈的本地变量、静态变量、本地方法栈的变量等等。