垃圾回收机制的一个算法,算法分析理解起来比较抽象,再讲一下新生代和老年代,垃圾回收机制的一个策略,垃圾回收机制是干嘛用的,
1. 什么是垃圾回收机制?
相当于JVM不定时的去回收不可达的对象,他这个完全是自动的,有没有人学过C语言的,C语言需自己去释放内存的,JAVA就不一样,
你不用去管理内存,我后台会帮你自动去回收,垃圾回收机制是JAVA非常核心的一个知识,因为他不需要自己去回收,是自动化的,
回收的是不可达对象,gc方法主要是提示给GC进行回收,但是不会立即回收
2. 什么是不可达对象?
对象没有被引用,或者对象没有存活,不可达对象并不是马上就回收掉的
package com.learn.test;
/**
* 演示一下垃圾回收机制
* @author Leon.Sun
*
*/
public class Test001 {
/**
* 什么是不可达对象
* 没有继续被引用到了
* 或者你自己直接置为空
* 提示垃圾回收器回收
* JVM不会立马回收掉的
* 有的地方吧可达叫做没有存活
* 这其实是一个意思
* 表示没有被继续的使用
*
* @param args
*/
public static void main(String[] args) {
/**
* 我定义一个对象
* new一下Object这个类
* 是任何类的祖宗
* new这个Object类的时候
* 你看这个对象可不可达
* 这个情况还是可达的
* 除非GC他去回收的时候
* 如果没有被继续引用的情况下
* 可能就不可达了
*
* obj1是可达的
* 因为他已经被别人给使用到了
* 这就叫可达对象
* 如果你把一个对象定义出来
* 为什么是可达的呢
* 虽然他没有被使用掉
* 因为JVM会做一些垃圾回收分析
* 我判断一下他到底可不可达
* 可达的
* 归根结底判断原则是什么呢
* 具体要根据算法进行分析的
* 这个刚开始可能是可达的
*
* 如果没有置为null
* 它是不会立马进行回收的
* 因为JVM底层需要算法进行分析
* 分析的时候是需要过程的
* 没有立马知道他是不可达对象
* 通过层层算法得知之后
* 我才知道obj1没有继续使用的情况下
* 那么他才是不可达对象
* 一定要在强制标示为null的情况下
* obj1是不可达对象
*
*/
// Object obj1 = new Object();
/**
* 这里要new Test001
* new完之后再运行一遍就可以了
* finalize方法正好被Test001给重写了
* 垃圾回收机制在回收之前
* 它会调用finalize方法的
* 垃圾回收机制要开始执行我的方法啦................
* 是不是开始进行回收了
* 但是这个不代表一定会进行回收的
* GC线程你们明白是什么意思没有
* GC线程是守护线程还是非守护线程
* 它是和主线程绑在一起的
* 如果他不是守护线程
* 我主线程挂了你还在就没什么用
* GC线程是跟着主线程结束
* 所以他是一个守护线程
* 这个是最基本的
* 在学JAVASE之前的时候
*
*/
Object obj1 = new Test001();
/**
* 一般我们可以把它置为空
* 置为空可不可达
* 如果你把object置为空的情况下
* 那这个时候会怎么样呢
* 相当于这个对象不可达了
* 记住这个就表示不可达了
* 不可达对象
* 提示JVM去回收的
* 加这段代码和不加这段代码有什么区别
* 比如我的GC进行回收的时候
* 最开始通过计数法
* 计数法什么意思呢
* 会给这个对象做一个计数
* 如果垃圾回收器每次回收的时候
* 发现你这个对象即使被使用的情况下
* 我就会给这个对象引用数加1
* 如果加到15次之后
* 他就会进入到老年代里面去的
* 这个时候这个对象就很少被回收的
*
*
* 我们把obj1置为空
* 表示这个对象已经告诉给JVM了,
* 是不可达对象了
*
*/
obj1 = null;
/**
* 把obj1引用给obj2
* 那这个时候对象可不可达
*
* 你不能说他完全是不可达对象
*
*/
// Object obj2 = obj1;
/**
* 我们把obj2置为null
* 这就完全告诉我了
*/
// obj2 = null;
/**
* 这个表示什么意思,
* 提示给GC进行回收垃圾
* 很多人把gc理解为立即回收
* 不能够立即的
* 提示给JVM垃圾回收机制回收,但是不代表立即进行回收
* 因为它不一定的
* 他有空才会收
* 因为它底层也是需要线程进行调度的
* 只能说你调用这个代码提示GC进行回收
*
* 通知GC去回收
* 但是不代表立即去回收
*/
System.gc();
}
/**
* 比如你们知道这个方法
* finalize方法是object类里面的
*
*/
@Override
protected void finalize() throws Throwable {
/**
* 垃圾回收机制之前会进行执行的方法
* 在学JAVASE的时候
* finalize和finally的区别
* 相当于垃圾回收机制之前
* 在这边有个误区
* 我们打印一段日志
*/
System.out.println("垃圾回收机制要开始执行我的方法啦................");
}
}