java的手动释放资源
因为刚从.net转到java,所以首先了解一下java的垃圾回收机制,java的close跟.NET的dispose是一样一样的。.NET存在托管资源和非托管资源之分,java也是同样,只不过java没有这两个名词。托管的资源不需要开发者理会,垃圾回收器会自动回收,而非托管资源则需要开发者手动回收。
为什么呢,因为有些资源如数据库连接,io等等不仅仅包含对象所占内存,还包含一些物理资源(具体什么叫物理资源,还请知道的人以io为例介绍一下,鄙人不才对这些底层的东西不了解),而物理资源的释放是虚拟机无能为力的。手动调用close就是为了释放这些物理资源,而不是释放这个对象所占的内存。以下面代码为例,调用reader的close会把物理资源释放掉而与对象所占内存并无直接关系,可能有些非托管资源的close方法中恰好将对象置为了null。
FileReader reader=new FileReader("E:\\1.txt");
reader.read();
reader.close();
if(null==reader){
System.out.println("kong");
}else{
System.out.println("fei kong");//输出结果是:fei kong
}
也就是说,需要手动释放的资源分为两部分。堆内存和物理资源,堆内存还是由垃圾回收器负责回收,物理资源则需要手动释放。如果将reader手动置为null,或者是不做任何操作,只会将对象相关的堆内存由垃圾回收器回收掉,物理资源仍然存在,直到程序退出。
本人学识尚浅,欢迎交流。
倘若文章帮到了您,那真是好极了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?