Java面试之JVM GC算法_java gc面试题简书

createh53周前 (02-25)技术教程4

首先,Java垃圾回收是由虚拟机自动执行。在JVM中有一个垃圾回收线程,它是低优先级的,在正常情况下是不会执行的。只有在虚拟机空闲或者当前堆内存不足时,才会触发执行,扫面那些没有被任何引用的对象,并将它们添加到要回收的集合中,进行回收。

其次,从如何判定对象消亡的角度出发,垃圾收集算法可以划分为“引用计数式垃圾收集”(Reference Counting GC)和“追踪式垃圾收集”(Tracing GC)两大类,这两类也常被称作“直接垃圾收集”和“间接垃圾收集”。而当前商业虚拟机的垃圾收集器,大多数都遵循了“分代收集”的理论进行设计,所以多款常用的垃圾收集器的一致设计原则:收集器将Java堆(Heap)划分出不同的区域, 然后将回收对象依据其年龄(即对象熬过垃圾收集过程的次数)分配到不同的区域之中存储,垃圾收集器才可以每次回收其中一个或者某些部分的区域。因而才有了“Minor GC”“Major GC”“Full GC”这样的回收类型的划分。

Minor GC(也称为Young GC)指的是对新生代进行垃圾收集的过程,当新生代的内存空间不足时,会触发Minor GC。

Major GC(也称为Old GC)指的是对老年代进行垃圾收集的过程。当老年代的空间不足和对元空间进行垃圾收集时,会触发Major GC。

Full GC则指的是对整个堆进行垃圾收集的过程。Full GC的触发条件比较复杂,通常包括以下几种情况:

1.老年代空间不足。

2.元空间不足。

3.CMS GC时出现promotion failed,concurrent mode failure。

4.Minor GC晋升到老年代的平均大小大于老年代的剩余空间。

5.调用System.gc()。

6.使用RMI来进行RPC或管理的JDK应用,每小时执行一次Full GC。


由于当前虚拟机的垃圾收集器大多数都遵循了"分代收集"的理论进行设计。根据每代的特点选择合适的垃圾收集算法。

比如绝大多数对象都是朝生夕灭的新生代采用复制算法,其次是熬过越多次垃圾收集过程的对象就越难以消亡的老年代采用标记-清除或标记-整理算法。这种算法可以更好地满足不同对象的特点,提高垃圾收集效率。

1.标记-清除算法

分为"标记"和"清除"两个阶段,首先标记出所有需要回收的对象,在标记完成后,统一回收掉所有被标记的对象。

这种算法的缺点是会产生比较多的内存碎片,系统运行时间长了以后,无法再大量分配连续的内存空间,会导致更加频繁的GC。

2.标记-复制算法

简称为复制算法。为了解决标记-清除算法面对大量可回收对象时的效率问题。

它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。

当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉

这种算法的优点是可以避免内存碎片问题,但是实际使用的内存空间只有一半,比较浪费内存空间。

3.标记-整理算法

是针对老年代对象的存亡特征提出的一种算法。其中的标记过程仍然与"标记-清除"一样,

但后续步骤不是直接对可回收对象进行清理。而是让所有存活的对象都向内存空间一端移动,然后直接清理掉边界以外的内存。

这种算法的优点是可以避免内存碎片问题,但是需要移动存活对象,而且这种对象移动操作必须全程暂停用户应用程序才能进行,所以耗费时间较长。

相关文章

JAVA系列-GC_java &gt

1. OOM1) 常见OOM异常类型(1) StackOverFlowError栈内存溢出,用于深度方法调用(循环递归);(2) OutOfMemoryError:Java heap space用于变...

大佬带你深入解析java虚拟机:垃圾优先的垃圾回收器(G1 GC)

G1 GCG1 GC是面向服务端应用程序的垃圾回收器,通过新的堆设计和停顿预测模型,可以到达用户指定的一个比较合理的软实时目标。本章将详细分析G1 GC的设计和实现。G1 GC简介 基于Region的...

漫谈:Java GC的那些事(一)_java gc1

前言与C语言不同,Java内存(堆内存)的分配与回收由JVM垃圾收集器自动完成,这个特性深受大家欢迎,能够帮助程序员更好的编写代码,本文以HotSpot虚拟机为例,说一说Java GC的那些事。Jav...

JVM成神路之性能调优篇:GC调优、Arthas工具详解及线上最佳配置

引言“在当前的互联网开发模式下,系统访问量日涨、并发暴增、线上瓶颈等各种性能问题纷涌而至,性能优化成为了现时代开发过程中炙手可热的名词,无论是在开发、面试过程中,性能优化都是一个常谈常新的话题”。Ja...

Java中9种常见的CMS GC问题分析与解决(一)

目前,互联网上 Java 的 GC 资料要么是主要讲解理论,要么就是针对单一场景的 GC 问题进行了剖析,对整个体系总结的资料少之又少。前车之鉴,后事之师,美团的几位工程师历时一年多的时间,搜集了内部...

关于Java垃圾回收,你必须要知道FullGC是什么

本文共3198字,是本人前几天面试被提问到的一个问题,将在该文中阐述关于Java垃圾回收——Full GC的相关知识,包括定义、触发条件、具体过程。前几天面试的时候,面试官在最后问了我一个有关Full...