java gc回收机制_Java中的GC回收机制

为什么要进行GC回收?当我们新建一个对象时,系统就会为其分配一定的内存空间,而有时候新建的对象没有去使用时,不回收的话会极大浪费内存空间,造成系统效率低下。什么时候进行GC回收?1、当CPU空闲的时候2、执行System.gc()方法的时候3、堆内存满了以后GC的算法有引用计数法和可达性分析的算法进行回收引用计数法:当新建对象就创建一个与之对应的计数器,当对象被使用时计数器就加一,而当不执行此对象...
摘要由CSDN通过智能技术生成

为什么要进行GC回收?

当我们新建一个对象时,系统就会为其分配一定的内存空间,而有时候新建的对象没有去使用时,不回收的话会极大浪费内存空间,造成系统效率低下。

什么时候进行GC回收?

1、当CPU空闲的时候

2、执行System.gc()方法的时候

3、堆内存满了以后

GC的算法有引用计数法和可达性分析的算法进行回收

引用计数法:当新建对象就创建一个与之对应的计数器,当对象被使用时计数器就加一,而当不执行此对象时计数器就减一,最终计数器为0的对象将会被回收。

优点:执行速度快

缺点:当存在相互引用时会造成内存泄漏

相互引用

public class test{

public static void main(String []args){

public Object instance=null;

test test1 = new test();

test test2 = new test();

test1.instance = test2;

test.instance = test1;

test1=null;

test2=null;

}

}

内存泄漏:内存泄漏是指无用对象(不再引用对象)持续占有内存,得不到及时的释放,从而造成的内存空间的浪费。

可达性分析法:

通过一系列名为"GC Roots"的对象作为起点,从这些节点往下搜寻,搜索所经过的路径称为引用链,当某个对象没有任何引用链相连时,证明此对象无用,回收(回收不是立即进行的,Java对象在回收前调用finalize()方法——finalize方法通常交给线程优先级较低的线程去处理,有些本应该被回收的对象还会“再生”原因是它复制给了可达对象去引用“借尸还魂法”)。

01fe566d79c4b628106294518ec1a0a4.png

如何回收?

回收算法有四种:标记清除法、复制算法、标记整理法、分代回收法

标记清除法:

对内存中无用的对象进行标记,然后回收,缺点是会造成内存不连续,空间的浪费。

c1075d73dedc69fc28e511b225557330.png

复制算法:

将内存分成两块,每次只使用其中的一块,当这一块使用完之后就将这一块中存活的对象复制到另一块内存中,已经使用完的内存空间清除。缺点是将内存缩成原来的一半。对于存活较多的对象,要进行复制,效率较低。</

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值