你的位置:首页 > 软件开发 > Java > Java 垃圾回收

Java 垃圾回收

发布时间:2016-03-27 00:00:07
当程序创建对象、数组等引用类型的实体时,系统会在堆内存中为这一对象分配一块内存,对象就保存在这块内存中,当这块内存不再被任何引用变量引用时,这块内存就变成垃圾,等待垃圾回收机制进行回收。垃圾回收机制具有三个特征:垃圾回收机制只负责回收堆内存中的对象,不会回收任何物理资源(例如数据 ...

当程序创建对象、数组等引用类型的实体时,系统会在堆内存中为这一对象分配一块内存,对象就保存在这块内存中,当这块内存不再被任何引用变量引用时,这块内存就变成垃圾,等待垃圾回收机制进行回收。垃圾回收机制具有三个特征:

  • 垃圾回收机制只负责回收堆内存中的对象,不会回收任何物理资源(例如数据库连接,打开的文件资源等),也不会回收以某种创建对象的方式以外的方式为该对像分配的内存,(例如对象调用本地方法中malloc的方式申请的内存)
  • 程序无法精确控制垃圾回收的运行,只可以建议垃圾回收进行,建议的方式有两种System.gc() 和Runtime.getRuntime().gc()
  • 在垃圾回收任何对象之前,总会先调用它的finalize()方法,但是同垃圾回收的时机一致,调用finalize()方法的时机也不确定。

针对以上三个特征,有三个问题:

1、必须手动的进行清理工作,释放除创建对象的方式以外的方式分配的内存和其它的物理资源。并且要注意消除过期的对象引用,否则可能引起OOM。

手动清理通常用到try...finally...这样的代码结构。

示例如下:

import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;public class ManualClear {  public static void main(String[] args) {    FileInputStream fileInputStream = null;    try {      fileInputStream = new FileInputStream("./src/ManualClear.java");    } catch (FileNotFoundException e) {      System.out.println(e.getMessage());      e.printStackTrace();      return;    }    try {      byte[] bbuf = new byte[1024];      int hasRead = 0;      try {        while ((hasRead = fileInputStream.read(bbuf)) > 0) {          System.out.println(new String(bbuf, 0, hasRead));        }      } catch (IOException e) {        e.printStackTrace();      }    } finally {      try {        fileInputStream.close();      } catch (IOException e) {        e.printStackTrace();      }    }  }}

原标题:Java 垃圾回收

关键词:JAVA

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。