Java虚拟机(JVM)学习之GC

本文详细探讨了Java内存管理中的垃圾回收机制,涉及哪些内存需要回收、各种GC触发时机、回收算法(如标记清除、复制和标记-整理)以及HotSpotJVM的实现。重点介绍了GCroots的概念和各收集器的工作原理。
摘要由CSDN通过智能技术生成

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

  1. 哪些内存需要回收(Which)
  1. 各种GC的触发时机(When)
  1. 如何回收(How)
3.1 回收算法  
3.2 HotSpot的具体实现-各种收集器
  1. GC日志

1. 哪些内存需要回收(Which)

大多数没干过C或者C++的Javaer是幸福的,因为没有体会过那种自己new delete内存的感觉,创建对象就是new,不管内存的回收问题。其实我们的内存是JVM的GC机制来帮我们回收的。那么问题来了。到底哪些内存需要回收呢?

答案:可达性分析算法,说白了,就是JVM预先确定一组GC roots引用变量,如Student stu =new Student();这个stu就可以作为GC roots,当进行垃圾回收时,JVM通过GC Roots找到能够引用到的所有活对象,然后把剩下的对象标记为"无用",即可回收状态

能够作为GC roots的引用如下:

  • 所有Java线程当前活跃的栈帧里指向GC堆里的对象的引用;换句话说,当前 所有正在被调用的方法的引用类型的参数/局部变量/临时值。

  • VM的一些静态数据结构里指向GC堆里的对象的引用,例如说HotSpot VM里的Universe里有很多这样的引用。

  • JNI handles,包括global handles和local handles(看情况)所有当前被加载的Java类(看情况)Java类的引用类型静态变量(看情况)Java类的运行时常量池里的引用类型常量(String或Class类型)(看情况)String常量池(StringTable)里的引用

2. 各种GC的触发时机(When)

2.1 GC类型

说到GC类型,就更有意思了,为什么呢,因为业界没有统一的严格意义上的界限,也没有严格意义上的GC类型,都是左边一个教授一套名字,右边一个作者一套名字。为什么会有这个情况呢,因为GC类型是和收集器有关的,不同的收集器会有自己独特的一些收集类型。所以作者在这里引用R大关于GC类型的介绍,作者觉得还是比较妥当准确的。如下:

  • Partial GC:并不收集整个GC堆的模式

  • Young GC(Minor GC):只收集young gen的GC

  • Old GC:只收集old gen的GC。只有CMS的concurrent collection是这个模式

  • Mixed GC:收集整个young gen以及部分old gen的GC。只有G1有这个模式

  • Full GC(Major GC):收集整个堆,包括young gen、old gen、perm gen(如果存在的话)等所有部分的模式。

2.2 触发时机

上面大家也看到了,GC类型分分类是和收集器有关的,那么当然了,对于不同的收集器,GC触发时机也是不一样的,作者就针对默认的serial GC来说:

  • young GC:当young gen中的eden区分配满的时候触发。注意young GC中有部分存活对象会晋升到old gen,所以young GC后old gen的占用量通常会有所升高。

  • full GC:当准备要触发一次young GC时,如果发现统计数据说之前young GC的平均晋升大小比目前old gen剩余的空间大,则不会触发young GC而是转为触发full GC(因为HotSpot VM的GC里,除了CMS的concurrent collection之外,其它能收集old gen的GC都会同时收集整个GC堆,包括young gen,所以不需要事先触发一次单独的young GC);或者,如果有perm gen的话,要在perm gen分配空间但已经没有足够空间时,也要触发一次full GC;或者System.gc()、heap dump带GC,默认也是触发full GC。

3. 如何回收(How)

3.1 回收算法

由于网上已经拥有非常多的优秀博文来详细介绍关于回收算法这块,所以这块作者将引用其他博客的介绍并加上自己的一些描述:

3.1.1 标记清除算法(Mark-Sweep)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.1.2复制算法(Coping)(绝大部分收集器的新生代使用的算法)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

复制算法在JVM新生代垃圾回收中的运用:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Eden:From:TO =8:1:1

由于新生代中90%的对象都是"朝生夕死",采用复制算法是比较合理的,首先只移动了存活下来的对象(比较少数),其次,内存在移动到To区域后是有顺序的,不存在内存碎片。

值得一提的是,假如在一次MinorGC时,Eden中存活的对象+From中存活的对象>To的剩余空间,则会通过担保机制将对象直接转移到Old gen ,如果Old gen的内存空间也不够,则进行一次Full gc .

当对象的年龄到达15岁时会转移到Old gen (可通过参数配置,一般不建议更改。)

3.1.3标记-整理算法(Mark-Compact):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

由于Old gen 的大部分对象都是年龄很大的对象,所以存活率比较高,采用复制算法肯定是行不通的(较多的对象复制操作),所以才大部分收集器的old gen采用 Mark-Compact算法,避免了空间碎片。

3.1.4三种算法比较:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

稍微解释一下常见的关于GC时间的问题:

最后

即使是面试跳槽,那也是一个学习的过程。只有全面的复习,才能让我们更好的充实自己,武装自己,为自己的面试之路不再坎坷!今天就给大家分享一个Github上全面的Java面试题大全,就是这份面试大全助我拿下大厂Offer,月薪提至30K!

我也是第一时间分享出来给大家,希望可以帮助大家都能去往自己心仪的大厂!为金三银四做准备!
一共有20个知识点专题,分别是:

Dubbo面试专题

JVM面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Java并发面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Kafka面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

MongDB面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

MyBatis面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

MySQL面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Netty面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

RabbitMQ面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Redis面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Spring Cloud面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

SpringBoot面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

zookeeper面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

常见面试算法题汇总专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

计算机网络基础专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

设计模式专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!
络基础专题**

[外链图片转存中…(img-BAvATLDP-1714692687396)]

设计模式专题

[外链图片转存中…(img-Lf9cpozI-1714692687396)]
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

  • 30
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值