Java垃圾回收与分配策略

1.如何判断对象已死?

a、引用计数法:给对象增加一个引用计数器,每当有一个地方引用他,计数器就加1,当引用失效时,计数器就减1;任何时刻计数器为0的对象就是不能再被使用的,即对象已死;
优点:实现简单,判定效率高,大部分情况下都是一个不错的算法;
缺点:无法解决循环引用问题
b、可达性分析算法:通过一系列称为“GC Roots"的对象作为起点,从这些节点开始向下搜索,搜索过的路径称之为“引用链”,当一个对象到GC Roots没有任何引用链相连时(从GC Roots到这个对象不可达),证明此对象是不可用的;

一个对象彻底死亡至少要经历两次标记过程:1.若对象到任意一个GC Roots对象不可达,将被第一次标记,并且进行一次筛选;筛选依据为此对象是否要执行finalize(),当此对象没有覆写finalize()或finalize()被调用过,此时对象真正死亡;2.如果对象覆写finalize()且未被JVM调用,此时对象会被放置在F-Queue队列中稍后由JVM回调finalize(),如果对象在finalize()中和GC Roots相连,则成功拯救自己,否则真正死亡;
任何对象的finalize()方法都只会被系统自动调用一次;

在Java语言中,可作为GC Roots的对象包含下面几种:
1.虚拟机栈(栈帧中的本地变量表)中引用的对象
2.方法区中类静态属性引用的对象
3.方法区中常量引用的对象
4.本地方法栈中JNI(Native)引用的对象

java将引用分为四类:
强、软、弱、虚;
1.垃圾回收不会回收强引用对象
2.软引用:在系统将要发生内存溢出之前,会把这些对象列入回收范围内进行第二次回收
3.弱引用:无论当前内存是否够用,都会回收掉只被弱引用关联的对象
4.虚引用:为一个对象设置虚引用的目的就是能在这个对象被收集器回收时收到一个系统通知

判断一个类为无用类的要求:
1.该类的所有实例,已经被回收,即Java堆中不存在该类的实例
2.加载类的类加载器已经被回收
3.该类的Class对象没有在其他任何地方被引用,无法通过反射访问该类所有的属性与方法;

新生代回收(复制算法)、老年代回收(标记算法)...
...

内存分配回收策略:
1.对象优先在Eden区分配
2.大对象直接进入老年代
3.长期存活的对象将进入老年代
4.动态对象年龄判定:如果Survivor空间中相同年龄的所有对象大小的总和 > Survivor空间的一半,年龄大于等于该年龄的就可以直接进入老年代;

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值