Java面试十问之三:Java与C++内存回收机制的差别

大家知道, Java 除了那 8 种基本类型以外,其他都是对象类型(又称为引用类型)的数据。 JVM 会把程序创建的对象存放在堆空间中,那什么又是堆空间呢?其实,堆( Heap)是一个运行时的数据存储区,从它可以分配大小各异的空间。一般,运行时的数据存储区有堆( Heap)和堆栈( Stack),所以要先看它们里面可以分配哪些类型的对象实体,然后才知道如何均衡使用这两种存储区。一般来说,栈中存放的是非 static 的自动变量、函数参数、表达式的临时结果和函数返回值(如果他们没有被放到寄存器中)。栈中的这些实体数据的分配和释放均是由系统自动完成的,堆中存放的实体数据都是程序中显式分配的,没有自动垃圾回收机制的系统中必须由程序代码显式地释放这些实体。堆的管理,不同的语言实现是不同的。如 C 语言就没有把堆的分配和释放做到语言的层次,它对堆空间对象的操作是通过其库函数 malloc()和 free()来实现的;而 C++直接把对堆空间中的对象的分配和释放做到语言层次了。使用 new 和 delete 语句, Java 就做得更彻底,应用开发者只要在需要用堆分配的时候创建就行了,何时释放如何释放,都有 Java 虚机( JVM)来做,而不需要程序代码来显式地释放。

注;大多数 JVM都实现了自动垃圾回收机制,只是它们各自的实现算法不同。

 

JVM 有着各种版本的实现,它们基本上都会有垃圾回收的机制,也就是堆内存的管理的自动进行。那么,又该如何知道对象已经被回收了呢? Java 中根父类 java.lang.Object 中有个 finalize()方法,它会在垃圾回收器认为这个对象是垃圾的之后,真正回收之前被调用。因为所有的类都继承自 Object,所以它们都会有 finalize()方法。程序员可以在这个方法中写一些需要在对象被回收前做的事情,例如关闭数据库连接


finalize()方法原型如下:

protected void finalize() throws Throwable
一般在调用这个方法之前,垃圾回收器能检测出不再被引用的对象,如果这些对象
盖了 finalize()方法,就要调用该方法。

你可能感兴趣的:(java,C++,finalize(),堆栈,内存回收)