0

0

如何通过Java代码手动触发Full GC_System.gc()及其副作用

P粉602998670

P粉602998670

发布时间:2026-02-27 11:21:18

|

759人浏览过

|

来源于php中文网

原创

system.gc() 不能保证触发 full gc,仅是向 jvm 发出建议,实际执行由垃圾收集器和运行时策略决定;启用 -xx:+disableexplicitgc 可直接忽略该调用。

如何通过java代码手动触发full gc_system.gc()及其副作用

System.gc() 能不能触发 Full GC?

不能保证。调用 System.gc() 只是向 JVM 发出一个“建议”,是否执行、执行哪种 GC(Minor GC / Full GC / G1 的 Mixed GC 等),完全由当前垃圾收集器和运行时策略决定。JVM 甚至可以在启动参数加 -XX:+DisableExplicitGC 直接忽略它。

哪些场景下 System.gc() 更可能引发 Full GC?

不是靠代码写法,而是靠 JVM 配置和 GC 器行为。比如:

  • 使用 Serial 或 Parallel GC 时,System.gc() 默认倾向触发 Full GC(但依然可被跳过)
  • 使用 CMS 时,它会尝试触发一次 Concurrent GC,失败后才退化为 Full GC
  • 使用 G1 或 ZGC 时,System.gc() 通常只触发一次 Young GC,或直接忽略 —— 因为它们设计上不鼓励显式干预
  • 如果堆已严重碎片化 + 老年代占用高,某些 GC 器(如 ParallelOld)在响应 System.gc() 时更可能走 Full GC 路径

为什么线上禁用 System.gc()?常见副作用有哪些?

它破坏 GC 自适应节奏,容易引发雪崩式停顿:

  • 在高负载时强制触发 Full GC,导致 STW 时间陡增(尤其 ParallelOld 下可达秒级)
  • 干扰 G1 的预测模型,让其误判老年代压力,提前进入并发标记阶段
  • 与 RMI、JMX 等内部机制耦合(例如 RMI 默认每小时调一次 System.gc()),造成不可控的周期性卡顿
  • 在容器环境(如 Kubernetes)中,可能触发 OOM Killer:因为 GC 暂停期间应用无法响应健康检查,被误判为失联

典型错误现象:java.lang.OutOfMemoryError: Java heap space 出现前,日志里反复看到 Full GC (System.gc());或者监控显示 GC 停顿时间出现规律性尖峰。

Getsound
Getsound

基于当前天气条件生成个性化音景音乐

下载

立即学习Java免费学习笔记(深入)”;

真要手动触发 Full GC,有什么更可控的办法?

没有“可控”的办法 —— 这本身就是反模式。但若用于测试或诊断,可考虑:

  • 用 JVM TI 工具(如 jcmd <pid> VM.runFinalization</pid>jstat -gc <pid></pid> 配合观察)替代硬编码 System.gc()
  • 测试环境启用 -XX:+PrintGCDetails -XX:+PrintGCDateStamps,确认 System.gc() 是否真触发了 Full GC(看日志里有没有 Full GC (System.gc())
  • 避免在循环、RPC 入口、监听回调等高频路径写 System.gc() —— 即便只是“试试”,也极易被复制到生产代码里

最常被忽略的一点:很多团队以为加了 if (DEBUG) 就安全,但忘了 classloader 加载后,字节码里仍存在该调用,只要 JVM 参数没禁用,就可能被其他机制意外触发。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

833

2023.08.22

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

426

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

599

2023.08.10

Golang云原生微服务Kubernetes_Golang怎么集成Kubernetes开发云原生服务
Golang云原生微服务Kubernetes_Golang怎么集成Kubernetes开发云原生服务

Golang云原生微服务Kubernetes (K8s) 是指 使用 Go 语言(Golang)编写的云原生微服务,并利用 Kubernetes 平台进行容器化部署、自动化管理、弹性伸缩和高效编排的一整套现代应用架构方案。

27

2025.12.22

html5播放器怎么用
html5播放器怎么用

本合集全面介绍HTML5播放器的使用方法,涵盖基础语法、自定义控制、兼容性处理及实战示例。阅读专题下面的文章了解更多详细内容。

0

2026.02.27

Golang 实际项目案例:从需求到上线
Golang 实际项目案例:从需求到上线

《Golang 实际项目案例:从需求到上线》以真实业务场景为主线,完整覆盖需求分析、架构设计、模块拆分、编码实现、性能优化与部署上线全过程,强调工程规范与实践决策,帮助开发者打通从技术实现到系统交付的关键路径,提升独立完成 Go 项目的综合能力。

18

2026.02.26

Golang Web 开发路线:构建高效后端服务
Golang Web 开发路线:构建高效后端服务

《Golang Web 开发路线:构建高效后端服务》围绕 Go 在后端领域的工程实践,系统讲解 Web 框架选型、路由设计、中间件机制、数据库访问与接口规范,结合高并发与可维护性思维,逐步构建稳定、高性能、易扩展的后端服务体系,帮助开发者形成完整的 Go Web 架构能力。

17

2026.02.26

Golang 并发编程专题:掌握多核时代的核心技能
Golang 并发编程专题:掌握多核时代的核心技能

《Golang 并发编程专题:掌握多核时代的核心技能》系统讲解 Go 在并发领域的设计哲学与实践方法,深入剖析 goroutine、channel、调度模型与并发安全机制,结合真实场景与性能思维,帮助开发者构建高吞吐、低延迟、可扩展的并发程序,全面提升多核时代的工程能力。

16

2026.02.26

batoto漫画官网入口与网页版访问指南
batoto漫画官网入口与网页版访问指南

本专题系统整理batoto漫画官方网站最新可用入口,涵盖最新官网地址、网页版登录页面及防走失访问方式说明,帮助用户快速找到batoto漫画官方平台,稳定在线阅读各类漫画内容。

431

2026.02.25

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3.9万人学习

C# 教程
C# 教程

共94课时 | 10.2万人学习

Java 教程
Java 教程

共578课时 | 72.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号