博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《疯狂Java讲义》(十七)---- 对象与垃圾回收
阅读量:5072 次
发布时间:2019-06-12

本文共 1684 字,大约阅读时间需要 5 分钟。

  • 对象在内存中的状态
  1. 可达状态,有一个以上的引用变量引用这个对象时,就说明该对象在可达状态,程序可以通过引用变量调用该对象的field和方法。
  2. 可恢复状态,所有引用变量都与这个对象断开联系,就进入可恢复状态。这可恢复状态下,系统地垃圾回收机制准备回收该对象,但回收之前,系统会调用该对象的finalize()方法进行资源清理。如果在finalize()方法中,重新让一个引用变量引用该对象,则这个对象会再次变成可达状态,否则就进入不可达状态。
  3. 不可达状态:这个对象永久性失去引用,系统会真的回收该对象所占的资源。

  一个对象可以被一个方法的局部变量引用,也可以被其他类的类变量引用,或被其他对象的实例变量引用。如果被其他类的类变量引用时,只有该类被销毁后,该对象才会进入可恢复状态,当某个对象被其他对象的实例变量引用时,只有当该对象被销毁后,该对象才会进入可恢复状态。

 

  • 强制垃圾回收

  程序只能控制一个对象何时不再被任何引用变量引用,绝不能控制它何时被回收。程序无法精确控制Java垃圾回收的时机,但我们依然可以强制系统进行垃圾回收 ---- 不过只是通知系统进行垃圾回收,系统到底回不回收还不确定。

  强制垃圾回收的方法:

  1.  调用System类的gc静态方法:System.gc();
  2.    调用Runtime类的gc实例方法:Runtime.getRuntime().gc()

  java -verbose:gc GcTest 命令: 运行Java命令时指定-verbose:gc选项,可以看到每次垃圾回收后的提示信息。

 

  • finalize方法

  垃圾回收机制开始之前才会调用finalize方法,finalize方法返回后,对象消失,垃圾回收机制真正开始。不过垃圾回收机制何时调用finalize()方法是完全透明的,只有当内存不够时,垃圾回收机制才会进行垃圾回收。

  特点:

  1. 永远不要主动调用某个对象的finalize(), 该方法应该交给垃圾回收机制调用
  2. finalize()何时被调用不确定,不要把finalize()方法当成一定会执行的方法。
  3. 当JVM执行可恢复对象的finalize()时,可能使该对象或其他对象重新变回可达状态。
  4. 当JVM执行finalize方法出现异常时,垃圾回收机制不会报告异常,程序继续执行。
public class FinalizeTest {    private static FinalizeTest ft = null;    public void info() {        System.out.println("testing finalize()");    }    public static void main(String[] args) throws Exception {        new FinalizeTest();        System.gc();        Thread.sleep(2000);     // Thread.sleep 只是在等待系统调用finalize(),如果直接用runFinalization(), 就不用等待了     // Runtime.getRuntime().runFinalization()     // System.runFinalization()         ft.info();    }        public void finalize() {        ft = this;    }}

main方法中创建了一个Finalize类的匿名对象,因为创建后没有任何引用指向它,所以它立即进入可恢复状态,系统调用gc通知进行垃圾回收,2s后,ft对象可以直接调用info方法。

 

  • 对象的软/弱/虚引用
  1. 强引用:程序创建一个对象,并把这个对象赋给一个引用变量,程序通过该引用变量来操作实际的对象。
  2. 软引用:

转载于:https://www.cnblogs.com/IvySue/p/6344145.html

你可能感兴趣的文章
cer证书签名验证
查看>>
新手Python第一天(接触)
查看>>
【bzoj1029】[JSOI2007]建筑抢修
查看>>
synchronized
查看>>
codevs 1080 线段树练习
查看>>
[No0000195]NoSQL还是SQL?这一篇讲清楚
查看>>
【深度学习】caffe 中的一些参数介绍
查看>>
Python-Web框架的本质
查看>>
QML学习笔记之一
查看>>
Window 的引导过程
查看>>
App右上角数字
查看>>
从.NET中委托写法的演变谈开去(上):委托与匿名方法
查看>>
小算法
查看>>
201521123024 《java程序设计》 第12周学习总结
查看>>
新作《ASP.NET MVC 5框架揭秘》正式出版
查看>>
IdentityServer4-用EF配置Client(一)
查看>>
WPF中实现多选ComboBox控件
查看>>
读构建之法第四章第十七章有感
查看>>
Windows Phone开发(4):框架和页 转:http://blog.csdn.net/tcjiaan/article/details/7263146
查看>>
Unity3D研究院之打开Activity与调用JAVA代码传递参数(十八)【转】
查看>>