JVM 垃圾回收器GC

package com.JavaSE.day04;

import java.util.Random;

/**
 * description: Jvm <br>
 * java内存结构
 * 1.栈区stack[先进后出,类似于子弹弹夹],存放变量名,以及基本类型的值和对象类型的内存地址
 * 2.堆区heap[先进先出,类似于海洋],存放对象类型本身(new出来的对象)
 * 3.方法区method,存放字节码文件,静态成员....
 * <p>
 * 总结:
 * 1.new关键字表示在内存堆空间开辟一块空间来保存创建的对象本身,而这个空间对应一个十六进制的内存地址,
 * 该地址存储在栈区,这个地址就指向了这个对象的本身
 * 2.对象如果没有被任何引用所执行,就是垃圾对象,会被JVM的gc回收
 * 3.气球理论
 * 一个对象在某一时刻,可以被多个引用所指向。
 * 一个引用在某一时刻,只能指向一个对象
 * date: 2022/3/10 2:22 PM <br>
 * author: zoumaoji <br>
 * version: 1.0 <br>
 */
public class Jvm {
    public static void main(String[] args) {
        //再栈区创建一个i变量并且保存的值为3
        int i = 3;
        //在堆中开辟一块空间来保存创建的Random对象,并且把这个空间对应的内存地址保存在栈中(random1)
        Random random1 = new Random();
        //在堆中再开辟一块空间来保存创建另一个Random对象,并且把这个空间对应的内存地址保存在栈中(random2)
        Random random2 = new Random();
        /**
         * random2的内存地址覆盖了random1的内存地址,此时random1和random2中指针都指向random2的地址
         * 目前的状况是,栈中有两个变量,分别是random1和random2,但是他们中保存的内存地址是一样的random2地址
         * 堆区中目前也是仍然有两个对象本体,但是栈中的两个变量同时指向了堆区中第二次创建的Random对象本体,而第一次创建的Random对象没有任何指针指向
         * 此时,第一次创建的Random对象就变成了垃圾对象(没有任何引用所指向的对象,无法被访问的),垃圾对象在JVM中会被GC进行自动回收
         * GC,Java垃圾回收器,它是Java进行自动资源回收的机制,它的运行有自己的算法,也就是说,垃圾的产生和垃圾的回收不是同步的,GC会根据JVM
         * 当前的情况来动态调节垃圾回收的实际,我们程序员可以用某些手段来催促垃圾回收,但是不能起到决定性作用!
         * 例如
         * System.gc();
         * Runtime.getRuntime().gc();
         * */
        random1 = random2;
    }
}
posted @ 2022-03-13 21:12  JanoCode  阅读(38)  评论(0)    收藏  举报