Java基础-GC

本文深入探讨了Java的垃圾回收机制,包括引用类型、对象判活的标准、方法区回收策略、多种垃圾收集算法以及不同收集器的特点。重点介绍了Stop The World现象、安全点与安全区域,以及CMS和G1收集器的对比。同时,文章还讨论了内存分配策略,如TLAB、对象在新生代和老年代的分配规则。
摘要由CSDN通过智能技术生成
引用
  • 狭义引用
    • 地址
  • 扩充引用
    • 强引用 Strong Reference
      • Object obj = new Object()
    • 软引用 Soft Reference
      • SoftReference,将要发生内存溢出才会回收
    • 弱引用 Weak Reference
      • WeakReference,不影响回收,可做回收通知
    • 虚引用 Phantom Reference
      • PhantomReference,不影响回收,可做回收通知
对象判活
  • 引用计数法
    • 无法解决循环引用
  • 可达性分析
    • GC Roots
      • 虚拟机栈中引用
      • 类静态属性引用
      • 方法区常量引用
      • 本地方法栈中JNI引用
    • 对象状态
      • GC Roots可达
      • GC Roots不可达但需执行finalize
      • 不可达也不需执行finalize
    • 执行finalize
      • 进入F-Queue,由虚拟机建立的低优先级Finalizer线来执行,此执行表示触发,但不保证执行结束
      • 若finalize方法卡死,会被咔嚓掉
      • finalize方法中可进行一次自救,但只能救一次
      • finalize方法据说是在初期对应C/C++的析构函数而做的一次折中,实际并不提倡使用,而用try-finally更好
    • 枚举根节点
      • 必须Stop The World,所以对效率很敏感,全局扫描是不现实的
      • 得益于准确式GC,虚拟机知道某个地址存的是什么类型数据,以此建立OopMap(Ordinary Object Pointer)
      • 虚拟机没有为每条指令都建立OopMap,因为成本太高
      • 所以有了Safe Point的概念,“可长时间执行”的地方,会建立OopMap,即安全点
      • 可长时间执行一般指指令序列复用,即方法调用,循环跳转,异常跳转
      • 有安全点后,需要考虑怎么让线程都停在安全点
      • 抢先式中断(Preemptive Suspension)
        • 发生GC时虚拟机停止所有线程,恢复没有跑到安全点的线程,等其安全,几乎不用
      • 主动式中断(Voluntary Suspension)
        • 生成一个test轮询指令,在安全点处执行,看是否有中断标识存在,若存在就停下自己
        • 具体方案是虚拟机将一个内存页设为不可读,test读
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Eddy咸鱼

感谢大佬加鸡蛋~

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

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

打赏作者

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

抵扣说明:

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

余额充值