Java基础之清除---垃圾回收和收尾

 “  对于Java开发者来说,从来不担心垃圾回收的问题(GC)。因为Java语言的优越性就在于自动回收对象(我们创建后不用的对象)”---这种观点确实是我们初次学习Java的感受。但事实上真的完全如我们想的那样吗?

LZ来举一个例子:通常我们创建对象都是用new关键字,即:People p = new People();这样我们在用完该对象后JVM会回收该对象内存。假如我们创建对象people时不用new关键字创建,那GC会回收这个“特殊”的内存吗?

答案是:不会的。因为Java的GC操作只是回收new出来的对象,而其他的创建的对象没法回收。于是在这种情况下我们缩写的程序就会出现很大的内存漏洞。不过随着Java的发展,其提供了一个方法来解决此问题---finalize()。我引用下源码解释:

          

意思就是:当回收器在回收一个不在引用的对象时,就会先调用该方法;调用此方法后该对象就会被清理或是打扫(LZ用词不当请指正哈~~~~~),最后GC可以回收该对象。

         

LZ对之前的“清理打扫”做下详细解释:在源码解释中,我们知道,在回收对象前我们会调用finalize方法,该操作只为确保此对象不再被任何尚未被回收的线程访问,是该对象处于“另一个世界”----即将被回收的世界,在这个世界里固然还是会有些对象或者是线程。不过这些都会被GC回收(多么残忍的世界啊!所以在创建对象时,要三思啊)但是需要注意得是:调用finalize()后对象并没有完全消失,只是被保留下来了,等待回收,一旦被GC回收之后,就此退出历史舞台。

关于进入了等待回收的世界,这些对象会经历些什么,我们下次讨论内存模型再详细说明!

好,我们继续来讨论回收和收尾的话题,前面我们知道了一个特殊对象的回收过程。从这儿我们或许会思考啊!Java是面向对象编程的语言,在Java的世界里,一切皆是对象!我们在编程的时候往往会产生大量的对象,有很多对象都在进行回收,因此会不停地调用GC和finalize,这样会不会增加系统额外的开销?

答案是肯定的。我们以Java的思维去思考,就会发现很多事情都不会尽善尽美的。需要做到一个平衡。确实在垃圾回收这一块需要设定一个临界值来触发GC操作。

还有个问题:看过源码的小伙伴应该知道,finalize是Object的一个protected方法,意思就是子类都可以调用!但是在Java世界里,任何对象都是Object的子类,所以我们在执行finalize时会不会所有对象都会被传送到另一个世界?

答案:肯定会的(有疑问是好事啊!这样我们就可以深如了解Java的设计啊~~~~~~~yeah,为你的脑洞点个赞)

那么我们该怎么清除呢!学过C++的小伙伴应该知道,在清除对象时直接调用“破坏器”(引自think in Java的定义)直接将所有的对象清除,但是啊,Java的立场和它不同,不能完全用暴力解决问题。所以,finalize应尽量避免直接调用(不是不能用啊!有时需要强行清除还是需要的)。此时,Java规定:所有对象创建必须由new来创建。同时,Java确立了自己的回收模式:System.gc(),再调用 System.runFinalization()。这样方可清除没有清理的对象。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值