JVM的垃圾回收机制是用来干嘛的?为什么要垃圾回收?


prtyaa
prtyaa 2023-12-28 15:40:00 49483 赞同 0 反对 0
分类: 资源
大家脑子里一定要有一个会动的图,你的代码在运行的时候,起码有一个main线程会去执行所有的代码,当然也可能是你启动的别的 线程。 然后线程执行时必须通过自己的程序计数器来记录执行到哪一个代码指令了 另外线程在执行方法时,为每个方法都得创建一个栈帧放入自己的Java虚拟机栈里去,里面有方法的局部变量。 最后就是代码运行过程中创建的各种对象,都是放在Java堆内存里的。

1、对象的分配与引用

结合之前理解过的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()方法。


2、一个方法执行完毕之后会怎么样?

一旦loadReplicasFromDisk()方法执行完毕,此时就会把loadReplicasFromDisk()方法对应的栈帧从main线程的 Java虚拟机栈里出栈 ,就剩main栈帧了。

此时一旦loadReplicasFromDisk()方法的栈帧出栈,那么大家会发现那个栈帧里的局部变量,“replicaManager”, 也就没有了。也就是说,没有任何一个变量指向Java堆内存里的“ReplicaManager”实例对象了。


3、我们创建的Java对象其实都是占用内存资源的


4、不再需要的那些对象应该怎么处理?

如果某个实例对象没有任何一个方法的局部变量指向他,也没有任何一个类的静态变量,包括常量等地方在指向他。

那么这个垃圾回收线程,就会把这个没人指向的“ReplicaManager”实例对象给回收掉,从内存里清除掉,让他不再 占用任何内存资源。

这样的话,这些不再被人指向的对象实例,即JVM中的“垃圾”,就会定期的被后台垃圾回收线程清理掉,不断释放 内存资源

到此为止,一路看下来,就很清晰明了。到底什么是JVM中的“垃圾”?什么又是JVM的“垃 圾回收”!

如果您发现该资源为电子书等存在侵权的资源或对该资源描述不正确等,可点击“私信”按钮向作者进行反馈;如作者无回复可进行平台仲裁,我们会在第一时间进行处理!

评价 0 条
prtyaaL2
粉丝 1 资源 1949 + 关注 私信
最近热门资源
银河麒麟桌面操作系统备份用户数据  125
统信桌面专业版【全盘安装UOS系统】介绍  120
银河麒麟桌面操作系统安装佳能打印机驱动方法  111
银河麒麟桌面操作系统 V10-SP1用户密码修改  105
最近下载排行榜
银河麒麟桌面操作系统备份用户数据 0
统信桌面专业版【全盘安装UOS系统】介绍 0
银河麒麟桌面操作系统安装佳能打印机驱动方法 0
银河麒麟桌面操作系统 V10-SP1用户密码修改 0
作者收入月榜
1

prtyaa 收益393.62元

2

zlj141319 收益218元

3

1843880570 收益214.2元

4

IT-feng 收益209.03元

5

风晓 收益208.24元

6

777 收益172.71元

7

Fhawking 收益106.6元

8

信创来了 收益105.84元

9

克里斯蒂亚诺诺 收益91.08元

10

技术-小陈 收益79.5元

请使用微信扫码

加入交流群

请使用微信扫一扫!