因为刚从.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,或者是不做任何操作,只会将对象相关的堆内存由垃圾回收器回收掉,物理资源仍然存在,直到程序退出。

java 主动释放_java的手动释放资源相关推荐

  1. java 主动释放_java如何进行内存自动释放,垃圾回收的?

    垃圾收集的目的在于清除不再使用的对象.gc通过确定对象是否被活动对象引用来确定是否收集该对象.gc首先要判断该对象是否是时候可以收集.两种常用的方法是引用计数和对象引用遍历. 引用计数 每个对象都含有 ...

  2. java线程释放_Java多线程出现异常会自动释放锁

    Java多线程出现异常会自动释放锁 package com.wkcto.intrinsiclock; /** * 同步过程中线程出现异常, 会自动释放锁对象 * * Author: 老崔 */ pub ...

  3. java 线程释放_如何手动释放一个java线程占用的资源

    我做一个聊天软件我双击一个好友头像时执行一个线程弹出一个窗口线程里run方法是用来接收信息的,但是当我把当前窗口关掉想再一次打开时,却提示端口被占用我找到了地方是上一个窗口弹... 我做一个聊天软件 ...

  4. java 事务提交_JAVA设置手动提交事务,回滚事务,提交事务的操作

    我就废话不多说啦,还是直接看代码吧! /** * 设置数据库是否自动提交事务 * @param flag * @throws SQLException */ public void setAutoCo ...

  5. java 数据库连接 释放_java - 数据库连接池耗尽 - Java - 堆栈内存溢出

    timeout变量似乎不对应于连接空闲的时间,而是对应于池等待返回新连接或抛出异常的时间(我看了一下这个源代码 ,不知道是不是已是最新). 我认为跟踪"空闲"连接是相当困难的,因为 ...

  6. java wait 释放_Java:wait()从同步块释放锁

    "在同步方法内调用等待是获取内在锁的简单方法" 这句话是假的,它是文档中的错误. 当线程进入同步方法时,它会获取固有锁. 同步方法中的线程被设置为锁的所有者并且处于RUNNABLE ...

  7. java 线程 释放_java线程似乎不会被释放

    我没有回答为什么第四个连接挂起,除了说这里是一个有效的代码版本- public class Test { public static void main(String[] args) throws E ...

  8. java在退出前释放资源,【java】手动释放资源问题

    前言: java语言中因为有垃圾回收机制,所以大大解放了程序员的工做量,再也不须要担忧本身忘记释放不用的内存而致使内存泄露这样尴尬的事情了,当咱们高呼gc万岁的时候,仍是会发如今不少场景须要咱们作一些 ...

  9. java wait 释放锁_JAVA锁之wait,notify(wait会释放锁,notify仅仅只是通知,不释放锁)...

    wait是指在一个已经进入了同步锁的线程内,让自己暂时让出同步锁,以便其他正在等待此锁的线程可以得到同步锁并运行,只有其他线程调用了notify方法(notify并不释放锁,只是告诉调用过wait方法 ...

  10. java 并发 面试_Java 并发基础常见面试题总结

    1. 什么是线程和进程? 1.1. 何为进程? 进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的.系统运行一个程序即是一个进程从创建,运行到消亡的过程. 在 Java 中,当我们启 ...

最新文章

  1. Python 面向对象(二)类的继承
  2. ***检测与网络审计产品是孪生兄弟吗?
  3. html不支持元素video,Html5中的Video元素使用方法
  4. 对于java中接口的作用与理解
  5. C# 缓存学习第一天
  6. 60、弱电网络管理入门与基础技术
  7. java Graphics2D 获取当前系统实际支持特殊字符和中文的字体
  8. ICO 图标快速制作
  9. 企业微信SDK接口API调用-通过手机号或微信好友添加客户
  10. Spring中实现HTTP缓存
  11. IE主页被篡改了怎么办
  12. 严重: Servlet [login_fali] in web application [/StudyforJSP] threw load() exception javax.servl
  13. 带外通道技术(OOB)总结
  14. Python基础篇学习
  15. IE6、IE7、IE8之IE多版本共存的几种方法
  16. win7打开计算机一片空白,win7系统“打开或关闭windows功能”显示一片空白如何解决...
  17. 读《中台架构与实现:基于DDD和微服务》有感
  18. 控制工程基础应掌握的重要知识点
  19. 高通LCD 开机logo制作
  20. lodash-assign

热门文章

  1. 2021年焊工(初级)报名考试及焊工(初级)新版试题
  2. 计算机基础教案8,计算机应用基础教案8.2修饰演示文稿
  3. 德州大学达拉斯分校计算机专业博士,德克萨斯大学达拉斯分校计算机科学理科硕士入学条件及实习就业...
  4. python 爬取淘宝第二弹(淘宝数据爬取)
  5. 芝加哥打字机_芝加哥打字机不是打字机
  6. javascript中的交互效果
  7. Android Retrofit的学习
  8. flappy bird java源码_Java实现Flappy Bird游戏源码
  9. 详解Mysql执行计划explain
  10. 我的世界服务器mcyc.win怎么验证,RTX 2060 光线追踪效果逆天,让《我的世界》变仙境!华硕天选游戏笔记本体验教程...