一次性理解Java垃圾回收--简单直接方便面试时使用

Java的垃圾回收是一个面试必问题,只要按照下面的步骤回答肯定不会有大问题。

1.先告诉面试官垃圾回收分为两大步:

a.识别哪些对象是"垃圾"(不再被使用的对象)

b.回收这些垃圾对象占用的内存空间

2. 接下来分别介绍标记阶段和回收阶段的细节

标记阶段(比较简单,两句话):

从GC Roots(包括虚拟机栈、本地方法栈、方法区中的静态属性、常量等引用)开始遍历;

被GC Roots直接或间接引用到的对象标记为存活,其他的就是垃圾

清除阶段(回答重点,有多种算法实现):

标记-清除算法:

直接清除被标记为垃圾的对象【简单直接,但是会产生内存碎片】

标记-整理算法:

将所有存活对象向内存的一端移动,然后清理界外内存【避免内存碎片,但是对象移动的成本比较高】

复制算法

将内存分成两块,只使用其中一块,GC时将存活对象复制到另一块【无碎片,高效;但是内存利用率只有50%】

上面三种基础算法,但是现在常用垃圾收集器都是综合使用上面的算法,也就是:

分代收集

把整个堆空间进行划分,分为新生代 & 老年代 & 元空间【本地内存】

新生代 (存活的对象少)

使用复制算法

Eden和Survivor 区 新对象在Eden区;Eden区满出发Minor G(理想间隔1-5分钟,<100ms),存活对象移动的Survivour 区,Survivor区间内分两个空间,回收的时候互相多次复制(默认15次)后晋升到老年代

老年代

使用标记-清除或标记-整理算法

存放长期存活的对象

当老年代空间不足时触发Major GC/Full GC(应极少发生(<1次/天;<1s))

3.拓展部分

常用的调优手段:

1.web开发一般用G1作为垃圾回收期比较多(-XX:+UseG1GC)

2.怎么确认GC 是否有异常:

打印GC日志,看GC频率是否正常

(-Xloggc:/path/to/gc.log

-XX:+PrintGCDetails

-XX:+PrintGCDateStamps

-XX:+PrintGCTimeStamps

-XX:+PrintHeapAtGC

-XX:+PrintTenuringDistribution)

  1. jmap 命令

4.调整新生代的比例

短生命周期对象多的应用:增大新生代(NewRatio=1)

长生命周期对象多的应用:减小新生代(NewRatio=3)

-XX:NewRatio=2(新生代:老年代=1:2)

相关推荐
hfywmsj4 小时前
广州餐饮铺位招租的选址架构:流量入口与成本函数分析
java·大数据·jvm·广州餐饮铺位招租
爪哇岛国人5 小时前
原来我一直理解错了:实现接口真的必须实现所有方法吗?
java
万年咸鱼5 小时前
Java BufferedOutputStream 详解:原理、用法与性能优化
java·开发语言·性能优化
万年咸鱼5 小时前
Java BufferedInputStream 详解:原理、用法与实战
java·开发语言·python
~木雨5 小时前
Java 线程池七问七答:参数、执行流程、拒绝策略到 ThreadLocal 内存泄漏,面试必背
java·面试·线程池·threadlocal·threadpool·executor
艾莉丝努力练剑5 小时前
【AI大模型接入SDK】Gemini模型接入知识体系
java·开发语言·网络·人工智能·网络协议·学习·http
云运维笔记5 小时前
Zabbix 分布式监控搭建实战:基于 Proxy 实现 MySQL、Java、Nginx 监控
java·mysql·zabbix
zhanghaha13146 小时前
Python进阶教程:28_queue 队列模块 零基础超详细教程
java·开发语言·python
司小豆6 小时前
第七课:DeepSeek Harness 服务与依赖注入
java·服务器·开发语言·github·ai编程
ocean21036 小时前
2025-2026年计算机网络面试高频知识点洞察
计算机网络·面试·职场和发展·https·tcp·面试真题·秋招春招