finalize与gc 详解
来源:互联网 发布:mac好用的翻译软件 编辑:程序博客网 时间:2024/04/29 06:24
finalize()和gc()
(1)问题:finalize()函数是干嘛的?Java不是有Garbage Collection(以下简称gc)来负责回收内存吗?
回答:
gc只能清除在堆上分配的内存(纯java语言的所有对象都在堆上使用new分配内存),而不能清除栈上分配的内存(当使用JNI技术时,可能会在栈上分配内存,例如java调用c程序,而该c程序使用malloc分配内存时).因此,如果某些对象被分配了栈上的内存区域,那gc就管不着了,对这样的对象进行内存回收就要靠finalize().
举个例子来说,当java 调用非java方法时(这种方法可能是c或是c++的),在非java代码内部也许调用了c的malloc()函数来分配内存,而且除非调用那个了free() 否则不会释放内存(因为free()是c的函数),这个时候要进行释放内存的工作,gc是不起作用的,因而需要在finalize()内部的一个固有方法调用它(free()).
finalize的工作原理应该是这样的:一旦垃圾收集器准备好释放对象占用的存储空间,它首先调用finalize(),而且只有在下一次垃圾收集过程中,才会真正回收对象的内存.所以如果使用finalize(),就可以在垃圾收集期间进行一些重要的清除或清扫工作.
(2)问题:finalize()在什么时候被调用?
回答:
有三种情况
1.所有对象被Garbage Collection时自动调用,比如运行System.gc()的时候.
2.程序退出时为每个对象调用一次finalize方法。
3.显式的调用finalize方法
除此以外,正常情况下,当某个对象被系统收集为无用信息的时候,finalize()将被自动调用,但是jvm不保证finalize()一定被调用,也就是说,finalize()的调用是不确定的,这也就是为什么sun不提倡使用finalize()的原因.
(1)问题:finalize()函数是干嘛的?Java不是有Garbage Collection(以下简称gc)来负责回收内存吗?
回答:
gc只能清除在堆上分配的内存(纯java语言的所有对象都在堆上使用new分配内存),而不能清除栈上分配的内存(当使用JNI技术时,可能会在栈上分配内存,例如java调用c程序,而该c程序使用malloc分配内存时).因此,如果某些对象被分配了栈上的内存区域,那gc就管不着了,对这样的对象进行内存回收就要靠finalize().
举个例子来说,当java 调用非java方法时(这种方法可能是c或是c++的),在非java代码内部也许调用了c的malloc()函数来分配内存,而且除非调用那个了free() 否则不会释放内存(因为free()是c的函数),这个时候要进行释放内存的工作,gc是不起作用的,因而需要在finalize()内部的一个固有方法调用它(free()).
finalize的工作原理应该是这样的:一旦垃圾收集器准备好释放对象占用的存储空间,它首先调用finalize(),而且只有在下一次垃圾收集过程中,才会真正回收对象的内存.所以如果使用finalize(),就可以在垃圾收集期间进行一些重要的清除或清扫工作.
(2)问题:finalize()在什么时候被调用?
回答:
有三种情况
1.所有对象被Garbage Collection时自动调用,比如运行System.gc()的时候.
2.程序退出时为每个对象调用一次finalize方法。
3.显式的调用finalize方法
除此以外,正常情况下,当某个对象被系统收集为无用信息的时候,finalize()将被自动调用,但是jvm不保证finalize()一定被调用,也就是说,finalize()的调用是不确定的,这也就是为什么sun不提倡使用finalize()的原因.
- finalize与gc 详解
- finalize与gc 详解
- GC与Finalize()
- finalize()与System.gc()
- Java中gc与finalize
- java中gc()与finalize()
- System.gc()与Object.finalize()的区别
- System.gc()与Object.finalize()的区别
- System.gc()与Object.finalize()的区别
- finalize()方法与system.gc()方法
- System.gc()与Object.finalize()的区别
- 关于system.gc()与finalize()方法
- Java的GC与finalize函数
- Java_System.gc()与Object.finalize()的区别
- 黑马程序员:finalize() 与System.gc() 垃圾回收
- java-深入理解java GC与 finalize()
- System.gc与finalize以及Thread对象何时被回收
- gc和finalize关系
- 招聘软件开发工程师---华为三康技术有限公司
- struts+spring+hibernate开发
- 自己总结的PHP知识
- 招聘微码开发工程师---华为三康技术有限公司
- 十分郁闷,被导师批了
- finalize与gc 详解
- C#之消息队列之自学笔记
- 很丢脸的一天[By tina]
- 项目感想(一)[by tina]
- 婚姻生活
- 用CashFilter实现页面级缓存实践[ OSCache使用]
- 招聘软件测试工程师---华为三康技术有限公司
- 打算写个类Windows界面的网站后台开发教程
- OPAL学习笔记 - Incoming Call