是个面试官都会问的问题--讲一讲java的GC

五面阿里,终拿offer,就是不明白为什么面试官总喜欢问这种问题 本文转载自:五面阿里,终拿offer,就是不明白为什么面试官总喜欢问这种问题 一面 一面就做了一道算法题,要求两小时内完成,给了长度为N的有重复元素的数组,要求输出第10大的数。典型的TopK问题,快排算法搞定。 算法题要注意的是合法性校验、边界条件以及异常的处理。另外,如果要写测试用例,一定要保证测试覆盖场景尽可能全。加上平时刷刷算法题,这种考核应该没问题的。 二面 自我介绍下呗 开源项目贡... 阅读详情

Java的垃圾回收主要是考虑三件事情

  • 那些内存需要回收
  • 什么时候进行回收
  • 如何回收

首先说一下哪些内存进行回收(回收谁)

判断哪些内存需要回收,主要是判断哪些对象还活着,那些对象已经死了。判断对象的死亡主要有两种方法,一种是引用计数法,一种是可达性分析。

引用计数法

引用计数法的判定非常的简单,在对象中添加一个引用计数器,每当有一个地方引用它时,计数器的值就增加1;当引用失效时,引用计数器的值就减一。计数器的值为0就表示对象已经死了。这种算法有一个非常大的问题,就是很那解决循环引用的问题。假如有两个对象A和B,A对象引用B对象,B对象引用A对象。如果AB没有任何别的引用了,那么其实AB本身是可以进行回收的了,他们已经不可以被访问了。但是他们的引用计数这时候还是1.

可达性分析

因为引用计数法有上面的问题,所以现在主流的实现都是使用可行性分析来确认哪些内存要进行回收。可达性分析算法的主要思想是通过一系列成为“GC root”的对象作为起始点来进行搜索,如果对象对于root不可达,也就是没有引用链相连的话,就证明对象是不可用的。
GC Root的对象主要包括:

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

然后是垃圾回收的方法(怎么回收)

主要是一些垃圾回收算法

标记-清除(Mark-sweep)算法

也是最基础的垃圾收集算法,标记清除算法主要分为两个步骤,就是标记和清除。标记是就是标记处所有要回收的对象,清除就是清楚掉之前标记的对象。
这个算法有一些缺点,首先是标记算法和清除算法的效率都不高,然后就是会产生碎片,感觉有点像操作系统内存分配的首次适应算法,缺点是会产生大量的碎片,运行一段时间之后可能大内存就没有足够大的连续空间可以分配了。

复制(copying)算法

复制算法把内存分为大小相等的两块,每次只使用其中的一块,当着一块内存用完时,就把这块中的对象复制到另一块上去,然后把已使用过的空间一次清理掉。(分配担保机制也可以说一下)

标记-清理(Mark-Compact)

复制收集算法在对象存活率高的时候要进行大量复制操作,效率是非常低的。所以一般的老年代的回收不会使用这种算法。根据老年代对象存活率高的特点,有人提出了标记整理算法,标记的时候和标记清除算法一样,但是后面不直接清理标记的对象,而是让存活的对象都向一端移动,然后直接清理掉边界以外的内存。

分代收集算法(Generation Collection)

现在商业虚拟机的垃圾收集都使用分代收集算法。分代收集算法和前面几种不能算作是一种独立的垃圾收集算法,而是一种根据对象存活周期的不同把对象分代来进行收集,一般是分为新生代与老年代。新生代中的对象存活率低,老年代的对象存活率高。根据这个特点来对新生代与老年代使用不同的垃圾收集算法进行收集。一般来说,新生代中的对象存活率比较低使用复制算法比较合适。老年代存活率高,比较适合使用标记清理法或者标记整理法。

最后是主流的垃圾收集器

现在比较主流的垃圾收集器是CMS收集器和G1收集器

CMS(Concurrent Mark Sweep)收集器

CMS收集器的目标是收集的停顿时间最短,停顿时间就是垃圾收集线程执行的时候要占用cpu资源造成用户程序执行上的停顿。
CMS收集器是基于标记清除算法实现的,他的主要步骤有四步:

  • 初始标记(只标记GC Root直接关联的对象)
  • 并发标记(可达性分析,找出存活的对象)
  • 重新标记(并发标记时时变动的部分)
  • 并发清除

整个过程中最耗费时间的是并发标记和并发清除的过程,在CMS收集器的垃圾清理过程中,整两个操作是和用户线程并发执行的。
但是CMS也有一些缺点,首先是对CPU的要求会比较高。垃圾收集的时候会造成程序响应变慢。然后就是不能收集浮动垃圾,浮动垃圾就是因为CMS
的垃圾回收是并发的(主要是并发清理的过程,重新标记时停止了并发清理),在垃圾回收的过程中可能会产生新的垃圾。还有就是标记清理算法的碎片问题

G1收集器

使用G1收集器的时候,Java堆的内存布局就和其他的收集器有很大的差别,G1将Java堆分为很多的Region,虽然还存在着老年代与新生代的概念,但是它们都是一部分Region的合集。
而且G1收集器的时间停顿是可以预测的(使用者可以指定M秒的时间段内消耗在垃圾收集上的时间少于N秒),可以有计划的避免在Java堆中进行全区域的垃圾收集。G1跟踪各个Region中垃圾堆的价值的大小和回收的代价,在后台维护一个优先列表,每次根据允许的收集时间,优先来回收价值最大的Region。这种方法可以有很高的垃圾回收效率。
主要步骤有:

  • 初始标记(仅标记与GC Root直接关联的对象)
  • 并发标记(可达性分析,标记活着的对象)
  • 最终标记(修正并发标记时用户线程继续执行产生变动的部分)虚拟机将这段时间对象变化记录在线程Remembered Set Logs里面,最终标记只要将其数据合并到Remember Set中。(这阶段需要线程停顿,但是可以并行执行)
  • 筛选回收(筛选回收就是维护前面说的那个优先队列,然后根据用户期望的GC停顿时间来进行回收计划)

内存分配与回收策略(什么时候回收)

对象优先在Eden区分配

对象有现在新生代Eden区分配,如果Eden区没有足够的空间进行分配时,虚拟机将发起一次Minor GC
-XX:SurvivorRatio = 8 决定新生代中Eden与Survivor的比例

大对象直接进入老年代

大对象是指需要大量连续空间的Java对象(很长的字符串,数组),大对象直接分配到老年代的目的是避免在Eden区和Survivor区之间大量复制内存(新生代采用复制算法收集内存)
经常出现大对象容易导致内存还很多的时候就提前触发GC来放置这些大对象。
-XX:PretensureSizeThreshold参数,大于参数值得直接分配到老年代。

长期存活的对象进入老年代

虚拟机会给每个对象定义一个对象年龄计数器,如果对象在Eden出生并经过一次Minor GC后仍然存活,如果Survivor空间还够的话,就移动到Survivor空间,以后每经过一次Minor Gc年龄就加一,年龄大于一定程度(默认15),就会晋升到老年代。
-XX:MaxTenuringThreshold=15 来设置晋升的阈值

动态对象年龄判定

如果在Survivor空间中相同年龄所有对象大小总和超过Survivor空间的一半,年龄大于等于该年龄的对象就直接进入老你那嗲,不需要等到MaxTenuringThreshold阈值的年龄

分配担保机制

在发生Minor GC之前,虚拟机会检查老年代最大可用连续空间是否大于新生代所有对象的总空间,大的话可以保证安全,因为就算所有都进老年代也能容纳。老年代没有新生代可用空间大的话,虚拟机查看HandlePromotionFailure设置值是否允许担保失败。如果允许,继续检查老年代最大可用连续空间是否大于历次晋升到老年代对象的平均大小,大的话就执行一次Minor GC,尽管这次Minor GC是有风险的;如果小于,或者HandlePromotionFailure设置不允许冒险,就要改为进行一次FullGC。
冒险冒的什么风险? 新生代使用复制算法,但是为了内存利用率,只使用其中一个Survivor空间作为轮换备份。因此在MinorGC之后仍有大量对象存活,就要老年代进行分配担保,把Survivor无法容纳的对象直接进入老年代。

STM32L452与FPGA通信翻车?手把手教你关闭I2C时钟延展避坑(附OVR错误解决方案) 本文深入解析STM32L452与FPGA在I2C通信中因时钟延展功能导致的常见问题,提供关闭I2C时钟延展的详细配置方法(NOSTRETCH模式),并针对可能出现的OVR错误给出Combined模式解决方案。通过实战案例和波形分析,帮助工程师快速排查和解决嵌入式系统中的I2C兼容性问题。 阅读详情

相关推荐

Win11系统下Notepad++右键菜单失效?3种修复方法实测有效(附注册表备份指南)

本文针对Windows 11系统中Notepad++右键菜单失效的常见问题,提供了三种经过实测有效的修复方法。核心解决方案包括使用官方NppShell.dll重新注册、手动修复注册表项以及系统级问题排查,并详细说明了操作前的注册表备份指南,确保修复过程安全可靠。

m2n3b4v5c6的博客 328

Java面试题:GC垃圾回收机制

在程序运行中会不断地创建对象,这些对象数据会占用系统内存,如果得不到有效的管理和释放会导致内存的占用越来越多,这个时候就要用到GC垃圾回收机制。

霁晨晨晨的博客 3万+

【Java】JAVA知识总结浅析

Java是一门功能强大的编程语言,广泛应用于多个领域。Java的编程思想,包括面向过程和面向对象编程,Java的发展历史,各版本的特点,JVM原理,数据类型,Java SE与Java EE的区别,应用场景,JDK与JDBC,Java Web技术,Spring Boot系列,以及MyBatis框架的基本实现,最后还将讨论Java在大数据、人工智能、嵌入式和Android等领域的应用。

wnm23的专栏 5216

JVM及GC机制,java开发面试常见问题

针对最近很多人都在面试,我这边也整理了相当多的面试专题资料,也有其他大厂的面经。希望可以帮助到大家。最新整理面试题上述的面试题答案都整理成文档笔记。也还整理了一些面试资料&最新2021收集的一些大厂的面试真题最新整理电子书最新整理大厂面试文档以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。资料,也有其他大厂的面经。希望可以帮助到大家。最新整理面试题[外链图片转存中…(img-39W32o5K-1710697050991)]上述的面试题答案都整理成文档笔记。

m0_60607371的博客 477

分析攻击流量样本

利用wireshark分析.pcap攻击样本的攻击流程,利用漏洞等。

一段旅途 6842

SAP 银企直连实战:从零构建 DMEEX 格式树的配置与调试指南

本文详细介绍了SAP银企直连中DMEEX格式树的配置与调试方法,涵盖从基础认知到实战技巧的全流程。通过具体案例解析,帮助财务顾问快速掌握建设银行付款报文的格式树搭建、字段映射及调试优化,提升企业支付效率与准确性。

weixin_42526015的博客 566

Java JVM “垃圾回收(GC)”面试清单(含超通俗生活案例与深度理解)

一、如何判断对象仍然存活?判断对象存活有两种核心算法:引用计数算法和可达性分析算法,主流JVM(如HotSpot)因引用计数算法存在缺陷,最终采用可达性分析算法。• 引用计数算法:给每个对象贴一张“借阅记录卡”,只要有代码用到这个对象(比如调用对象方法),就在卡片上记一次借阅(计数+1);当代码不再使用(引用失效,比如变量赋值为null),就划掉一次借阅(计数-1)。一旦卡片上的借阅次数清零,就说明这个对象没人用了,可以回收。比如图书馆的闲置书籍,每有读者借阅就登记一次,读者归还就注销一次,登记次数为零的书

2401_89363342的博客 850

FPGA实战:从零构建eMMC控制器(Verilog篇)

本文详细介绍了如何使用Verilog从零构建FPGA上的eMMC控制器,涵盖eMMC接口基础、命令系统解析、关键模块设计及性能优化技巧。通过实战案例,帮助开发者掌握高速数据存储解决方案,提升嵌入式系统开发能力。

weixin_26802933的博客 297

Java面试必考:GC、多态与反射全解析

Java面试中,垃圾回收(GC)、多态性和反射机制是三大核心考察点。GC问题主要围绕内存管理原理、回收算法和调优策略展开,重点考察可达性分析、分代回收机制以及性能优化手段。多态性问题聚焦运行时动态绑定原理,要求深入理解方法重写、向上转型及JVM方法表机制。反射机制则重点考察动态获取类信息的能力、性能优化方法和实际应用场景,强调在框架开发中的关键作用。这三类问题均遵循从基础概念到底层原理,再到工程实践的考察逻辑,回答时需结合具体场景展示对知识点的深入理解和实际应用经验。

equila的博客 1226

在ROS中使用行为树

在ROS中使用行为树 我提供的工程示例文件: demo链接 文章目录在ROS中使用行为树0、 学习本教程的前提1、 behaviorTree 库安装(ROS使用下的安装方式)2、 处理 behaviortree 库并准备好 service 和 ros action2.1 对ROS 的 service 和 action 进行封装,使其在 behaviortree 上使用更加方便。2.2 创建一个 service 和一个 action2.3 创建与决策树相关的数据类型2.4 修改`package.xml`文件2

qq_37416258的博客 6375

【PLL】分频器设计权衡:从CMOS到CML的电路实现与优化

本文深入探讨了PLL中分频器的设计权衡,比较了CMOS和CML两种电路实现的优缺点。通过实际案例分析,展示了如何在速度、功耗和噪声之间取得平衡,特别是在5G射频芯片和Wi-Fi 6E等高频应用中的优化实践。文章还提供了混合架构设计和电源噪声协同优化的实用技巧,适合电路设计工程师参考。

weixin_42521843的博客 442

面试记录之 JVM 的 GC

GC 、 垃圾回收介绍 、垃圾回收算法,垃圾回收器 JVM

qq_37761711的博客 278

第1章第11节:创建可容纳多行滚动文字的输入框TextEditor [SwiftUI快速入门到实战]

TextField可以让用户输入单行的文字内容,若想输入多行的文字内容,可以使用能够容纳多行滚动文字的 TextEditor。 定义一个字符串属性,用来存储用户输入的文字内容。接着定义一个布尔属性,用来标识是否弹出警告窗口,以显示用户输入的内容。 TextEditor是由UIKit中的UITextView演变而来,因此可以在init方法中,通过UITextView修改TextEditor的外观属性。 添加一个VStack视图,作为子视图的容器。 创建一个TextEditor,Te..

互动教程网[www.hdjc8.com] 832

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

Java GC垃圾回收几乎是面试必问的JVM问题之一,本篇文章带领大家了解Java GC的底层原理,图文并茂,突破学习及面试瓶颈。 楔子-JVM内存结构补充 在上篇《JVM之内存结构详解》中有些内容我们没有讲,本篇结合垃圾回收机制来一起学习。还记得JVM中堆的结构图吗? 图中展示了堆中三个区域:Eden、From Survivor、To Survivor。从图中可以也可以看到它们的大小比例,准确...

程序新视界 1万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

阿里的面试官都喜欢问哪些问题?

作者:徐刘根 | 公众号:Java之间 金九银十是招聘的旺季,小编在这里也给大家整理了一套阿里面试官最喜欢问的问题或者出场率较高的面试题,助校招或者社招路上的你一臂之力! 首先我们需要明白一个事实,招聘的一个很关键的因素是在给自己找未来的同事,同级别下要找比自己优秀的人,面试是一个双向选择的过程,也是一个将心比心去沟通的过程。 就像我们有的人感觉自己很牛逼,但是拿不到offer,...

徐刘根的博客 1万+

VC中sqlite的使用

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

专业知识感觉什么都会,面试官一问却回答不上来怎么办?

最近后台读者说自己最近在疯狂投简历,有的石沉大海,但还好不是全军覆没。前两天好不容易熬到了阿里的四面,跟我聊了一下,面试官拿哪些题为难了他? 前面几题还好,问的是有关JVM的一些问题,比如说JVM主要组成部分及其作用?运行时数据区包含哪些?这里基本都还能hold住,但越到后面,他问到jvm中一次完整的GC流程(从ygc到fgc)是怎样的,重点讲讲对象如何晋升到老年代等?......他说一瞬间脑子里只剩下嗡嗡声。 事实上,就我这些年的面试经验而言,有很多年工作经验但是和技术能力匹配不上的人是存在的。如果在

weixin_42097208的博客 3998

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

面试官不讲武德,竟然问了我18个JVM问题!

前言GC 对于Java 来说重要性不言而喻,不论是平日里对 JVM 的调优还是面试中的无情轰炸。这篇文章我会以一问一答的方式来展开有关 GC 的内容。本文章所说的 GC 实现没有特殊说明...

磊哥聊Java 511

12 面试官给你看一段GC日志,你看到Full GC,他看到的其实是这八个字

本文深入解析如何从面试官视角分析GC日志,而非简单识别Full GC。文章提出三步分析法:第一步看GC触发原因(如Ergonomics、Allocation Failure、Metadata GC Threshold),不同原因对应完全不同的排查思路;第二步分析各区回收数据,从年轻代和老年代的变化反推晋升瓶颈;第三步关注回收时长和频率趋势,识别内存泄漏迹象。最后指出面试中常见的三个误区,并提供标准回答框架。核心观点是:排查GC问题应先诊断后治疗,区分正常GC与异常GC,避免盲目调参或加机器。

weixin_42023666的博客 963

JVM调优实战:手撕OOM问题,面试官追问GC日志解析

在终面倒计时5分钟的关键时刻,面试官突然抛出一个生产环境中的OOM问题,要求应届生现场分析并提出解决方案。应届生凭借对JVM调优的深刻理解,结合Arthas工具快速定位问题根源,并详细解析GC日志,最终成功化解危机。这场面试不仅考验了技术能力,更展现了临场应变的智慧。

Ared 1256

面试官问我,为什么百万级TPS系统频繁GC?我当场懵了

当面试官向你提问JVM的实战问题时,你是否感觉到无所适从?想解决生产环境中的GC问题,你是否感觉到狗咬刺猬,无处下嘴?面对JVM的海量参数,你是否感觉到...

WantFlyDaCheng的博客 1480

面试官问我:谈谈对Java GC的了解?回答完让我回家等消息....

面试官问我:谈谈对Java GC的了解?回答完让我回家等消息.... JVM的运行数据区 首先我简单来画一张 JVM的结构原理图,如下。 我们重点关注 JVM在运行时的数据区,你可以看到在程序运行时,大致有5个部分。 1.方法区 不止是存“方法”,而是存储整个 class文件的信息,JVM运行时,类加载器子系统将会提取 class文件里面的类信息,并将其存放在方法区中。例如类的名称、类的类型...

Python技术江湖 966

面试官100%都会问到的Java面试真题,这把稳了

前言 最近是招聘季,所谓金九银十,正是跳槽的好几节。今天,给大家整理了一些Java面试常考的经典题目,我们一道一道来分析一下。 经典面试题 1、谈谈你对 Java 平台的理解?“Java 是解释执行”,这句话正确吗? 考点分析:对于这类笼统的问题,你需要尽量表现出自己的思维深入并系统化,Java 知识理解得也比较全面,一定要避免让面试官觉得你是个“知其然不知其所以然”的人。毕竟明白基本组成和机制,是日常工作中进行问题诊断或者性能调优等很多事情的基础,相信没有招聘方会不喜欢“热爱学习和思考”的面试者。

GQH498的博客 165

Java核心技术面试精讲第28讲 | 谈谈你的GC调优思路?

我发现,目前不少外部资料对G1的介绍大多还停留在JDK 7或更早期的实现,很多结论已经存在较大偏差,甚至一些过去的GC选项已经不再推荐使用。所以,今天我会选取新版JDK中的默认G1 GC作为重点进行详解,并且我会从调优实践的角度,分析典型场景和调优思路。下面我们一起来更新下这方面的知识。今天我要问你的问题是,谈谈你的GC调优思路?

牛牛 930

问啥都会,却输在了JVM调优问题上

昨天面了个32岁的Java程序员,各方面都挺好,问啥都会,最后问了个JVM调优问题,支支吾吾了好久,然后一阵沉默……走时几乎落泪...唉!细想想...当面试官向你提问JVM的实战问题时,...

JAVA葵花宝典 225

面试官问我“JVM 调优工具有哪些怎么用”,我一开口他就知道是老江湖

《JVM调优工具江湖十八门派》摘要(150字) 在科技公司面试场景中,作者通过"实习生"身份巧妙引出JVM调优话题。文章系统梳理了JVM调优工具链:jps定位进程、jstat实时监控GC、jmap分析内存分布、jstack排查线程问题,以及VisualVM/JMC等图形化工具。特别强调GC日志分析的重要性,并附工具对比表。文末以幽默方式揭示作者技术专家身份,并提供调优学习路径:从日志收集到工具联用。全文将专业技术转化为生动的江湖门派比喻,兼具实用性和趣味性。(149字)

真正的大师永远怀着一颗学徒的心 1627
上一篇: ClassNotFoundException: com.mysql.jdbc.Driver
下一篇: Spring in action @valid验证不生效问题解决
codexjli
博客等级 码龄11年 2粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值