• 清理 Java 堆内存中不再需要的那些对象实例;

根据 JVM 运行原理,分析垃圾回收机制在上述代码运行流程中的作用:

  1. public class kafka {
  2. public static void main(){
  3. loadReplicasFromDisk();
  4. }
  5. private static void loadReplicasFromDisk(){
  6. ReplicaManager replicaManager = new ReplicaManager();
  7. replicaManager.load();
  8. }
  9. }

image.png

  • 首先一个 main 线程会执行主类 main() 方法中的代码;
  • main 线程自己有一个 java 虚拟机栈,它会把 main() 方法的栈帧压入 java 虚拟机栈;
  • main() 方法调用 loadReplicasFromDisk() 方法,就会创建一个 loadReplicasFromDisk() 的栈帧压入 java 虚拟机栈;
  • loadReplicasFromDisk() 中有一个局部变量 replicaManager,会把这个变量放入到它对应栈帧的局部变量表中;
  • loadReplicasFromDisk() 方法中创建了一个 ReplicaManager 类的实例对象,会在 Java 堆内存中为这个对象实例分配内存空间;
  • 接下来,会执行 replicaManager 局部变量引用的 ReplicaManager 实例对象去执行它的 load() 方法;

  • load() 方法执行完毕,load() 对应的栈帧从 main 线程的 java 虚拟机里出栈;

  • loadReplicasFromDisk() 执行完毕,loadReplicasFromDisk() 对应的栈帧从 main 线程的 java 虚拟机里出栈;
  • 栈帧里的 replicaManager 局部变量没有了,没有任何变量指向 Java 堆内存里的 ReplicaManager 实例对象了;image.png

  • 在启动一个 JVM 进程的时候,它就会自带一个垃圾回收的后台线程,会在后台不断检查 JVM 堆内存中的各个实例对象;

  • 垃圾回收线程,发现 ReplicaManager 实例对象没有任何一个方法的局部变量指向它,也没有任何一个类的静态变量,包括常量等地方指向它,那么把这个实例对象从内存清除,不再占用内存资源;

image.png