面试:JVM垃圾回收

devtools/2024/9/24 14:23:16/

一、三种垃圾回收算法

1、标记清除(已废弃)

  • 找到根对象(局部变量正在引用的对象、静态变量正在引用的对象);
  • 沿着根对象的引用链,查看当前的对象是否被根对象所引用,若被引用,则加上标记;
  • 加标记的对象保留下来,其余的释放掉;

缺点:

  1. 会造成内存碎片问题;

因为未被引用的对象一般不连续,所以当需要一段连续的内存时,每一段内存都不够用;

2、标记整理(老年代)

  • 前三步和标记清除法一致;
  • 在清除后会将引用对象整理为一段连续的内存,从而避免了内存碎片的问题;

缺点:

  1. 效率较低:

因为有整理的操作,会有引用地址的重新计算内存复制

3、标记复制(新生代)

将存活的对象复制到新的内存空间中,将原来的内存直接删掉。

缺点:

  1. 占用了一份额外的内存;
  2. 当存活对象较多时,会复制很多次;

二、GC和分代回收算法

GC的目的在于实现无用对象内存自动释放,减少内存碎片、加快分配速度

  1. 回收区域是堆内存,不包括虚拟机栈,在方法调用结束会自动释放方法占用内存。
  2. 判断无用对象,使用可达性分析算法三色标记法标记存活对象,回收未标记对象
  3. GC具体的实现称为垃圾回收器
  4. GC大都采用了分代回收思想,理论依据是大部分对象朝生夕灭,用完立刻就可以回收,另有少部分对象会长时间存活,每次很难回收,根据这两类对象的特性将回收区域分为新生代和老年代,不同区域应用不同的回收策略。
  5. 根据GC的规模可以分成 Minor GCMixed GC,Full GC。

1、分代回收

  1. 伊甸园eden,最初对象都分配到这里,与幸存区合称新生代
  2. 幸存区survivor,当伊甸园内存不足,回收后的幸存对象到这里,分成 from和to,采用标记复制算法
  3. 老年代 old,当幸存区对象熬过几次回收(最多15次),晋升到老年代(幸存区内存不足或大对象会导致提前晋升)

2、GC规模

  • Minor GC发生在新生代的垃圾回收,暂停时间短
  • Mixed GC新生代+老年代部分区域的垃圾回收,G1收集器特有
  • Full GC新生代+老年代完整垃圾回收,暂停时间长,应尽力避免

三、三色标记与并发漏标问题

  • 黑色–已标记
  • 灰色–标记中
  • 白色–还未标记

1、lncremental Update

  • 只要赋值发生,被赋值的对象就会被记录(用户线程结束后,重新检查引用)

2、Snapshot At The Beginning,SATB

  • 新加对象会被记录(用户线程结束后,重新检查引用)
  • 被删除引用关系的对象也被记录

四、垃圾回收器


http://www.ppmy.cn/devtools/23738.html

相关文章

基于openwrt交叉编译opencv4.9.0版本

源码包的获取 源码获取有两种方式,一种是通过编译时在makefile指定它的git地址,在编译时下载,这种很依赖网速,网速不好时,编译会失败。另一种是我们将源码的压缩包下载到本地,放到我们的SDK中,…

[SpringBoot] JWT令牌——登录校验

JWT(JSON Web Token)是一种用于在网络应用之间传递信息的开放标准(RFC 7519)。它由三部分组成:头部(header)、载荷(payload)和签名(signature)。J…

Oracle中取出clob类型

1、Mybatis返回值用map接受,对应的value类型就是个clob类型,可以确保不会丢失长度,自带的sql执行器转varchar2的话可能会长度丢失。 2、将map放入工具类(clob类型转String) package com.ly.cloud.common.utils;import java.sql.Clob; impor…

JVM中的堆和栈

在Java虚拟机(JVM)中,堆(heap)和栈(stack)是两个重要的内存区域,分别用来存储不同类型的数据。 堆是用来存储对象的内存区域,所有的Java对象都在堆中分配内存。堆是一个动态的内存区域,它的大小可以在程序运行时动态调整。Java垃…

stack,queue的模拟实现以及优先级队列

这篇博客用来记录stack&#xff0c;queue的学习。 stack的模拟实现 stack的模拟实现比较简单&#xff0c;先上代码 #pragma once #include<vector> #include<list> #include<deque> #include<iostream> using std::deque; using namespace std;name…

CVE-2022-2602:unix_gc 错误释放 io_uring 注册的文件从而导致的 file UAF

前言 复现该漏洞只是为了学习相关知识&#xff0c;在这里仅仅做简单记录下 exp&#xff0c;关于漏洞的详细内容请参考其他文章&#xff0c;最后在 v5.18.19 内核版本上复现成功&#xff0c;v6.0.2 复现失败 漏洞利用 diff --git a/include/linux/skbuff.h b/include/linux/s…

银价大跌后 伦敦银的优势浅析

踏入2024年以来&#xff0c;国际贵金属价格出现了很强的涨势&#xff0c;除了美联储降息的原因之外&#xff0c;还有地缘局势引发的避险情绪的支撑。既然白银价格上涨这么厉害&#xff0c;那很多投资者都在寻求买入白银的机会。然而&#xff0c;这么多白银投资的渠道&#xff0…

多数元素——java

给定一个大小为 n 的数组 nums &#xff0c;返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 示例 1&#xff1a; 输入&#xff1a;nums [3,2,3] 输出&#xff1a;3 示例…