JAVA垃圾回收机制GC(Garbage Collection)

  • 工作面试老伙伴之java垃圾回收机制
    • 什么是GC,为什么要GC(我的明星老姐)
    • 判断垃圾(找到不常穿的衣服)
      • A 引用计数算法
      • B 可达性算法
    • 常见的垃圾回收算法(4种)
      • 标记清除算法
      • 标记整理算法
      • 复制算法
      • 分代收集算法
        • 年轻代 Minor GC (Young GC)
        • 老年代 Full GC (Major GC)
          • Stop-the-world
    • 常见的垃圾收集器(7种)
      • 年轻代垃圾收集器
      • 老年代垃圾收集器
    • 面试常考之finalize()方法
    • 面试常考之四种引用

工作面试老伙伴之java垃圾回收机制

JAVA垃圾回收机制,英文名(Garbage Collection),又简称GC,是很多面试官非常青睐的一个考点,今天谨以此文章给自己做一次系统的复习,也给正在学习这个知识点的筒子们来点参考,如果有发现讲的不恰当(不错)的地方,多请指教(收藏)哈O(∩_∩)O。
记录目前主要为自己加深理解,后期会加入自己画的配图供大家理解。

什么是GC,为什么要GC(我的明星老姐)

我的姐姐小美是个明星,除了日常的工作以外,她的爱好就是打扮自己,以至于每次回家她都会拎着大包小包的新衣服回家(创建对象),然后在衣帽间(新生代)进行各种的试穿搭配(引用对象)疯狂拍照咔咔咔,有些衣服她可能就试个一次就换下了,拍的照片也不会保存,碰到好看的她就会经常穿着,并保存着她精修的照片(#.#),但是嘞她有个不好的习惯,她懒得去整理那些不爱穿的衣服,久而久之,衣帽间动不动就爆满,这时候 我老妈(GC)就出场了,她总是默默地趁我姐没在试衣的时候(Stop-the-world)把她不经常穿的衣服都整理出来捐了,把她经常穿的衣服挂在她房间(老年代)的晾衣架上方便她用,这样我老姐下次回来衣帽间又空出来一大块,又能肆无忌惮地试衣服了。

同理,程序在运行的过程中会通过NEW等方法创建出一系列的对象,当这些对象被弃用之后就会占据一定的内存空间,此时就需要GC去清理这些无用的对象来保证后续程序运行时有足够的内存空间,避免发生内存泄漏OOM(OutOfMempry),GC主要在堆上进行操作,又称堆GC。

判断垃圾(找到不常穿的衣服)

A 引用计数算法

我姐会给她的每套衣服都拍上一张照片,如果她觉得衣服好看,就会多拍几张,如果她觉着不好看了,就会回头把那些衣服的照片都删掉,于是我老妈特地从她的照片上去判断哪些衣服出现过,如果有些衣服一张照片都没有了,就说明这衣服她不喜欢了,那就把这衣服捐了,衣帽间就又空了。

同理,引用计数算法通过判断每个对象自带的引用计数器去决定其是否被回收,如被引用一次则+1,完成一次则-1,当引用次数为0时此对象便会被当做垃圾收集。

√ 优点:效率高,只需要遍历计数器。
× 缺点:程序存在循环引用的情况下无法被筛选,造成内存泄漏。(即我姐的照片里面出现了一些衣服,但是并没有穿在身上,我妈以为她还喜欢,但是其实这些衣服是不小心出镜的。)

B 可达性算法

为了避免引用计数算法缺点造成的尴尬,于是需要改进一下判断算法,必须是我姐穿在身上出镜的衣服,才是她要穿的衣服。

可达性算法即通过GC Root向下查询引用链,一步步找到可以到达的对象,而不可达的对象则被视为要回收的垃圾,那么GC Root又是啥东东
GC Root的具体体现:

  1. java虚拟机栈中的引用变量
  2. 方法区中的类静态属性引用的对象
  3. 方法区中的常量引用的对象
  4. 本地方法栈中JNI本地方法的引用对象
  5. 活跃线程的引用对象(万物皆对象)

常见的垃圾回收算法(4种)

标记清除算法

标记清除算法是指在找到垃圾之后直接在内存空间上将其清理,但是由于太过简单,会造成很多碎片化的空间。

标记整理算法

标记整理算法则在标记清除算法的基础上对清理前的内存空间进行了整理,使得被占用的内存有效在排放在紧凑的区域,从而使得许多碎片化的空闲内存可以连续,从而方便一些占用内存较大的对象保存。

复制算法

复制算法则是干脆先找出一片大块连续的空闲内存,先将有效对象从各处复制到空闲区域并排好,随后将其他区域一并清理。为了避免所有对象都是可用对象的情况,所以复制算法要求必须存在一片空闲区域占50%以上的空间,这样就显得有些浪费。由于此算法需要用到复制等操作,所以适用于失效比较频繁的堆区域,即年轻代。

分代收集算法

分代收集算法顾名思义则即分年代收集,分为年轻代和老年代的收集(此前还有永久代)。

年轻代 Minor GC (Young GC)

年轻代的内存区域分为三部分,它们分别是Eden区(伊甸区)和两个Survivor区(幸存者区),新创建的对象基本会在Eden区,当每次发生MinorGC 的时候,GC就会把被引用的对象从Eden区采用复制算法放置在某个Survivor区内,此时这个Survivor区就被称为To区,当下次GC的时候,从Eden区新过来的对象就和上一次放在To区的对象一起复制到另外一个Survivor区内,而此时之前的Survivor区就被叫做From区,接受对象的Survivor区则变成To区,每次复制会给存活的对象计数+1,当计数达到设定的阈值时,则会将此对象移入老年代。
☆ MinorGC耗费时间较短,发生的频率也较高。

老年代 Full GC (Major GC)

其实Full GC其实不单单是对老年代进行垃圾收集,它也是包括对新生代的垃圾收集,所以其耗费的时间相当长,所以执行的频率也相对比较低。
对于Full GC我们更多地需要了解的是它的触发条件:

  1. 老年代的内存空间不足的情况下
  2. 老年代根据每次新生代转移过来的内存平均值判断内存不够下一次转移的情况下
  3. 程序调用System.gc()的时候(这只是建议)。
  4. 计时器触发
Stop-the-world

不管是何种垃圾回收算法,其在运行的时候,所有线程都会停止为此让路,从而避免边收拾边产生垃圾的情况,这样一来,“世界停止”的时间就显得尤为重要了,一旦造成太长则会容易影响其他程序的运行,对于一些严格控制时间的程序(如广告播放)是极为不利的。
从分代收集算法的两个年代的特点我们也不难得出GC影响正常程序的四种情况:
☆☆ Minor GC的单次执行时间过长/Full GC的执行次数态频繁
☆ Full GC的单次执行时间过长/Minor GC的执行次数态频繁

常见的垃圾收集器(7种)

年轻代垃圾收集器

  1. Serial收集器(复制算法):单线程的收集器,简单高效
  2. ParNew收集器(复制算法):多线程收集器,多部分代码与Serial重合
  3. Parallel Scavenge(复制算法):同上,但是更注重系统吞吐量

老年代垃圾收集器

  1. Serial Old 收集器(标记整理算法):单线程的老年版本,可配合上述所有年轻代收集器。

  2. Parallel Old 收集器(标记整理算法):多线程老年版本,配合上述第3种,注重吞吐量。

  3. Concurrent Mark Sweep收集器(标记清除算法):并发处理,注重暂停时间,可配合上述第1和第2种收集器。

  4. Garbage First收集器(复制+标记整理算法):无年轻代与老年代之分。

面试常考之finalize()方法

当gc准备释放某个对象的内存地址空间时,会给与其两次机会,首先会将其置于F-Queue
队列,判断其是否使用过finalize()方法,如果未使用过则运行finalize()方法给其复活的机会,如果使用过则直接回收

面试常考之四种引用

  1. 强引用:宁可抛出OutOfMemoryError也不会清除
  2. 软引用:内存空间不足时会被GC清除
  3. 弱引用:每次GC都会清除只具有弱引用的对象,在GC前可以通过GET获取对象
  4. 虚引用:任何时候都会被GC回收,用作判断GC何时启动,无法通过GET获取对象

JAVA垃圾回收机制GC之我姐是明星相关推荐

  1. java 垃圾回收机制GC

    1.GC的作用取 2.什么是GC JVM在进行GC时,并非每次都对上面三个内存区域一起回收的,大部分时候回收的都是指新生代. 因此GC按照回收的区域又分了两种类型,一种是普通GC(minor GC), ...

  2. java垃圾回收机制_乐字节Java|GC垃圾回收机制、package和import语句

    本文接上一篇:乐字节Java|this关键字.static关键字.block块.本文是接着讲述JavaGC垃圾回收机制.package 和 import语句. 一.GC垃圾回收机制 GC全名:Garb ...

  3. Java垃圾回收(GC)机制详解

    Java垃圾回收(GC)机制详解 转自:https://www.cnblogs.com/xiaoxi/p/6486852.html 一.为什么需要垃圾回收 如果不进行垃圾回收,内存迟早都会被消耗空,因 ...

  4. 36.JVM内存分哪几个区,每个区的作用是什么、如和判断一个对象是否存活、java垃圾回收机制、垃圾收集的方法有哪些、java类加载过程、类加载机制、双亲委派、Minor GC和Major GC

    36.JVM内存分哪几个区,每个区的作用是什么? 37.如和判断一个对象是否存活?(或者GC对象的判定方法) 38.简述java垃圾回收机制? 39.java中垃圾收集的方法有哪些? 40.java类 ...

  5. java对于垃圾回收机制[GC垃圾回收机制] 为什么有GC还会有内存溢出呢?

    java垃圾回收机制 来源于书本和工作中的总结. 内存泄露 如果分配出去的内存得不到释放,及时回收,就会引起系统运行速度下降,甚至导致程序瘫痪,这就是内存泄露 GC机制 java内存分配和回收 都是j ...

  6. 【JVM】Java垃圾回收机制(GC)详解

    Java垃圾回收机制(GC)详解 一.为什么需要垃圾回收? 如果不进行垃圾回收,内存迟早都会被消耗空,因为我们在不断的分配内存空间而不进行回收.除非内存无限大,我们可以任性的分配不回收,但是事实并非如 ...

  7. java垃圾回收机制_笔记 | Java垃圾回收机制

    本文经授权转载自程序员杂货铺(ID:speakFramework) 垃圾回收 最近上海的小伙伴是不是要被强垃圾分类搞疯了???哈哈哈哈 上海是个走在前列的城市啊,不光骑自行车闯红灯要被罚钱,垃圾不分类 ...

  8. Java 垃圾回收机 GC Roots详解(Garbage Collection Roots)

    背景: 之前面试阿里支付宝,被问到常见的GC Root 是什么? 当时自己支支吾吾,明明自己看过深入理解Java 虚拟机这本书,但是就是回答不上来. 后来自己工作中,遇到内存泄漏问题.我百度,下载了M ...

  9. Java垃圾回收机制(Garbage Collection)

    引用博客地址:http://www.cnblogs.com/ywl925/p/3925637.html 以下两篇博客综合描述Java垃圾回收机制 第一篇:说的比较多,但是不详细 http://www. ...

最新文章

  1. 点击按钮显示隐藏的表格
  2. oracle命令窗口粘贴,Oracle数据库中的Copy命令
  3. stm32串口传输数据第一个数据被吞_STM32串口第一个字节丢失问题的分析过程
  4. 靶场练习第十二天~vulnhub靶场之dc-4
  5. 利用自定义web-font实现数据防采集
  6. Web表单美化CSS框架Topcoat
  7. 大前端的自动化工厂(5)—— 基于Karma+Mocha+Chai的单元测试和接口测试
  8. php 赋值给 dom对象,详解PHP原生DOM对象操作XML的方法
  9. EXCEL破冰 - 如何为透视表组织数据
  10. 安卓网络连接全解:包括网络连接状态的监听、网络数据使用状态的监听、获取当前网络连接情况、启动wifi、获取当前连接wifi的网络情况、扫描wifi热点
  11. 什么是程序中的数字指纹
  12. 如何在 macOS Monterey 或更早版本中隐藏或显示 Dock 栏?
  13. python图书管理实训报告总结_图书管理系统设计实训报告
  14. python敏感词过滤代码简单_DFA敏感词过滤算法的python实现
  15. “对赌协议”—八大失败经典案例
  16. C - Copy (hdu)
  17. 小滴课堂-独孤求败-架构大课十八式-xiaoecf
  18. UVA 11572 唯一的雪花 Unique Snowflakes
  19. python 实现k折交叉验证
  20. 快速准确读取发票信息——发票扫描识别系统

热门文章

  1. php制作万年历的步骤_使用PHP制作一个万年历
  2. Java9 module特性 初识
  3. Java 9中--add-exports和--add-opens有什么区别?
  4. 过新版狗php一句话,整理的最新WebSHell (php过狗一句话,过狗菜刀,2016过狗一句话,2016php免杀一句话)...
  5. 阿里云备案服务码申请方法流程
  6. 「津津乐道播客」#363 津津有味:高端的食材往往需要大量的调味料
  7. 科研实习 | 加拿大Mila实验室唐建教授招收机器学习/生物医药方向科研实习生...
  8. mysql查询时间段内所有日期 和 小时
  9. PHP是计算机高级语音,高级语言包括哪些
  10. python 生孩子朋友圈_生孩子发朋友圈的开心的句子