概述
垃圾收集器需要完成的三件事
那些内存需要回收?
什么时候回收?
如何回收?
那些需要进行GC
程序计数器、虚拟机栈、本地方法栈3个区域随线程而生,随线程灭而灭,栈中的栈帧随着方法的进入和退出有条不紊的进行出栈和入栈操作。每一个栈帧中分配多少内存基本上是在类结构确定下来时就已知(尽管在运行期间会由即时编译器进行一些优化,但在基于概念模型的讨论里,大体上可以认为是已知的),因此这几个区域内存的分配和回收都具备确定性,在这几个区域内就不需要过多考虑回收的问题,当方法结束或者线程结束时,内存自然就随着回收了
Java堆和方法区这两个区域则有着很显著的不确定性:一个接口的多个实现类需要的内存可能会不一样,一个方法所执行的不同条件分支所需要的内存也可能不一样,只有处于运行期间,我们才能知道这个程序究竟会创建那些对象。
如何判断对象是否该被回收?
引用计数法
在对象里面添加一个引用计数器,每当有一个对象引用它时,计数器值就加一;每当引用失效,计数器的值就减一;任何时刻计数器为零的对象就是不可能再被使用的
/**
* @className: JVM_1
* @description: 测试JVM是否使用引用计数法
* @author: 热爱生活の李
* @since: 2022/5/20 14:52
*/
public class JVM_1 {
public Object instance = null;
private static final int _1MB = 1024 * 1024;
public static void main(String[] args) {
JVM_1 objectA = new JVM_1();
JVM_1 onjectB = new JVM_1();
objectA.insta