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++等需要显示释放内存的语言,是一中巨大的改进。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中使用SQL Server数据库时,有时候会出现"java.sql.SQLException:Delete语句与参照约束冲突"的错误。这个错误通常是由于尝试从一张具有参照约束的表中删除一个记录,而该记录正在被其他表所引用引起的。 参照约束是关系数据库中常用的一种约束,用于保证数据的完整性。它会限制在某个表中外键列的值只能引用另一个表中的主键列的值。这样做可以保证数据的一致性,防止无意或恶意的错误操作,但也可能会导致删除记录时出现问题。 例如,假设我们有一个订单表和一个订单详细信息表。订单详细信息表的外键引用订单表的主键,以确保每个订单的详细信息都与订单本身关联。如果我们现在尝试从订单表中删除一个订单记录,但是该订单记录存在于订单详细信息表中,删除操作就会失败并出现上述错误。 为了解决这个问题,我们可以使用SQL Server中的“ON DELETE CASCADE”选项来删除参照约束。这个选项会自动删除与主键相关的外键记录。这样一来,我们可以安全地删除订单表中的订单记录,同时也可以删除相关的订单详细信息。 总的来说,当我们在Java应用程序中使用SQL Server数据库并处理删除操作时,要注意参照约束可能会导致的问题。要么手动删除所有涉及到的外键记录,要么使用ON DELETE CASCADE选项。这样才能保证数据的完整性和一致性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值