关于JAVA析构函数不存在的原因
不知道大家有没有JAVA设计者不给JAVA提供析构函数的原因。
我想问的问题有这些:
首先,如果在方法栈里面生成一个临时对象的话,在返回的时候编译器会不会对栈内 部的对象调用它的析构函数,如果不调用的话是否会造成
积压其次,为何不提供析构函数,首先程序员可以选择主动的释放空间,而垃圾回收只需要清理掉程序员遗忘的那部分,这样垃圾回收要清理的对象就会减少,效率自然提高。
谢谢~~~~
追问:你把java的垃圾回收机制的优点作为了c++析构函数的缺点说了一遍,还有定时检查的怎么可能是堆内存呢?要想知道堆对象中的对象是否有价值,是看它在栈中是否有它的引用,或者堆内部是否有它的引用,所以检查的开始一定是从栈内存开始.还有你说多一次的析构,其实就更不用担心了,在C++里面析构是由系统调用的而不是由程序本身调用。。还有下面问题的补充其实你并没有理解我所谓的积压是什么意思;你的对象是不占内存,但是你在堆中的那一部分依旧存在
其实我并不反对你的第一个观点,但是实际上你想想看,系统调用一次垃圾清理的消耗有多大,而我们只要把我们忘记析构的东西交给回收器,而在一些必要的东西上我们自己实现析构这样不是很好么,因为这样可以让系统占满空间的时间延后,也就是推迟或者减少系统调用垃圾清理的。。。
答案:java的垃圾回收机制是根据不同的虚拟机构造有不同的调用方式,如有的可能是每隔一定时间检查一次堆存储,进行清理;也可能是在发现空间不足的时候进行清理。要想看到这种机制的好处首先请想一想C++中析构函数的缺点。在我看来似乎它一无是处,为什么呢,1,程序本来就是要节省人力脑力的,但这里,你造了一个对象还要时刻注意着它是否应该结束任务被回收,一个软件开发出来动辄就是上千个对象实例而且跟据程序的无序性和不可预测性,你想要将所有的对象都在适当时候回收那是绝对做不到的。2,再来看看万一你不小心多析构了一次会出现什么,本来已经消失在内存的名字你再次清理了一次,轻则把不该清的清理了,重则程序立刻崩溃。所以在java面前,人不再关心什么时候对象会消失,也不再关心何时对象对回收了。在程序的控制下,宁可不回收也不会多回收一次垃圾。这就是人省事儿了,机器费事了。我们想要的当然是人省点力气了。。。说的有点哆嗦了。
Java有垃圾回收机制,会自动执行。
而且java提供了finalize()方法。
首先,对于类自身来说,JAVA中finalize与C++中的析构函数在功能上是一样的,都是在类的实例被释放前调用其来完成对实例自身的解构,例如对自身持有资源的释放等操作。而对于调用者来说,JAVA中的finalize是GC在回收类实例资源时调用的,由于GC是独立于代码序列之外的,所以finalize的调用时间也是不确定的,而C++中的析构函数是在代码编译阶段将其调用代码插入到代码序列的,所以其调用时间是可以预期的。
另外,关于GC的回收动作,一般会在内存不足时会自行进行回收动作以释放可用空间,所以当空间很紧张时,GC的回收动作也会频繁发生,系统的效率也会急剧下降。建议不再用的对象要将其对象变量设置为null,以使GC认识到该对象是可以被回收的,否则如果对象变量一直指向这些对象,则GC不会回收其,即会造成楼主所说的“积压”。
空间不足时会调用
也会定时的清理
其实LZ大致都明白了原因,但是太纠结必须验证它,GC本来就是非常复杂的东西,《thinking java》这么好的一本书,也不过稍稍讲了点,为什么一定要验证何时定时清理呢?
上一个:计算闰年、平年的JAVA计算代码
下一个:java 多个网站的配置tomcat