
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;
}
}