你不得不知道的JVM知识-垃圾回收(一)


前言

java提供了自动的垃圾回收机制,使程序员不用过多地操作内心管理问题。自动化的内存分配和来及回收方式已经成为 了现代开发语言必备的标准。


一、自动内存管理

1.1 不回收垃圾会怎么样?

1.内存迟早都会被消耗完,就好像不停地生产生活垃圾 而从来不打扫一样

2.垃圾回收以便 JVM 将整理出的内存分配给新的对象

3.随着应用程序所应付的业务越来越庞大、复杂,用户越来越多,没有垃圾回收 就不能保证应用程序的正常进行。

1.2 自动内存管理的优点

1.无需开发人员手动参与内存的分配与回收,这样降低内存泄漏和内存溢出的风险
2.将程序员从繁重的内存管理中释放出来,可以更专心地专注 于业务开发

1.3自动内存管理的担忧

1.自动内存管理就像是一个黑匣子,如果过度依赖于 “自动”,那么这将会是一场灾难,最严重的就会弱化 Java 开发人员在程序出现内存溢出时定位问题和解决问题的能力。

2.只有在真正了解 JVM 是如何管理内存后,我们才能够在遇见 OutofMemoryError 时, 快速地根据错误异常日志定位问题和解决问题

3.当垃圾收集成为系统达到更高并 发量的瓶颈时,我们就必须对这些“自动化”的技术实施必要的监控和调节


二、应该关心哪些区域的回收?

Java 堆是垃圾收集器的工作重点

从次数上讲:

频繁收集年轻代区

较少收集老年代区

基本不收集元空间(方法区)


三、 如何确定垃圾?

3.1垃圾标记阶段

重点:主要是为了判断对象是否存活

判断对象存活一般有两种方式:引用计数算法和可达性分析算法。引用计数法容易产生循环引用的问题,可达性分析通过根搜索算法来实现。根搜索方法以一系列GC Roots的点作为起点向下搜索,在一个对象到任何GC Roots都没有引用链相连时,说明其已经死亡。
在这里插入图片描述

3.2引用计数算法

在Java中要想操作,就先获取该对象的引用,因此可以通过引用计数法判断一个对象是否可以被回收

过程:为对象添加一个引用时,引用计数+1,删除一个引用时,引用计数-1。如果一个对象的引用计数为0,则表示该对象没有被引用,可以被回收。

缺点:
容易产生循环引用问题,两个对象相互引用,导致引用一直存在,而不能被回收。

在这里插入图片描述

3.3可达性分析算法

相较于引用计数算法,这里的可达性分析就是 Java、C#选择的。这种类型的 垃圾收集通常也叫作追踪性垃圾收集(Tracing Garbage Collection)
在这里插入图片描述

过程:定义一些GC Roots对象,然后以这些GC Roots对象作为起点向下搜索,如果在GC Roots和一个对象之间没有可达路径,则称这些对象是不可达的。

GC Roots 可以是哪些元素?
简单一句话就是,除了堆空间的周边,比如:虚拟机栈、本地方法栈、方法区、 字符串常量池等地方对堆空间进行引用的,都可以作为 GC Roots 进行可达性分析。


总结

本章主要介绍了自动内存管理的相关概念以及垃圾标记阶段的两种常见算法:引用计数算法和可达性分析算法。引用计数算法容易产生循环引用问题,所以JAVA一般使用可达性分析算法。关于垃圾回收阶段的相关内容将会在以后的章节中介绍。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

JinziH Never Give Up

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

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

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

打赏作者

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

抵扣说明:

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

余额充值