三、深入理解Java虚拟机-垃圾收集器

1、 对象存活算法

(1) 引用计数法
给对象添加一个引用计数器,有引用则+1,引用失效则-1,计数为0时认为是可回收对象。
缺点:主流的Java虚拟机里面没有选用引用计数算法来管理内存,其中最主要的原因是它很难解决对象之间相互循环引用的问题
(2) 可达性分析法
从GC Roots出发到对象不可达时,认为是可回收对象
Java中的GC Roots对象:
a) 虚拟机栈(栈帧中的本地变量表)中引用的对象。
b) 方法区中类静态属性引用的对象。
c) 方法区中常量引用的对象。
d) 本地方法栈中JNI(即一般说的Native方法)引用的对象。

2、 引用

如果reference类型的数据中存储的数值代表另一块内存的起始地址,就称这块内存代表着一个引用。
(1) 强引用:必须对象,例如新建对象new,只要存在,垃圾收集器永远不会回收
(2) 软引用:有用但非必须对象,SoftReference类,在系统要发生OOM之前进行回收,如果回收之后内存依旧不够,才会抛出OOM
(3) 弱引用:非必须对象,WeakReference类,无论内存是否足够,都会被回收
(4) 虚引用:也称幽灵引用或者幻影引用,虚引用的存在完全不会对其生存时间有影响,也无法通过虚引用获取实例。PhatomReference类,为一个对象设置虚引用的唯一目的是在对象被回收时收到一个系统通知

3、 回收流程

不建议使用
(1) 第一次筛选:可达性分析
(2) 没有引用链则进行第一次标记以及一次筛选,筛选条件为此对象是否有必要执行finalize():
a) 没有覆盖finalize()方法
b) finalize()方法已经被调用过,只会被系统自动调用一次
(3) 如果有必要执行finalize()则会将对象放置在F-Queue中
(4) 虚拟机自动创建,低优先级的Finalizer线程触发队列中对象的finalize方法
(5) 第二次标记:如果在finalize方法中对象与引用链上对象创建关联,则移出队列不进行回收

4、 方法区回收

一般来说,垃圾回收都是在堆中发生,特别是堆中的新生代区域,而方法区也被称为永久代的垃圾手机效率很低。
1、永久代主要回收两部分:
(1) 废弃常量:常量池中没有对象引用
(2) 无用类:需要同时满足一下三个条件:
a) 类的所有实例都已经被回收,也就是堆中不存在任何该类的实例
b) 加载该类的classLoader已经被回收
c) 该类的Class对象没有被引用,无法反射访问该类的方法
2、HotSpot参数
-Xnoclassgc 关闭类GC,类对象不会被回收
-verbose:class 查看加载的类的情况
-XX:+TraceClassLoading
-XX:+TraceClassUnLoading

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值