『面试必问JVM系列』垃圾回收器与内存分配策略

【Java面试整理之JVM】深入理解JVM结构、类加载机制、垃圾回收GC原理、JVM内存分配策略、JVM内存泄露和溢出 一、前言最近要准备找工作,JVM肯定是跑不掉的面试内容,所以把JVM相关的内容拿来认真学习一遍,整理成自己能够快速消化的提纲,方便随时可以调用。主要分JVM结构、类加载机制、垃圾回收GC原理、JVM内存分配策略 四个方面展开。二、JVM结构JVM的内部结构直接贴图: 各部分的主要功能: 类加载器 JVM启动,程序开始执行时,负责将class字节码加载到JVM内存区域中 执行引擎 负责 阅读详情

垃圾回收器与内存分配策略

相关视频教程(来自动力节点):https://www.bilibili.com/video/BV1e64y197rh

相关资料下载:http://www.bjpowernode.com/?csdn

1. 概述

程序计数器、虚拟机栈、本地方法栈 3 个区域随线程生灭(因为是线程私有),栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作。而 Java 堆和方法区则不一样,一个接口中的多个实现类需要的内存可能不一样,一个方法中的多个分支需要的内存也可能不一样,我们只有在程序处于运行期才知道那些对象会创建,这部分内存的分配和回收都是动态的,垃圾回收期所关注的就是这部分内存。

2. 对象已死吗?

在进行内存回收之前要做的事情就是判断那些对象是‘死’的,哪些是‘活’的。

2.1 引用计数法

给对象添加一个引用计数器。但是难以解决循环引用问题。

从图中可以看出,如果不下小心直接把 Obj1-reference 和 Obj2-reference 置 null。则在 Java 堆当中的两块内存依然保持着互相引用无法回收。

2.2 可达性分析法

通过一系列的 ‘GC Roots’ 的对象作为起始点,从这些节点出发所走过的路径称为引用链。当一个对象到 GC Roots 没有任何引用链相连的时候说明对象不可用。

可作为 GC Roots 的对象:

  • 虚拟机栈(栈帧中的本地变量表)中引用的对象
  • 方法区中类静态属性引用的对象
  • 方法区中常量引用的对象
  • 本地方法栈中 JNI(即一般说的 Native 方法) 引用的对象

2.3 再谈引用

前面的两种方式判断存活时都与‘引用’有关。但是 JDK 1.2 之后,引用概念进行了扩充,下面具体介绍。

下面四种引用强度一次逐渐减弱

  1. 强引用:类似于 Object obj = new Object(); 创建的,只要强引用在就不回收。
  2. 软引用:SoftReference 类实现软引用。在系统要发生内存溢出异常之前,将会把这些对象列进回收范围之中进行二次回收。
  3. 弱引用:WeakReference 类实现弱引用。对象只能生存到下一次垃圾收集之前。在垃圾收集器工作时,无论内存是否足够都会回收掉只被弱引用关联的对象。
  4. 虚引用:PhantomReference 类实现虚引用。无法通过虚引用获取一个对象的实例,为一个对象设置虚引用关联的唯一目的就是能在这个对象被收集器回收时收到一个系统通知。

2.4 生存还是死亡

即使在可达性分析算法中不可达的对象,也并非是“facebook”的,这时候它们暂时出于“缓刑”阶段,一个对象的真正死亡至少要经历两次标记过程:如果对象在进行中可达性分析后发现没有与 GC Roots 相连接的引用链,那他将会被第一次标记并且进行一次筛选,筛选条件是此对象是否有必要执行 finalize() 方法。当对象没有覆盖 finalize() 方法,或者 finalize() 方法已经被虚拟机调用过,虚拟机将这两种情况都视为“没有必要执行”。

如果这个对象被判定为有必要执行 finalize() 方法,那么这个对象竟会放置在一个叫做 F-Queue 的队列中,并在稍后由一个由虚拟机自动建立的、低优先级的 Finalizer 线程去执行它。这里所谓的“执行”是指虚拟机会出发这个方法,并不承诺或等待他运行结束。finalize() 方法是对象逃脱死亡命运的最后一次机会,稍后 GC 将对 F-Queue 中的对象进行第二次小规模的标记,如果对象要在 finalize() 中成功拯救自己 —— 只要重新与引用链上的任何一个对象简历关联即可。

finalize() 方法只会被系统自动调用一次。

2.5 回收方法区

在堆中,尤其是在新生代中,一次垃圾回收一般可以回收 70% ~ 95% 的空间,而永久代的垃圾收集效率远低于此。

永久代垃圾回收主要两部分内容:废弃的常量和无用的类。

  • 判断废弃常量:一般是判断没有该常量的引用。
  • 判断无用的类:要以下三个条件都满足
  1. 该类所有的实例都已经回收,也就是 Java 堆中不存在该类的任何实例
  2. 加载该类的 ClassLoader 已经被回收
  3. 该类对应的 java.lang.Class 对象没有任何地方呗引用,无法在任何地方通过反射访问该类的方法
关于JVM虚拟机调优的20道高级面试题 JVM内存模型是Java虚拟机在执行Java程序时,对内存进行逻辑划分的一种抽象模型。程序计数器:每个线程都有一个独立的程序计数器,用于存储下一条要执行的指令的地址。这样当线程恢复执行时,可以知道从哪里开始执行。虚拟机栈:每个线程也有一个私有的虚拟机栈,用于存储局部变量、操作数栈、动态链接和方法出口等信息。这个栈在方法调用和返回时扮演着重要角色。本地方法栈:与虚拟机栈类似,本地方法栈主要用于支持本地方法的调用。堆:堆是JVM内存模型中最大的一块内存区域,主要用于存储对象实例。 阅读详情

相关推荐

JVM与垃圾回收面试总结

1. JVM垃圾回收机制与实现 堆:所有的对象实例与数组,GC堆,分为新生代与老年代 栈:栈帧包含局部变量表(基本数据类型 8种、对象引用类型)、操作数栈、动态链接、方法出口 方法区:类信息、常量、静态变量、即时编译器编译后的代码等数据,也成为永久代 一般说栈指的是 虚拟机栈,或者说是虚拟机栈中的局部变量表 TLAB:本地线程分配缓冲,线程分配内存,现用TLAB分配,用完重新分配新的TL...

Vtamins的博客 2944

JVM内存分配策略--内存分配

Java技术体系中的自动内存管理解决了两个问题:给对象分配内存以及回收分配给对象的内存。 关于回收内存,之前的文章提到了对象已死吗(对象存活判定算法、回收方法区)和垃圾收集算法。 对象的内存分配,往大方向讲,就是在堆上分配(但也可能经过JIT编译后被拆散为标量类型并间接地栈上分配),对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓存,将按线程优先在TLAB上分配。少数情况有可能会直...

z止于至善的博客 290

一堵隔墙砌在哪:NewRatio的真实语义、收集器差异与按存活曲线定容新生代解析

NewRatio是老年代与新生代之比,新生代等于堆除以NewRatio加一,只能取整数。本文结合JDK8与17源码和实测说明:-Xmn优先于它;CMS未显式设置时按GC线程数定容,4核4GB堆仅给332.8MB;G1显式设置会关闭停顿目标伸缩;ZGC不读取它。文章把蓄水池模型补成可计算的账:Young GC间隔取决于Eden与分配速率,晋升量取决于存活曲线与Survivor,老年代须容纳常驻数据并留出最坏晋升余量。实验显示Parallel最优点紧贴连环Full GC悬崖,CMS则平缓地下降。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 15万+

字节跳动二面面试官问:JVM垃圾回收器和回收算法,我全靠这个逆天改命!

垃圾回收器与内存分配策略 垃圾回收器与垃圾回收算法 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录垃圾回收器与内存分配策略前言一、如何判断对象已"死"(重点)1.1 引用计数法1.2可达性分析算法二.回收方法区(重点)三.垃圾回收算法(重点)3.1 标记-清除算法3.2复制算法(新生代回收算法)3.3标记-整理算法(老年代回收算法)3.4分代收集算法四.垃圾收集器4.1Serial收集器(新生代收集器,串行GC)4.2ParNew收集器(新生代收集器,并行GC)4.3Paral

ILOVEMYDEAR的博客 3552

从Elasticsearch的jvm.options读懂JVM参数的生效核验、内存分账与诊断兜底

写进配置的JVM参数不一定生效,生效的参数也未必适合你的场景。本文以Elasticsearch的jvm.options为样板,结合JDK 8与JDK 17的可复现实验,先讲如何用PrintFlagsFinal、jcmd与进程内自检核实参数终值和来源,再讲堆怎么分:存储型服务把一半内存留给页缓存,堆不越过约31GB的压缩指针边界;计算型服务先用NMT量出堆外再定堆。随后梳理分代比例与晋升阈值、GC日志新旧写法、堆转储与OOM退出、异常栈保留及CMS到G1、ZGC的演进,最后给出模板与核验清单。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 10万+

【JVM】垃圾回收器

1.概述 下图是10种垃圾回收器,左边的是分代垃圾回收,右边是 不分代的垃圾回收。 JDK 1.8 建议直接用G1,前面的不考虑了 垃圾回收器的发展路线,是随着内存越来越大的过程而演进 从分代算法演化到不分代算法 Serial算法几十兆 Parallel算法几个G CMS几十个G -承上启下,开始并发回收 所以 内存用的越多,越不能使用前面的。 2.分代 分代eden区采用什么算法呢?这里需要反向思维,因为eden的对象是朝生夕灭的对象(比如for循环你一直new对象,出了这个for循环就没用了),.

九师兄 504

2020年阿里实习面试,JVM面试都问了什么?(附答案解析)

本文分享给需要面试刷题的朋友,也祝愿大家顺利拿到自己想要的offer,这份资料主要包含了Java基础,数据结构,jvm,多线程等等,由于篇幅有限,以下只展示小部分面试题,有需要完整版的朋友可以点一点链接跳转领取:链接:点击即可!!!暗号:优快云 一. Java 类加载过程? Java 类加载需要经历一下 7 个过程: 1. 加载 加载是类加载的第一个过程,在这个阶段,将完成一下三件事情: • 通过一个类的全限定名获取该类的二进制流。 • 将该二进制流中的静态存储结构转化为方法去运行时数据结构。 • .

a646705816的博客 2万+

Java虚拟机(JVM)面试(2022版)

序列号 内容 链接 1 Java基础知识面试题(2022版) https://blog.youkuaiyun.com/qq_43061290/article/details/124023797 2 Java集合容器面试题(2022版) https://editor.youkuaiyun.com/md?spm=1001.2101.3001.5352&articleId=124043363 3 Java异常面试题(2022版) 待续… 4 并发编程面试题 (2022版) 待续… 5 JVM面试题....

拉格朗日的学习笔记 7768

【Java八股面试系列】JVM-垃圾回收

讲解了Jvm关于对象判活算法,垃圾回收算法以及引用的类型

asdfasaa的博客 2322

单细胞RNA测序数据分析与可视化:从基础原理到高级应用

单细胞RNA测序(scRNA-seq)技术通过解析单个细胞的基因表达谱,显著提升了我们对细胞异质性的理解。本文详细介绍了scRNA-seq数据分析的完整流程,包括数据预处理、质量控制、降维、聚类、差异表达分析、细胞类型注释、细胞周期分析、轨迹分析、RNA速率分析、基因集富集分析、细胞通讯分析、批次效应校正以及空间转录组学整合。文章还展示了scrna_toolkit包在简化分析流程和增强数据可视化方面的应用。通过这一工具,研究者可以更高效地处理单细胞数据,揭示复杂的生物学信息。未来,该工具将进一步整合多组学分

2301_80338712的博客 4136

构建面向嵌入式Linux的ARM64交叉编译工具链:从sysroot配置到CMake实战

本文详细介绍了如何构建面向嵌入式Linux的ARM64交叉编译工具链,从sysroot配置到CMake实战。通过分步指导,帮助开发者解决架构不一致问题,提升编译效率,特别适用于树莓派等ARM64设备开发。文章涵盖sysroot机制、环境搭建、CMake配置及常见问题解决方案,是嵌入式开发的实用指南。

weixin_42537142的博客 200

Shenandoah JVM垃圾回收器详解

Shenandoah,作为Oracle公司于2018年推出的一款新型垃圾回收器,旨在解决传统垃圾回收器在低延迟和高吞吐量场景下的性能瓶颈。它通过将垃圾回收过程与应用程序的执行过程分离,实现了并发垃圾回收,显著降低了垃圾回收对应用程序性能的影响。

我是Java程序员廖志伟,感谢朋友们的支持!不定期贡献一篇高品质、过万文字、图文并茂且附有视频解说、满载代码示例注释的良心之作,坚决杜绝粗制乱造。 901

【论文精度】生成式预训练模型——BART(Bidirectional and Auto-Regressive Transformers)

​ BART是一个预训练的seq2seq的去噪自编码(denoising autoencoder)模型,BART以下方式进行训练①用任意的噪声函数(noising function)去破坏文本;②学习一个模型来重建原始文本。它使用一个标准的基于transformer的神经机器翻译架构,可以看作是BERT(双向编码器)、GPT(left-to-right解码器)以及其他预训练方案的推广。

weixin_45828972的博客 7450

面试之JVM垃圾回收

可达性分析法就是目前的主流算法,也是java正在使用的算法。它的做法是,通过一系列被称为“GC Roots”的对象作为起点,从这些起点开始往下搜索,搜索所走过的路径称为引用链(Reference Chain)。当一个对象没有和任何引用链相连,即称为该对象不可达(图论的说法),认为该对象死亡。来看下面这张图:上图中A、B、C都跟GC Roots有直接或间接的引用关系,所以是存活对象。而D、E、F虽然相互之间有引用,但是和GC Roots并无引用关系,所以是死亡对象。

NBlinge的博客 1674

最新版谷歌浏览器Axure插件(免翻墙)

本文介绍了在Chrome浏览器无法直接打开Axure导出HTML文件的解决方法。由于国内网络限制无法访问Chrome商店,需手动下载安装AxureRP扩展插件(提供百度网盘下载链接)。安装步骤包括:1)启用开发者模式;2)拖拽CRX文件或加载解压文件夹;3)勾选"允许访问文件网址"。同时还提示若浏览器版本过低可能无法正常运行,并给出了浏览器升级方法。该教程详细说明了从插件安装到浏览器升级的完整解决方案。

OldCat先生 2979

【嵌入式Linux】EC20模块多运营商自适应PPP拨号实战:从IMSI识别到网络配置

本文详细介绍了在嵌入式Linux系统中,如何基于EC20 4G模块实现多运营商自适应PPP拨号。通过解析SIM卡的IMSI识别运营商,并动态配置对应的APN和拨号参数,结合AT指令交互与健壮的pppd脚本,解决了设备跨地域部署时的网络自动连接问题,提升了物联网设备的部署效率和稳定性。

fox11的博客 904

最全JVM面试题

文章目录1.说一下 JVM 的主要组成部分及组成部分的作用?2.说一下 JVM 的作用?3.深拷贝和浅拷贝4.说一下堆栈的区别?5.队列和栈是什么?有什么区别? 1.说一下 JVM 的主要组成部分及组成部分的作用? 方法区和堆是所有线程共享的内存区域;而java栈、本地方法栈和程序员计数器是运行是线程私有的内存区域,运行时数据区域就是我们常说的JVM的内存。 类加载子系统:根据给定的全限定名类名(如:java.lang.Object)来装载class文件到运行时数据区中的方法区中。 Java堆

weixin_45081813的博客 1万+

uniapp [安卓苹果App端] - 详细实现下载文件保存到用户手机本地,指定文件存储位置路径及文件夹名称下载并保存,Uniapp app端将文件下载保存并储存到指定目录(手机系统存储空间权限检测)

uni-app,安卓Android,苹果ios,安卓app端,苹果App端,uniapp苹果安卓app,app端下载文件,移动端文件下载,并保存到手机本地存储空间,uniapp下载文件保存到手机本地,iOS下载文件怎么保存,系统读写存储空间权限,下载文件到本地详细流程及源代码,保存自定义目录,uniapp,实现下载文件并保存到本地,文件后缀,如何指定手机的存放目录路径url,点击下载文档到手机中并提示存储位置,如何在uniapp中实现文件下载功能,uniApp文件下载,怎么指定文件保存目录,下载报错,没反应

🏆 前端领域优质创作者 1万+

面试八股之JVM篇3.5——垃圾回收——G1垃圾回收器

详细讲解了G1垃圾回收器的工作原理

做一个善良的人,做好自己的事,如果愿意,再发一份光。 1075

使用 MATLAB/Simulink + Simscape Electrical + Simulink Design Optimization,构建一个沙漠环境中光伏组件灰尘积累与效率下降仿真模型

本文通过,构建了沙漠环境中光伏组件灰尘积累与效率下降仿真模型✅ 建立了风速-沙尘-积尘速率的物理关系✅ 仿真了灰尘积累过程及其对Isc 和 Pmax的影响✅ 量化分析了不同清洁策略的经济性✅ 提出了优化设计与智能运维建议。

xiaoheshang_123的博客 124

【个人学习总结】CRC校验原理及实现

CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。 ..................

星Yeah 的博客 7968

JVM CMS垃圾回收器深度解析

在当今的软件开发领域,Java虚拟机(JVM)作为Java应用程序的运行环境,其性能和稳定性直接影响到应用的响应速度和用户体验。特别是在处理大量数据和高并发场景下,JVM的性能优化显得尤为重要。其中,CMS(Concurrent Mark Sweep)垃圾回收器作为JVM中的一种高效并发垃圾回收策略,其重要性不言而喻。想象一下,在一个大型电子商务平台上,每天有成千上万的用户进行购物、浏览商品等活动,这些操作会产生大量的临时对象。如果这些对象不能被及时回收,将会导致内存占用不断增加,最终可能引发系统崩溃。

我是Java程序员廖志伟,感谢朋友们的支持!不定期贡献一篇高品质、过万文字、图文并茂且附有视频解说、满载代码示例注释的良心之作,坚决杜绝粗制乱造。 499

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

JVM:垃圾回收器和内存分配策略

垃圾收集器与内存分配策略 为什么要了解GC和内存分配策略 1、面试需要 2、GC对应用的性能是有影响的; 3、写代码有好处 判断对象的存活 引用计数法:快,方便,实现简单,缺点:对象相互引用时,很难判断对象是否改回收。 可达性分析 (面试时重要的知识点,牢记) 来判定对象是否存活的。这个算法的基本思路就是通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径...

qq_37796743的博客 264

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

JVM垃圾回收算法与垃圾回收器

文章目录垃圾回收算法与垃圾回收器判断对象的存活各种引用强引用软引用(SoftReference)弱引用(WeakReference)虚引用(PhantomReference)GC垃圾回收算法垃圾回收器分代收集各种垃圾回收器垃圾回收器的重要参数(使用-XX:) 垃圾回收算法与垃圾回收器 学习垃圾回收的意义 1 面试需要; 2 GC对应用的性能是有影响的; 3 写代码有好处 栈:栈中的生命周期是...

DRB321的博客 417

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【JVM和性能优化】2.垃圾回收器和内存分配策略

文章目录参考 参考

sowhat 2320
上一篇: 『面试必问JVM系列』HotSpot 虚拟机对象探秘
下一篇: 『面试必问JVM系列』JVM的四种垃圾回收算法详解
Java___interview
博客等级 码龄6年 154粉丝 109原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值