java之finalization与GC
来源:互联网 发布:手机怎么搜淘宝店铺号 编辑:程序博客网 时间:2024/05/20 07:36
转载请注明出处
http://blog.csdn.net/pony_maggie/article/details/43925743
作者:小马
java 中的GC(garbage collection)并不像C++的析构函数一样每次对象被删除时调用,事实上它是一种JVM(JAVA 虚拟机)行为,JVM在它认为“合适”的情况下调用。这个所谓的合适情况,应用层其实不必考虑过多。可以认为GC调用的时机是随机的。
finaliztion是个可以被应用层重载的函数,当GC回收一个对象时,它会先调用对象的这个函数然后再处理其它事情。所以应用可以重载这个函数,去做一下想在GC前收尾的工作(听起来越来越像C++中的析构了,但是请注意调用时机)。
但是问题来了,GC本来就是内存回收了,应用还需要在finalization做什么呢? 答案是大部分时候,什么都不用做(也就是不需要重载)。只有在某些很特殊的情况下,比如你调用了一些native的方法(一般是C写的),可以要在finaliztion里去调用C的释放函数。
下面这个代码示例,重载了finaliztion,但是仅仅是为了观察GC的行为,类很简单,
class Chair{static boolean gcrun = false;static boolean f = false;static int created = 0;static int finalized = 0;int i;Chair() {i = ++created;if(created == 47){System.out.println("Created 47");}}public void finalize(){if(!gcrun){gcrun = true;System.out.println("beginning to finalize after " +created + " chairs have been created");}if(i == 47){System.out.println("finalizing chair #47, " +"setting flag to stop chair creation");f = true;}finalized++;if(finalized >= created){System.out.println("all " + finalized + " finalized");}}}
created和finalized用来跟踪分别创建和回收了多少对象,而对象的成员i可以理解为每个对象的号码,从代码上看,当号码为47的对象被回收时,把f置为true,这样main函数就不会创建新的Chair实例了,main函数如下:
public class Garbage {/** * @param args */public static void main(String[] args) {while(!Chair.f){new Chair();new String("to take up space");}System.out.println("after all chairs have been created:\n" +"total finalized = " + Chair.finalized);//optional arguments force garbage//collection & finalizationif(args.length > 0){if(args[0].equals("gc") ||args[0].equals("all")){System.out.println("gc():");System.gc();}if(args[0].equals("finalize") ||args[0].equals("all")){System.out.println("run finalization():");System.runFinalization();}}System.out.println("byte!");}}
注意并不是说,创建了第47个对象时就开始回收,原因还是上面讲的回收时机问题。所以当i==47时,可以已经创建了几千个chair对象了。
输出结果:
Created 47beginning to finalize after 4691 chairs have been createdfinalizing chair #47, setting flag to stop chair creationafter all chairs have been created:total finalized = 6151byte!
main函数中的System.runFinalization()和System.gc是做什么的呢? 我个人的理解,这两个函数分别是应用层向JVM发出一个信号,告诉JVM,希望你能尽快的回收内存和调用对象的finaliztion方法,但是只是一个请求,而JVM只保证会尽最大的努力执行,但是具体什么时候执行以及会不会执行都是未知的。
- java之finalization与GC
- Java虚拟机与GC
- java之GC笔记
- Java虚拟机之GC
- Java之GC
- java虚拟机之gc
- 【JAVA秒会技术之玩搞定GC】GC算法与种类
- Java GC专家之路-浅析GC
- java入门之GC的算法与种类(4)
- java虚拟机内存分配之新生代与老年代GC
- Java内存管理机制与GC
- JAVA GC 与 JVM调优
- Java内存模型与GC
- java内存布局与GC
- Java中gc与finalize
- java中gc()与finalize()
- Java内存模型与GC
- JAVA内存与GC总结
- CImage修改图片大小
- 0x00000116
- HDU 1083&&POJ 1469解题报告
- String to Integer (atoi)
- 【Linux是什么】 Linux的特色
- java之finalization与GC
- 一张白纸好作画—Canvas画布(3)
- POJ 3020(最小路径覆盖)解题报告
- HDU 1704解题报告
- map容器的应用:hdu 1004 Let the Balloon Rise
- 设置app图标绘制
- POJ 3660解题报告
- HDU 1150&&POJ 1325解题报告
- alter ignore table 添加unique key