热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java没有close的对象会被gc清理么?

java没有close的对象会被gc清理么?我看Apache的一些开源框架,自动close的对象都是在finalize中close的,但是要执行finalize必须gc决定要清理这个对象啊,没有clo
java没有close的对象会被gc清理么?我看Apache的一些开源框架,自动close的对象都是在finalize中close的,但是要执行finalize必须gc决定要清理这个对象啊,没有close的对象在失去引用的情况下也会被gc么?????????

28 个解决方案

#1


java有自动内存回收机制,不close是会被回收的,但是代码不是良好的代码。

#2


引用 1 楼 fangmingshijie 的回复:
java有自动内存回收机制,不close是会被回收的,但是代码不是良好的代码。
正解呀

#3


Garbage collection will only free the resources within the JVM. 
The resources assigned to the VM by the operating system will still be reserved. 
I've seen several poorly written applications run out of resources due to poorly handled database connections, sockets and files. 

Rule of thumb: 
if it has a close() method, invoke it when you are done with it. 
And invoke it in a finally block so it will be called even if an exception occurs.

大体上翻译一下:

垃圾回收机制仅在Java虚拟机所控制的范围内释放资源。
对于类似于数据库连接、socket以及文件操作等,
如果有close方法,在你完成任务后执行它
并且最好在finally块内做close,因为即使发生了例外,这些代码也能被调用。

#4


虽然Java有自动内存回收机制,但是如果是数据库连接、网络连接、文件操作等,不close是不会被回收的,属于不正确的代码。
也就是说,有close方法,必须得自己调用一下才行。

对于使用完了的对象来讲,Java不推荐使用类似于C++的析构函数来释放内存(C++中new完后得delete,Java中new完,使用后,将其置成null比较好),因为GC会调节最适当的时间来释放内存,在程序中滥用delete会降低Java程序的性能(但应该不会引发额外的错误)。

#5


引用 3 楼 Android_iPhone 的回复:
Garbage collection will only free the resources within the JVM. 
The resources assigned to the VM by the operating system will still be reserved. 
I've seen several poorly written applications run out of resources due to poorly handled database connections, sockets and files. 

Rule of thumb: 
if it has a close() method, invoke it when you are done with it. 
And invoke it in a finally block so it will be called even if an exception occurs.

大体上翻译一下:

垃圾回收机制仅在Java虚拟机所控制的范围内释放资源。
对于类似于数据库连接、socket以及文件操作等,
如果有close方法,在你完成任务后执行它
并且最好在finally块内做close,因为即使发生了例外,这些代码也能被调用。

#6


翻译的不错。挺好

#7


一般能自己关的就自己关,gc回收的不确定性太高了[虽然它会回收,但是什么时间回收不一定]

#8


最好自己清理

#9


一般这相当于一张安全网,如果你忘记了close也可以在GC的时候释放资源,但是太依赖这个就表明程序写的有问题了,该释放资源的地方没有释放!

#10


I/O操作必须要手动close(),否则IO对象会任务还在使用,不会被GC回收。
确保某个对象不被引用、使用,GC就会自动回收,释放内存

#11


调用java中System.gc()方法确实是调用垃圾回收器的 但垃圾回收器是jvm的一个线程 既然它是一个线程你就应该明白 它什么时候执行不取决于这行语句的调用还取决于cpu是否执行这方法里的语句就算执行了cpu也可能会在执行的过程中执行其它的线程 

#12


引用 4 楼 Android_iPhone 的回复:
虽然Java有自动内存回收机制,但是如果是数据库连接、网络连接、文件操作等,不close是不会被回收的,属于不正确的代码。
也就是说,有close方法,必须得自己调用一下才行。

对于使用完了的对象来讲,Java不推荐使用类似于C++的析构函数来释放内存(C++中new完后得delete,Java中new完,使用后,将其置成null比较好),因为GC会调节最适当的时间来释放内存,在程序中滥用delete会降低Java程序的性能(但应该不会引发额外的错误)。

#13



引用 3 楼 Android_iPhone 的回复:
Garbage collection will only free the resources within the JVM. 
The resources assigned to the VM by the operating system will still be reserved. 
I've seen several poorly written applications run out of resources due to poorly handled database connections, sockets and files. 

Rule of thumb: 
if it has a close() method, invoke it when you are done with it. 
And invoke it in a finally block so it will be called even if an exception occurs.

大体上翻译一下:

垃圾回收机制仅在Java虚拟机所控制的范围内释放资源。
对于类似于数据库连接、socket以及文件操作等,
如果有close方法,在你完成任务后执行它
并且最好在finally块内做close,因为即使发生了例外,这些代码也能被调用。

阿帕奇的开源框架里close都是在finalize中的,这不就已经默认了即使没有close,gc让然会清理?

#14


在java中存在垃圾回收机制即对于一般的对象在使用完成后会自动卸载回收,但是对数据库连接、Socket、文件读写都要求使用close操作

#15


引用 13 楼 wozuiqiangdeaoyi 的回复:
Quote: 引用 3 楼 Android_iPhone 的回复:

Garbage collection will only free the resources within the JVM. 
The resources assigned to the VM by the operating system will still be reserved. 
I've seen several poorly written applications run out of resources due to poorly handled database connections, sockets and files. 

Rule of thumb: 
if it has a close() method, invoke it when you are done with it. 
And invoke it in a finally block so it will be called even if an exception occurs.

大体上翻译一下:

垃圾回收机制仅在Java虚拟机所控制的范围内释放资源。
对于类似于数据库连接、socket以及文件操作等,
如果有close方法,在你完成任务后执行它
并且最好在finally块内做close,因为即使发生了例外,这些代码也能被调用。

阿帕奇的开源框架里close都是在finalize中的,这不就已经默认了即使没有close,gc让然会清理?


finalize不是每次都必须执行的吗?
这不就默认了,gc不会自动清理吗!

#16


对象用完了就释放掉啊。。留着不关干嘛。。我做过一个小Demo。就是开多个Java.sql.Connection连接。然后给我抛了个异常。。

#17


自从给我抛那异常之后。我就开始重视close()方法了。。

#18


最好要close  不然会产生多余的垃圾 ,像网络连接、文件操作  数据库连接等,不close是不会被回收的   刚刚开始学习 要养成良好的编程习惯

#19


自己定义调用close方法

#20


引用 15 楼 Android_iPhone 的回复:
Quote: 引用 13 楼 wozuiqiangdeaoyi 的回复:


Quote: 引用 3 楼 Android_iPhone 的回复:

Garbage collection will only free the resources within the JVM. 
The resources assigned to the VM by the operating system will still be reserved. 
I've seen several poorly written applications run out of resources due to poorly handled database connections, sockets and files. 

Rule of thumb: 
if it has a close() method, invoke it when you are done with it. 
And invoke it in a finally block so it will be called even if an exception occurs.

大体上翻译一下:

垃圾回收机制仅在Java虚拟机所控制的范围内释放资源。
对于类似于数据库连接、socket以及文件操作等,
如果有close方法,在你完成任务后执行它
并且最好在finally块内做close,因为即使发生了例外,这些代码也能被调用。

阿帕奇的开源框架里close都是在finalize中的,这不就已经默认了即使没有close,gc让然会清理?


finalize不是每次都必须执行的吗?
这不就默认了,gc不会自动清理吗!

官方文档上finalize并不是每次都执行的,执不执行看缘分

#21


没有close的对象,如果超出作用域也会被gc的

#22


小白学习了

#23


也会自动清理,但是时间不定,不是手动关闭的资源,自动清理的时间应该相对要慢一些,建议手动关闭,提高效率和资源的利用率。

#24


会,不过建议手动清理,比如说可能你忘了清理以后又用到它了,但已经被系统给清掉了

#25


会,不过建议手动清理,比如说可能你忘了清理以后又用到它了,但已经被系统给清掉了。清理是不会分什么时候的。那么就会对代码产生不可估量的危险代价

#26


引用 24 楼 NoMasp 的回复:
会,不过建议手动清理,比如说可能你忘了清理以后又用到它了,但已经被系统给清掉了


会吗?数据库连接会自动关闭吗?文件句柄能自动回收吗?.net里的disposable pattern是干啥的?

GC只清理掉heap上的对象的内存占用,而对象内部可能存在的非托管资源则需要手动清理。

可怕的不是引用了invalid reference,大不了crash。可怕的是木有清理资源导致的resource leak。版主大人!

#27


引用 26 楼 micropentium6 的回复:
Quote: 引用 24 楼 NoMasp 的回复:

会,不过建议手动清理,比如说可能你忘了清理以后又用到它了,但已经被系统给清掉了


会吗?数据库连接会自动关闭吗?文件句柄能自动回收吗?.net里的disposable pattern是干啥的?

GC只清理掉heap上的对象的内存占用,而对象内部可能存在的非托管资源则需要手动清理。

可怕的不是引用了invalid reference,大不了crash。可怕的是木有清理资源导致的resource leak。版主大人!


泄露是可怕啦,我是想起来再openCV中书上特意强调了要手动销毁而已……

#28


java的垃圾回收机制没办法,就像客人太多了,你不能直接赶客人走,只能催一催,然后等那些吃了好久不点菜的客人到时间离开

推荐阅读
  • 深入解析 Lifecycle 的实现原理
    本文将详细介绍 Android Jetpack 中 Lifecycle 组件的实现原理,帮助开发者更好地理解和使用 Lifecycle,避免常见的内存泄漏问题。 ... [详细]
  • 一个建表一个执行crud操作建表代码importandroid.content.Context;importandroid.database.sqlite.SQLiteDat ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 本文介绍了Java编程语言的基础知识,包括其历史背景、主要特性以及如何安装和配置JDK。此外,还详细讲解了如何编写和运行第一个Java程序,并简要介绍了Eclipse集成开发环境的安装和使用。 ... [详细]
  • malloc 是 C 语言中的一个标准库函数,全称为 memory allocation,即动态内存分配。它用于在程序运行时申请一块指定大小的连续内存区域,并返回该区域的起始地址。当无法预先确定内存的具体位置时,可以通过 malloc 动态分配内存。 ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • 包含phppdoerrorcode的词条 ... [详细]
  • Spring Data JdbcTemplate 入门指南
    本文将介绍如何使用 Spring JdbcTemplate 进行数据库操作,包括查询和插入数据。我们将通过一个学生表的示例来演示具体步骤。 ... [详细]
  • 如果应用程序经常播放密集、急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了。因为MediaPlayer存在如下缺点:1)延时时间较长,且资源占用率高 ... [详细]
  • DAO(Data Access Object)模式是一种用于抽象和封装所有对数据库或其他持久化机制访问的方法,它通过提供一个统一的接口来隐藏底层数据访问的复杂性。 ... [详细]
  • 本文介绍了在 Java 编程中遇到的一个常见错误:对象无法转换为 long 类型,并提供了详细的解决方案。 ... [详细]
  • 零拷贝技术是提高I/O性能的重要手段,常用于Java NIO、Netty、Kafka等框架中。本文将详细解析零拷贝技术的原理及其应用。 ... [详细]
  • 大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式
    大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式 ... [详细]
  • 本文是Java并发编程系列的开篇之作,将详细解析Java 1.5及以上版本中提供的并发工具。文章假设读者已经具备同步和易失性关键字的基本知识,重点介绍信号量机制的内部工作原理及其在实际开发中的应用。 ... [详细]
  • 浏览器作为我们日常不可或缺的软件工具,其背后的运作机制却鲜为人知。本文将深入探讨浏览器内核及其版本的演变历程,帮助读者更好地理解这一关键技术组件,揭示其内部运作的奥秘。 ... [详细]
author-avatar
爱在逃离
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有