Java程序为什么无须delete语句进行内存回收?

 垃圾回收机制Java相对于C++的一种巨大改进,它避免了因为程序员忘记释放内存而造成内存溢出的错误。所以在Java程序中,根本不需要使用delete语句,JVM会自动的去检查哪些内存应该回收了,在后台就自动回收了,为程序员省了不少的事情。

   大家知道,Java除了那8种基本类型以外,其他都是对象类型(又称为引用类型)的数据。JVM会把程序创建的对象存放在堆空间中,那什么是堆空间呢?其实,堆(Heap)是一个运行时的数据存储区,从它可以分配大小各异的空间。一般,运行时的数据存储区有堆(Heap)和堆栈(Stack),所以要先看它们里面可以分配哪些类型的对象实体,然后才知道如何均衡使用这俩种存储区。一般来说,桟中存放的是非static的自动变量,函数参数,表达式的临时结果和函数返回值(如果他们没有被放到寄存器中)。桟中的这些实体数据的分配和释放均是由系统自动完成的,堆中存放的实体数据都是程序中显式分配的,没有自动垃圾回收机制的系统中必须由程序代码显示的释放这些实体。

     堆的管理,不同的语言实现是不同的。如c语言就没有把堆的分配和释放做到语言的层次,它对堆空间对象的操作是通过其库函数malloc()和free()来实现的;而C++直接把堆堆空间的对象的分配和释放做到语言层次了。使用newdelete语句,Java就做的更彻底了,应用开发者只需要用堆分配的时候创建就行了,何时释放如何释放,都有Java虚拟机(JVM)来做,而不需要程序代码来显式的释放。

   说明:Java虚拟机规范并没有强制规定要实现自动回收垃圾功能功能,但目前大多数JVM都实现了自动垃圾回收机制,只是它们各自的实现的算法不同。

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

finalize方法原型如下:

protected void finalize() throws Throwable

一般在调用这个方法执行啊,垃圾回收器能检测出不在被引用的对象,如果这些对象覆盖了finalize方法,就要调用该方法。

    另外,在java.lang.System类中,有一个gc方法,它对JVM的垃圾回收也有一些影响,通过i型按时的调用它可以请求开始垃圾回收器线程,开始垃圾回收,但是垃圾回收线程是否立即开始还是由JVM的算法决定的。java.lang.Runtime类的gc方法与System的作用一样,只不过Runtime是一个单例模式的类,需要用getRuntime方法来获得它的实例,然后才能调用gc方法,代码如下所示:

System.gc();

Runtime.getRuntime().gc();

  注意:垃圾回收线程是一个优先级很低的线程。

可以这样回答:

Java的堆内存数据的释放功能是由垃圾回收器自动进行的,无需程序员显式的调用delete方法。该机制有效的避免了因为程序员忘记释放内存而造成内存溢出的错误,相对于C++等需要显示释放内存的语言,是一中巨大的改进。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值