图文详解JVM中的垃圾回收机制(GC)


1. 什么是垃圾回收机制(GC)

在早期的计算机语言,比如 C 和 C++,需要开发者手动的来跟踪内存,这种机制的优点内存分配和释放的效率很高。但是它也有它的缺点如果程序员不小心忘记释放内存,从而造成内存的泄露

内存泄露:申请内存之后,忘记释放了 导致 可用的内容越来越少,最终无内存可用

新的编程语言,比如 JAVA,Go,Python,PHP… 现在市面上的大部分主流编程语言,都采取了一个方案,那就是 “垃圾回收机制”,运行时自身会运行相应的垃圾回收机制。程序员只需要申请内存,而不需要关注内存的释放垃圾回收器(GC)会在适当的时候将已经终止生命周期的变量的内存给释放掉。

1.1 垃圾回收机制的优缺点

GC的优点:

  • 它大大简化了应用层开发的复杂度(不需要开发者再去手动跟踪内存)
  • 降低了内存泄露的风险

GC的缺点:

  • 消耗额外的开销(消耗的资源更多了)
  • 会影响程序的流畅运行

2. 哪些内存需要回收

JVM的内存结构包括四大区域:1.程序计数器 2.栈 (虚拟机栈,本地方法栈)3.堆 4.方法区

在这里插入图片描述

举个例子,任何组织里,人都有三个派别,1.积极派 2.消极派 3.中间摇摆派,如图,对于上述三个派别,哪些是要进行回收释放内存的?

正在使用的内存中的对象 代表 积极派

不再使用,但是尚未回收的内存中的对象 代表消极派

中单部分为中间摇摆派
在这里插入图片描述
需要进行回收释放资源的:消极派

为什么中间摇摆派不回收释放内存呢?对于这种部分仍在使用,一部分不在使用的对象,整体来说是不释放的!等到这个对象彻底完全不使用,才真正的释放!!

注意

垃圾回收的基本单位是“对象”,而不是“字节”

3. 垃圾回收具体是如何回收的

分为两个阶段:

  1. 找垃圾/判定垃圾
  2. 回收垃圾(释放内存)

3.1 找垃圾/判定垃圾

如何找 垃圾/判定垃圾呢?当下主流的思路,有两种方案:

  1. 基于引用计数(不是Java中采取的方案,这是别的语言,像Python采取的方案)
  2. 基于可达性分析(这个是Java采取的方案)

3.11 基于引用计数

什么是基于引用计数:简单来说,针对每个对象,都会额外引入一小块内存,保存这个对象有多少个引用指向他
举个例子
1.Test t = new Test();,此时 new 了一个对象,那么我们就会额外引入一小块内存,此时 t 指向这个对象的引用,因此 引用计数 加 1

评论 64
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

偷偷敲代码的青花瓷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值