写点什么

【JVM】HotspotJVM 分代回收机制

  • 2022 年 8 月 30 日
    上海
  • 本文字数:1420 字

    阅读完需:约 5 分钟

前言

📫作者简介小明java问道之路,专注于研究计算机底层/Java/Liunx 内核,就职于大型金融公司后端高级工程师,擅长交易领域的高安全/可用/并发/性能的架构设计📫 

🏆 InfoQ 签约作者、CSDN 专家博主/Java 领域优质创作者/CSDN 内容合伙人、阿里云专家/签约博主、华为云专家、51CTO 专家/TOP 红人 🏆

🔥如果此文还不错的话,还请👍关注、点赞、收藏三连支持👍一下博主~


本文导读

一、GC 概述

gc 全拼 Garbage Collection,顾名思义垃圾回收的意思,它的主要作用就是回收程序中不再使用的内存。

那我们首先需要知道是否可以主动通知 jvm 进行垃圾回收?在 Java 中不能实时调用垃圾回收器对某个对象或者所有对象进行垃圾回收,但是可以通过 System.gc()方法来通知垃圾回收器运行,当然,jvm 也并不保证垃圾回收器马上就会运行。由于 System.gc()方法的执行会停止所有的响应,去检查内存是否有可回收的对象,对程序的正常运行和性能造成了威胁,所以该方法不能频繁使用而且使强烈不推荐使用。正所谓用人不疑疑人不用,那么了解 GC 回收机制至关重要。下面会提出几个问题作为本文的开篇。

Java 与 C++等语言最大的技术区别?自动化的垃圾回收机制(GC)

为什么要了解 GC 和内存分配策略?1、面试需要 2、GC 对应用的性能是有影响的; 3、写代码有好处 

JVM 中哪些地方会被回收?栈:栈中的生命周期是跟随线程,所以一般不需要关注堆:堆中的对象是垃圾回收的重点方法区/元空间:这一块也会发生垃圾回收,不过这块的效率比较低,一般不是我们关注的重点

问题来了虽然 Java 不需要开发人员手动管理内存回收,但是你有没有想过,这些内存使如何被回收的?什么是需要被回收的?回收的算法它们各有什么优势?下面我将重点讲解这几个问题

二、分代回收理论

垃圾回收主要发生在堆区,我们先留下垃圾回收的整体框架,在对每一个点进行剖析。

当前商业虚拟机的垃圾回收器,大多遵循“分代收集”的理论来进行设计,这个理论大体上是这么描述的: 1、 绝大部分的对象都是朝生夕死。 2、 熬过多次垃圾回收的对象就越难回收。 根据以上两个理论,朝生夕死的对象放一个区域,难回收的对象放另外一个区域,这个就构成了新生代(eden,from,to)和老年代(tenured)。

三、GC 种类

市面上发生垃圾回收的叫法很多,我大体整理了一下:

1、 新生代回收(MinorGC / YoungGC):指只是进行新生代的回收。

2、 老年代回收(MajorGC / OldGC):指只是进行老年代的回收。目前只有 CMS 垃圾回收器会有这个单独的回收老年代的行为。 (MajorGC 定义是比较混乱,有说指是老年代,有的说是做整个堆的收集,这个需要你根据别人的场景来定,没有固定的说法)

3、 整堆回收(FullGC):收集整个 Java 堆和方法区(注意包含方法区)

四、什么是垃圾

在堆里面存放着几乎所有的对象实例,垃圾回收器在对对进行回收前,要做的事情就是确定这些对象中哪些还是“存活”着,哪些已经“死去”(死去 代表着不可能再被任何途径使用得对象了) 什么是垃圾?C 语言申请内存:mallocfree C++: newdelete C/C++ 手动回收内存 Java:new Java 是自动内存回收,编程上简单,系统不容易出错。 手动释放内存,容易出两种类型的问题: 1、忘记回收 2、多次回收 没有任何引用指向的一个对象或者多个对象(循环引用)

五、引用计数法

在对象中添加一个引用计数器,每当有一个地方引用它,计数器就加 1,当引用失效时,计数器减 1.Python 在用,但主流虚拟机没有使用,因为存在对象相互引用的情况,这个时候需要引入额外的机制来处理,这样做影响效率。

发布于: 3 小时前阅读数: 12
用户头像

InfoQ签约作者/技术专家/博客专家 2020.03.20 加入

🏆InfoQ签约作者、CSDN专家博主/Java领域优质创作者、阿里云专家/签约博主、华为云专家、51CTO专家/TOP红人 📫就职某大型金融互联网公司高级工程师 👍专注于研究Liunx内核、Java、源码、架构、设计模式、算法

评论

发布
暂无评论
【JVM】HotspotJVM分代回收机制_8月月更_小明Java问道之路_InfoQ写作社区