java面试一日一题:java中垃圾回收算法有哪些
问题:请讲下在java中有哪些垃圾回收算法
分析:该问题主要考察对java中垃圾回收的算法以及使用场景
回答要点:
主要从以下几点去考虑,
1、GC回收算法有哪些
2、每种算法的使用场景
3、基于垃圾回收算法有哪些垃圾回收器
在《java面试一日一题:如何判断一个对象是否为垃圾对象》中知道了java中判断一个对象是否存活,是否可被回收使用的是可达性分析算法,找出了可回收的对象,那么有哪些回收算法可以回收这些对象那
复制算法
复制算法就是从一个地方复制到另外一个地方,针对垃圾回收来说,就是把活着的对象复制到另外一块内存区域,然后之前的内存区域中的对象便可以被回收。在同等大小内存前提下,复制算法的内存使用率比较低,因为它会把内存分为两个部分,如下图
复制算法-回收前

复制算法-回收后

标记-清除算法
标记-清除算法,首先是一个标记的过程,也就是标记出哪些对象是垃圾,然后进行清除操作。该算法不需要像复制算法似的,把内存分为两部分,它可以利用整块的内存,在内存利用率上是没有问题的,但是容易产生内存碎片,随着内存的回收,可能在内存中就不存在整块的大内存,在分配需要连续空间的大对象(数组)时就会发生OOM。如下图
标记清除-算法前

标记清除-算法后

从上图可以看到在使用标记-清除算法后,被标记为垃圾的对象被回收了,释放了内存空间,但是内存中存在了一个隔一个的空,也就是内存碎片,这时如果要分配一个连续的大空间,可能有无法找到空间的情况,发生OOM。
另外,使用标记-清除算法,在进行内存分配的时候采用的内存分配算法一定是空闲列表法。
标记-整理/压缩算法
标记-整理/压缩,是在标记清除的基础上加了一个内存整理的过程,是为了消除内存碎片的,如下图
标记-整理前

标记-整理后

从上图可以看出,使用标记整理算法后内存是规整的,解决了标记-清除算法中内存碎片的问题,但是多了一个内存整理的过程。
分代算法
分代算法,其实不能算是一个垃圾回收的算法,可以理解为一种垃圾回收的方案,即把内存分为不同的块也即代,每一块使用不同的垃圾回收算法。现代主流的垃圾回收器都是使用分代的思想,如下图

上图即是分代算法的示意图,把堆区分为新生代和老年代,新生代又分为Eden S0 S1;新生代使用复制算法,老年代使用标记-清除/标记-整理算法。
有不当之处,欢迎指正,谢谢

java面试一日一题:java中垃圾回收算法有哪些的更多相关文章
- java面试一日一题:java中的垃圾回收器
问题:请讲下java中垃圾回收器有哪些? 分析:该问题主要考察hotspot虚拟机下实现的垃圾回收器 回答要点: 主要从以下几点去考虑, 1.垃圾回收器的种类 2.每种垃圾回收器的着重点是什么 前边的 ...
- java面试一日一题:mysql中常用的存储引擎有哪些?
问题:请讲下mysql中常用的引擎有哪些? 分析:该问题主要考察对mysql存储引擎的理解,及区别是什么? 回答要点: 主要从以下几点去考虑, 1.mysql的存储引擎的基本概念? 2.mysql中常 ...
- java面试一日一题:讲下mysql中的undolog
问题:请讲下mysql中undo log的作用 分析:mysql中有很多日志,例,bin log undo log redo log,要弄清楚这些日志的作用,就要了解这些日志出现的背景及要解决的问题: ...
- java面试一日一题:讲下在什么情况下会发生类加载
问题:请讲下在什么情况下会发生类加载? 分析:该问题主要考察对java中类加载的知识,什么是类加载,为什么会发生类加载,什么情况下发生类加载? 回答要点: 主要从以下几点去考虑 1.什么是类加载: 2 ...
- java面试一日一题:再谈垃圾回收器中的串行、并行、并发
问题:请讲下java中垃圾回收器的串行.并行.并发 分析:该问题主要考察在垃圾回收过程中垃圾回收线程和用户线程的关系 回答要点: 主要从以下几点去考虑, 1.串行.并行.并发的概念 2.如何考虑串行. ...
- java面试一日一题:如何设计一款垃圾回收器
问题:如果让你设计一个垃圾回收器,你会考虑哪些问题 分析:该问题主要考察对java中垃圾回收器的理解,要理解怎么回收:一款好的垃圾回收器有哪些衡量指标 回答要点: 主要从以下几点去考虑, 1.垃圾回收 ...
- 牛客网Java刷题知识点之垃圾回收算法过程、哪些内存需要回收、被标记需要清除对象的自我救赎、对象将根据存活的时间被分为:年轻代、年老代(Old Generation)、永久代、垃圾回收器的分类
不多说,直接上干货! 首先,大家要搞清楚,java里的内存是怎么分配的.详细见 牛客网Java刷题知识点之内存的划分(寄存器.本地方法区.方法区.栈内存和堆内存) 哪些内存需要回收 其实,一般是对堆内 ...
- java面试官最爱问的垃圾回收机制,这位阿里P7大佬分析的属实到位
前言 JVM 内存模型一共包括三个部分: 堆 ( Java代码可及的 Java堆 和 JVM自身使用的方法区). 栈 ( 服务Java方法的虚拟机栈 和 服务Native方法的本地方法栈 ) 保证程序 ...
- Java虚拟机运行时数据区域及垃圾回收算法
程序计数器 记录正在执行的虚拟机字节码指令的地址(如果正在执行的是本地方法则为空). Java 虚拟机栈 每个 Java 方法在执行的同时会创建一个栈帧用于存储局部变量表.操作数栈.动态链接.方法出口 ...
随机推荐
- 使用 autofac 实现 asp .net core 的属性注入
使用 autofac 代替 asp .net core 默认的 IOC 容器,可实现属性注入. 之前的使用方式不受影响. 源码已开源: dotnet-campus/Autofac.Annotation ...
- 振兴中华(蓝桥杯13年第四届省赛真题 JAVA-B组)
思路:因为只能横向或纵向跳到相邻的格子里,所以到'华'字有两种方法:①从左边的中横向跳过来 ②从上边的中纵向跳过来 直接递推即可. 标题: 振兴中华 小明参加了学校的趣味运动会,其中的一个项目是:跳格 ...
- C 语言代码风格之 Linux 内核代码风格
GitHub: https://github.com/storagezhang Emai: debugzhang@163.com 华为云社区:https://bbs.huaweicloud.com/b ...
- cadence Virtuoso ADE原理图AnalogLib库中的switch使用
Symbol: switch A,B:等效于一个电阻; C,D:等效于控制开关(CD间的控制电压控制AB的断开或闭合); open switch resistance:开关断开状态下的等效电阻(AB之 ...
- 2. linux下如何上传和下载文件
一. 安装工具包 yum install -y lrzsz lrzsz是一个unix通信套件提供的X,Y,和ZModem文件传输协议,可以用在windows与linux 系统之间的文件传输,体积小速度 ...
- WinForm只运行运行一个实例(单开)
using System; using System.Diagnostics; using System.Runtime.InteropServices; using System.Windows.F ...
- Python 面像对象编程(上)
一: 对象的概念 "面向对象"的核心是"对象"二字,而对象的精髓在于"整合",什么意思? 所有的程序都是由"数据"与&q ...
- helm安装及使用
helm简介 官网文档:https://helm.sh/ helm是kubernetes的包管理器,类似于linux系统下的apt-get或yum 安装 wget https://get.helm.s ...
- EhCache缓存使用教程
文章发表在我的博客上:https://blog.ysboke.cn/archives/124.html 什么是ehcache 纯Java的进程内缓存,直接在JVM虚拟机中缓存,速度非常快.缓存有两级, ...
- Python容器数据类型之间的转换
强制转换成字符串 str() 将列表(list)转为字符串 var1 = [1, 2, 3, 4] var2 = str(var1) print(type(var2)) # <class 'st ...