【JVM】HotspotJVM 分代回收机制
前言
📫作者简介:小明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 在用,但主流虚拟机没有使用,因为存在对象相互引用的情况,这个时候需要引入额外的机制来处理,这样做影响效率。
版权声明: 本文为 InfoQ 作者【小明Java问道之路】的原创文章。
原文链接:【http://xie.infoq.cn/article/a1f8092843bf79fb288c1aaca】。文章转载请联系作者。
评论