Java中System.gc()被调用时堆内存与方法区具体发生了什么

落磊吖_8954

落磊吖_8954

2026-06-22

963人浏览

原创

system.gc()仅是向jvm发出垃圾回收建议,不保证立即或确定地回收堆内存和方法区,实际行为取决于gc策略、堆状态、运行负载及容器配置。

java中system.gc()被调用时堆内存与方法区具体发生了什么

System.gc() 被调用时,堆内存和方法区都不会立即、确定地发生回收动作。它只是向 JVM 发出一个“建议”,是否执行、何时执行、执行哪部分,完全由当前垃圾收集器策略、堆状态、运行负载甚至容器配置共同决定。

堆内存:不保证触发,更不保证是 Full GC

堆是 GC 的主要作用区域,但 System.gc() 并不等价于“立刻扫描并清理整个堆”。

  • HotSpot 默认行为是建议一次全局 GC,但 G1、ZGC、Shenandoah 等现代收集器通常会忽略或弱化该请求——G1 可能只做 Mixed GC,ZGC 根本不响应 System.gc() 的 Full GC 请求
  • 即使触发了 GC,也可能是 Young GC(仅清理新生代),而非 Full GC(覆盖老年代+新生代);是否晋升、是否压缩、是否并发,全由收集器自主决策
  • 常见现象:调用后 Runtime.getRuntime().freeMemory() 几乎不变,VisualVM 或 JFR 中查不到对应 GC 事件,说明 JVM 直接跳过了该请求

方法区(元空间):基本不参与此次“建议”的直接响应

方法区(JDK 8+ 为元空间 Metaspace)的回收逻辑与堆解耦,System.gc() 不会专门触发类卸载或常量池清理。

Java Maven Common
Java Maven Common

Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。

下载
  • 元空间回收依赖独立条件:比如类加载器被回收、类实例全部消亡、且 -XX:+ClassUnloading 开启;System.gc() 无法加速这一过程
  • 即便发生 Full GC,元空间是否回收也取决于具体收集器实现——CMS 在 JDK 9 后已废弃,G1 默认不卸载类,ZGC 也不将 System.gc() 与元空间清理绑定
  • 唯一间接关联场景:当 Full GC 连带触发类卸载(如某些老版本 Parallel GC 配合 -XX:+UseConcMarkSweepGC),那也是 GC 自身策略的结果,不是 System.gc() 的功劳

真正可能被影响的,其实是堆外内存的间接释放路径

System.gc() 在堆外资源管理中反而有明确用途,但这与堆/方法区回收无直接关系。

  • DirectByteBuffer 分配失败时,Bits.reserveMemory() 会主动调用 System.gc(),目的是促使 JVM 尽快回收那些已无引用的 DirectByteBuffer 对象,从而释放其持有的 native 内存
  • FileChannel.map 映射失败抛出 OutOfMemoryError 后,也会调用 System.gc(),尝试腾出虚拟地址空间(不是堆内存),再重试 mmap
  • 这类调用本质是“用一次 GC 机会换堆外资源释放”,不是为了降低堆使用率,也不改变方法区内容

为什么你观察不到明显变化?

因为 JVM 对 System.gc() 的处理高度保守:

  • 在 Docker/K8s 环境中,若未设置 -XX:MaxRAMPercentage 或 -XX:+UseContainerSupport,JVM 可能因无法正确感知内存限制而彻底忽略该调用
  • 频繁调用会被 JVM 内部限流(例如 HotSpot 的 “gc suppression” 机制),连续多次调用可能只响应第一次
  • GC 线程调度受系统负载影响——如果 CPU 忙、GC 线程未被及时调度,调用就只是“挂起”在队列里,甚至超时丢弃

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

10657

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

7782

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

6772

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1144

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

948

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1396

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2809

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

20111

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1235

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习