垃圾回收

如何判断对象为垃圾对象?如何回收?何时回收?
1.引用计数法(没有使用)
在对象中添加一个引用计数器,当有地方引用时,引用计数器加一,当引用生效时,引用计数器减一

public class Test2 {
    private Test2 t;
    public Test2(){
        byte[] bytes = new byte[20 * 1024 * 1024];
    }
    public static void main(String[] args) {
        Test2 t1 = new Test2();
        Test2 t2 = new Test2();
        t1.t=t2;
        t2.t=t1;
        t1=null;
        t2=null;
        System.gc();
    }
}

在vm options中添加参数

-verbose:gc 
-XX:+PrintGCDetails

2.可达性分析法
作为GCRoot的对象
虚拟机栈
方法区的类属性所引用的对象
方法区常量所引用的对象
本地方法栈中所引用的对象

3.回收策略
a.标记-清除算法
效率问题
空间问题
b.复制算法
线程共享区:堆(新生代:Eden、Suvivor、 Tenured Gen;年老代) 方法区
线程独占区:栈 本地方法栈 程序计数器
针对新生代回收
c.标记-整理-清除算法
针对老年代回收
d.分代收集算法
不同的分代年龄的对象使用不同的回收算法

4.垃圾收集器
a.serial收集器
最基本最悠久,单线程垃圾收集器,没有线程开销
适合桌面应用

b.ParNew收集器
多线程

c.parallel收集器
复制算法(新生代收集器)
多线程收集器
吞吐量:CPU运行用户代码的时间与CPU消耗的总时间的比值
(吞吐量=运行用户代码的时间/(运行用户代码的时间+垃圾收集消耗的时间))
-XX:MaxGCPauseMillis 垃圾收集器的最大停顿时间
-XX:GCTimeRatio 吞吐量大小(0,99)
达到可控制的吞吐量

d.CMS(Concurrent Mark Sweep)垃圾收集器
工作过程:(老年代)
初始标记
并发标记
重新标记
并发清理
优点:
并发收集 低停顿
缺点:
占用大量CPU资源
无法处理浮动垃圾
出现Concurrent Mode Failure
空间碎片

e.g1垃圾收集器(最牛的垃圾收集器)
优势:
并行并发
分代收集(针对内存区域)
空间整合
可预测的停顿

步骤:
初始标记
并发标记
最终标记
筛选回收

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

但行益事莫问前程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值