专栏首页艾编程JVM垃圾算法和GC三算法及面试题分享

JVM垃圾算法和GC三算法及面试题分享

本期课程的内容概要:熟悉JVM架构与GC垃圾回收机制以及相应的堆参调优,有过在linux进系统调优的经验。

一、JVM垃圾收集(Java Garbage Collection)

堆内存调优简介

二、GC三算法

1、 GC算法总体概述

JVM在进GC时,并每次都对上三个内存区域起回收的,部分时候回收的都是指新代。因此GC按照回收的区域分了两种类型,种是普通GC(MinorGC),种时全局GC(FullGC)

普通GC:只针对新代区域的GC

全局GC:针对年代的GC,偶尔伴随对新代的GC以及堆永久代的GC。

2、 复制算法:MinorGC(普通GC)

新代使的MinorGC,这种GC算法采的是复制算法(Copying),频繁使

复制-->清空-->互换

1 )原理

MinorGC会把Eden中的所有或的对象都移到Survivor区域中,如果Survivor区中放不下,那么剩下的活的对象就被移到Old Generation中,也即旦收集后,Eden区就变成空的了。

当对象在Eden(包括个Survivor区域,这假设是from区域)出后,在经过次MinorGC后,如果对象还存活,并且能够被另外块Survivor区域所容纳(上已经假设为from区域,这应为to区域,即to区域够的内存空间来存储Eden和from区域中存活的对象),则使复制算法将这些仍然还存活的对象复制到另外块Survivor区域(即to区)中,然后清理所有使过的Eden以及Survivor区域(即from区),并且讲这些对象的年龄设置为1,以后对象在Survivor区没熬过次MinorGC,就将对象的年龄+1,当对象的年龄达到某个值时(默认15,通过-XX:MaxTenuringThreshold 来设定参数),这些对象就会成为年代。

==-XX:MaxTenuringThreshold设置对象在新代中存活的次数==

2) 解释

HotSpot JVM把年轻代分为了三部分:1个Eden区和两个Survivor区,默认例是8:1:1,

般情况下,新创建的对象都会被分配到Eden区,这些对象经过第

次的MinorGC后,如果仍然存活,将会被移到Survivor区。对象Survivor区中每熬过

次MinorGC,年龄就增加岁,当他的年龄增加到定程度时,就会被移动到年代中。因为年轻代中的对象基本都是朝夕死(80%以上),所以在年轻代的垃圾回收算法使的是复制算法,复制算法的基本思想就是将内存分为两块,每次只其中块,当这块内存完就将活着的对象复制到另外块上。复制算法不会产内存碎。

==复制要交换,谁空谁是to==

3 )劣势

复制算法弥补了标记清除算法中,内存布局混乱的缺点。

1. 浪费了半的内存,太要命了

2. 如果对象的存活率很,我们可以极端点,假设是100%存活率,那么我们需要将所有对象都复制遍,并将所有引地址重置遍。复制这作所花费的时间,在对象存活率达到定程度是,将会变的不可忽视。所以从以上描述不难看出,复制算法想要使,最起码对象的存活率要常低才,且最重要的是,我们必须要客服50%的内存的浪费

3、 标记清除/标记整理算法:

FullGC叫MajorGC(全局GC)年代般是由标记清除或者是标记清除与标记整理的混合实现

1 )标记清除(Mark-Sweep)

原理

1. 标记(mark)从根集合开始扫描,对存活的对象进标记

2. 清除(Sweep)扫描整个内存空间,回收未被标记的对象,使free-list记录可以区域。

劣势

1. 效率低(递归与全堆对象遍历),且在进GC的时候,需要停应程序,这会导致户体验常差劲

2. 清理出来的空闲内存不是连续的,我们的死亡对象都是随机的出现在内存的各个落,限制把他们清除之后,内存的布局然会乱七糟,为了应付这点,JVM不得不维持个内存的空闲列表,这是种开销,且在分配数组对象的时候,寻找连续的内存空间会不太好找。

2) 标记整理(Mark-Compact)

1. 标记与标记-清除样

2. 压缩整理再次扫描,并往段滑动存活对象

效率不,不仅要标记所有存活对象,还要整理所有存活对象的引地址。从效率上说,效率要低于复制算法

4 、总结

内存效率:复制算法>标记清除算法>标记整理算法

内存整度:复制算法=标记整理算法>标记清除算法

内存利率:标记整理算法=标记清除算法>复制算法

分代收集算法

引计数法:

缺点:每次对对象赋值时均要维护引计数器,且计数器本身也有定的消耗较难处理循环引

三、GC试题

1 、StackOverFlowError和OutOfMemoryError,谈谈你的理解;

2、般什么时候会发GC?如何处理?

答:Java中的GC回有两种回收:年轻带的MinorGC,年代的FullGC;新对象创建时如果伊甸园空间不会触发MinorGC,如果此时年代的内存空间不会触发FullGC,如果空间都不抛出OutOfMemoryError。

3. GC回收策略,谈谈你的理解;

答:年轻代(伊甸园区+两个幸存区),GC回收策略为“复制”;年区的保存空间

般较,GC回收策略为“整理压缩”。

4. GC是什么;

答:频繁收集Young区,较少收集Old区,基本不动Perm区

5. JVM内存模型以及分区,需要详细到每个区放什么;

6. 堆的分区:Eden,suirival from to,年代,各特点;

7. GC的三种收集法:标记清除、标记整理、复制算法的原理特点;

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 艾编程arry老师课堂笔记:kubernetes K8S基于Docker安装部署

    在Docker容器技术被炒得热火朝天之时,大家发现,如果想要将Docker应用于具体的业务实现,是存在困难的——编排、管理和调度等各个方面,都不容易。于是,人们...

    艾编程
  • 艾编程Coding老师:MyBatisPlus自动化项目构建完整版(视频教程)

    艾编程
  • 艾编程教程:Linux 环境下 Nginx 安装

    yum -y install gcc automake autoconf libtool make

    艾编程
  • JVM GC知识回顾 1.分代收集2.分区收集

    当前主流VM垃圾收集都采用”分代收集”(Generational Collection)算法, 这种算法会根据对象存活周期的不同将内存划分为几块, 如JVM中的...

    mantou
  • 面试官,不要再问我“Java GC垃圾回收机制”了

    在上篇《JVM之内存结构详解》中有些内容我们没有讲,本篇结合垃圾回收机制来一起学习。还记得JVM中堆的结构图吗?

    沉默王二
  • 直击面试,聊聊 GC 机制

    GC 中文直译垃圾回收,是一种回收内存空间避免内存泄漏的机制。当 JVM 内存紧张,通过执行 GC 有效回收内存,转而分配给新对象从而实现内存的再利用。 JVM...

    andyxh
  • 面试官,不要再问我“Java GC垃圾回收机制”了

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    程序新视界
  • GC和垃圾回收器其一

    GC(Garbage Collection)垃圾回收,释放垃圾占用的空间,对堆中已经死亡或者长时间没有使用的对象进行清除和回收,防止内存泄漏。可以有效使用内存空...

    春哥大魔王
  • 深入理解Java中的Garbage Collection

    最近由于系统业务量比较大,从生产的GC日志(结合Pinpoint)来看,需要对部分系统进行GC调优。但是鉴于以往不是专门做这一块,但是一直都有零散的积累,这里做...

    Throwable
  • 深入理解 JVM 垃圾回收机制及其实现原理

    对于 JVM 来说,我们都不陌生,其是 Java Virtual Machine(Java 虚拟机)的缩写,它也是一个虚构出来的计算机,是通过在实际的计算机上仿...

    CG国斌

扫码关注云+社区

领取腾讯云代金券