zoukankan      html  css  js  c++  java
  • 《疯狂Java讲义》(十七)---- 对象与垃圾回收

    • 对象在内存中的状态
    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. 软引用:
  • 相关阅读:
    mysql 函数 存储过程 事件(event) job 模板
    protobuf 无proto 解码 decode 语言 java python
    mitmproxy fiddler 抓包 填坑
    android adb 常用命令
    android机器人 模拟 踩坑过程
    RabbitMQ添加新用户并支持远程访问
    Windows下RabbitMQ安装及配置
    Java mybatis mysql 常用数据类型对应关系
    easyExcel 踩坑
    linux防火墙查看状态firewall、iptable
  • 原文地址:https://www.cnblogs.com/IvySue/p/6344145.html
Copyright © 2011-2022 走看看