结合之前理解过的JVM运行原理,一起通过动态的图来拆解一下上述代码的运行流程。
首先一个main线程肯定会来执行main()方法里的代码
main线程自己是有一个Java虚拟机栈的,他会把main()方法的栈帧压入Java虚拟机栈
接着main()方法里调用了loadReplicasFromDisk()方法
那么就会创建loadReplicasFromDisk()方法的栈帧,压入main线程的Java虚拟机栈里去
此时发现在loadReplicasFromDisk()方法里,有一个“repliaManager”变量,那么就会在loadReplicasFromDisk() 方法对应的栈帧里,放入一个“repliaManager”变量。
接着发现在代码里创建了一个“ReplicaManager”类的实例对象,此时就会在Java堆内存中分配这个实例对象的内存 空间。
同时,让loadReplicasFromDisk()方法的栈帧内的“replicaManager”局部变量去指向那个Java堆内存里的 ReplicaManager实例对象,看下图:
接下来,就会执行通过“replicaManager”局部变量引用的“ReplicaManager”实例对象去执行他的load()方法。
一旦loadReplicasFromDisk()方法执行完毕,此时就会把loadReplicasFromDisk()方法对应的栈帧从main线程的 Java虚拟机栈里出栈 ,就剩main栈帧了。
此时一旦loadReplicasFromDisk()方法的栈帧出栈,那么大家会发现那个栈帧里的局部变量,“replicaManager”, 也就没有了。也就是说,没有任何一个变量指向Java堆内存里的“ReplicaManager”实例对象了。
如果某个实例对象没有任何一个方法的局部变量指向他,也没有任何一个类的静态变量,包括常量等地方在指向他。
那么这个垃圾回收线程,就会把这个没人指向的“ReplicaManager”实例对象给回收掉,从内存里清除掉,让他不再 占用任何内存资源。
这样的话,这些不再被人指向的对象实例,即JVM中的“垃圾”,就会定期的被后台垃圾回收线程清理掉,不断释放 内存资源
到此为止,一路看下来,就很清晰明了。到底什么是JVM中的“垃圾”?什么又是JVM的“垃 圾回收”!
如果您发现该资源为电子书等存在侵权的资源或对该资源描述不正确等,可点击“私信”按钮向作者进行反馈;如作者无回复可进行平台仲裁,我们会在第一时间进行处理!
加入交流群
请使用微信扫一扫!