Java学习笔记-对象与垃圾回收

Java存在垃圾回收机制,JVM会去回收垃圾,释放资源,而不是像C++一样有程序员去完成

垃圾回收机制的特点

  • 垃圾回收机制只负责回收堆内存中的对象,不会回收任何物理资源(例如数据库连接、网络IO等资源)
  • 程序无法精确控制垃圾回收的运行,垃圾回收会在合适的时候进行
  • 在垃圾回收机制回收任何对象之前,总会先调用它的finalize()方法,该方法可能使该对象重新复活(让一个引用变量重新引用该对象),从而导致垃圾回收机制取消回收

对象在内存中的状态

  • 根据引用变量所引用的状态,可分为以下三种:
    • 可达状态
    • 可恢复状态
    • 不可达状态
      对象在内存中的状态

强制垃圾回收

  • 程序只能控制一个对象何时不再被任何引用变量引用,绝不能控制它何时被回收
  • 强制回收只是通知系统进行垃圾回收,而系统是否回收确不确定,但垃圾回收机制会在收到通知后尽快进行垃圾回收
  • 强制回收有两种方式:
    • 调用System类的gc()静态方法:System.gc()
    • 掉用Runtime对象的gc实例方法:Runtime.getRuntime().gc()

finalize方法

  • 默认的清理对象的资源机制
  • 定义在Object中,其原型为protected void finalize() throws Throwable
  • 在finalize()方法返回后,对象消失,垃圾回收机制开始执行,任何类型的异常都被抛出
  • finalize()方法的4个特点:
    • 永远不要主动调用某个对象的finalize()方法,该方法应交由垃圾回收机制调用
    • finalize()方法何时被调用,是否被调用具有不确定性,不要把finalize()当成一定会执行的方法
    • 当JVM执行可恢复对象的finalize()方法时,可能使该对象或系统中的其他对象重新变成可达状态
    • 当JVM执行finalize()方法时出现异常,垃圾回收机制不会报告异常,程序继续执行

对象的软、弱和虚引用

  • java.lang.ref提供了3个类:SoftReference(软引用)、PhantomReference(虚引用)、WeakReference(弱引用)。以上三个引用都具有get()方法,用于获取被他们所引用的对象
    • 强引用(StrongReference):Java最常见的引用方式。对象被强引用处于可达状态
    • 软引用(SoftReference):对象处于软引用,可能会在内存不够用时被回收
    • 弱引用(WeakReference):垃圾回收机制一运行就会被回收
    • 虚引用(PhantomReference):虚引用完全类似于没有引用,主要用于跟踪对象被垃圾回收的状态,不能单独使用,必须和引用队列联合使用

修饰符的适用范围

  外部类/接口 成员属性 方法 构造器 初始化块 成员内部类 局部成员
public    
protected      
包访问控制符 o o
private      
abstract        
final    
static      
strictfp        
synchronized            
native            
transient            
volatile            
default            

注:strictfp即FP-strict,精确浮点型。native主要用于修饰方法,类似于抽象方法,用C语言实现

原文地址:https://www.cnblogs.com/cj5785/p/10664844.html