01-GC垃圾回收器

Java 中有垃圾回收器回收无用对象占用的内存,这也真是Java可以屏蔽掉C语言中类似指针和内存分配malloc的两大头疼问题。作为语言榜首的Java自然有其垃圾回收的一套机制策略。

1. Java GC 垃圾回收器

Java GC(Garbage Collection,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者一般不需要专门编写内存回收和垃圾清理代码,对内存泄露和溢出的问题,也不需要像C程序员那样战战兢兢。
这是因为在Java虚拟机中,存在自动内存管理和垃圾清扫机制
概括地说,该机制对JVM中的内存进行标记,并确定哪些内存需要回收,根据一定的回收策略,自动进入回收队列,在合理的时机触发回收内存,永不停息的保证JVM中的内存空间,防止出现内存泄露和溢出问题。
JMM

在 Java 中,对象并非总是被垃圾回收,或者换句话说:

  1. 对象可能不被垃圾回收。
  2. 垃圾回收不等同于析构。
  3. 垃圾回收只与内存有关。

之所以有 finalize() 方法,是因为在分配内存时可能采用了类似 C 语言中的做法,而非 Java 中的通常做法。这种情况主要发生在使用”本地方法”的情况下,本地方法是一种用 Java 语言调用非 Java 语言代码的形式,就需要单独去标记需要回收的内存,触发GC垃圾回收器回收内存,避免内存泄露问题。

2. finalize()方法

1
protected void finalize() throws Throwable { }

当对象被判定为辣鸡对象时,由JVM自动调用此方法,用以标记辣鸡对象,进入回收队列。
垃圾对象:没有有效引用只想此对象时,为辣鸡对象。
垃圾回收:由GC销毁辣鸡对象,释放数据存储空间。
自动回收机制:JVM的内存耗尽,一次性回收所有辣鸡对象。
手动回收机制:使用System.gc(); 通知JVM触发垃圾回收。
注意,System.gc() 用于强制进行终结动作。

示例代码:(仅做演示,不建议覆盖finalize()方法)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class TestFinalize {
public static void main(String[] args) {
System.out.println("程序开始");

Student s1 = new Student();
System.out.println(s1);
s1 = null;
System.gc(); // 标记存储s1变量的地址为:即将需要回收的栈内存的区域
System.out.println("程序结束");
}
}
class Student {
@Override
protected void finalize() throws Throwable {
super.finalize(); // 千万不要改
System.out.println("Student finalize() executed"); // 总是最后执行
}
}

输出:
程序开始
程序结束
Student finalize() executed

3. final、finalize()、finally的区别 - 面试题

面试题:final finalize finally

  • final 修饰词,类不可继承/方法不可覆盖/基本类型值不能修改/引用类型地址不可修改
  • finalize() 方法,JVM自动调用,标记辣鸡对象进入回收队列;手动调用,使用System.gc()方法触发
  • finally 关键字,作为异常处理的一部分,它只能用在try/catch语句中,并且附带一个语句块,表示这段语句最终一定会被执行(不管有没有抛出异常),经常被用在需要释放资源的情况下。

01-GC垃圾回收器
https://janycode.github.io/2018/03/28/07_虚拟机/01-GC垃圾回收器/
作者
Jerry(姜源)
发布于
2018年3月28日
许可协议