01-GC垃圾回收器
Java 中有垃圾回收器回收无用对象占用的内存,这也真是Java可以屏蔽掉C语言中类似指针和内存分配malloc的两大头疼问题。作为语言榜首的Java自然有其垃圾回收的一套机制策略。
1. Java GC 垃圾回收器
Java GC(Garbage Collection,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者一般不需要专门编写内存回收和垃圾清理代码,对内存泄露和溢出的问题,也不需要像C程序员那样战战兢兢。
这是因为在Java虚拟机中,存在自动内存管理和垃圾清扫机制。
概括地说,该机制对JVM中的内存进行标记,并确定哪些内存需要回收,根据一定的回收策略,自动进入回收队列,在合理的时机触发回收内存,永不停息的保证JVM中的内存空间,防止出现内存泄露和溢出问题。
在 Java 中,对象并非总是被垃圾回收,或者换句话说:
- 对象可能不被垃圾回收。
- 垃圾回收不等同于析构。
- 垃圾回收只与内存有关。
之所以有 finalize() 方法,是因为在分配内存时可能采用了类似 C 语言中的做法,而非 Java 中的通常做法。这种情况主要发生在使用”本地方法”的情况下,本地方法是一种用 Java 语言调用非 Java 语言代码的形式,就需要单独去标记需要回收的内存,触发GC垃圾回收器回收内存,避免内存泄露问题。
2. finalize()方法
1 |
|
当对象被判定为辣鸡对象时,由JVM自动调用此方法,用以标记辣鸡对象,进入回收队列。
垃圾对象:没有有效引用只想此对象时,为辣鸡对象。
垃圾回收:由GC销毁辣鸡对象,释放数据存储空间。
自动回收机制:JVM的内存耗尽,一次性回收所有辣鸡对象。
手动回收机制:使用System.gc(); 通知JVM触发垃圾回收。
注意,System.gc() 用于强制进行终结动作。
示例代码:(仅做演示,不建议覆盖finalize()方法)
1 |
|
输出:
程序开始
程序结束
Student finalize() executed
3. final、finalize()、finally的区别 - 面试题
面试题:final finalize finally
- final 修饰词,类不可继承/方法不可覆盖/基本类型值不能修改/引用类型地址不可修改
- finalize() 方法,JVM自动调用,标记辣鸡对象进入回收队列;手动调用,使用System.gc()方法触发
- finally 关键字,作为异常处理的一部分,它只能用在try/catch语句中,并且附带一个语句块,表示这段语句最终一定会被执行(不管有没有抛出异常),经常被用在需要释放资源的情况下。