限时领|《AI 百问百答》专栏课+实体书(包邮)! 了解详情
写点什么

可视化 Java 垃圾回收

  • 2014-02-26
  • 本文字数:2601 字

    阅读完需:约 9 分钟

垃圾回收,就像双陆棋一样,只需几分钟来学习,但要用一生来精通。

Ben Evans 是一名资深培训师兼顾问,他在演讲可视化垃圾回收中从基础谈起讨论了垃圾回收。

以下是对其演讲的简短总结。

基础

当谈到释放不再使用的内存,垃圾回收已经在很大程度上取代了早期技术,比如手动内存管理和引用计数。

这是件好事,因为内存管理令人厌烦,学究式地簿记是计算机擅长的,而不是人擅长的。在这方面,语言的运行时环境比人强。

现代的垃圾回收非常高效,远远超过早期语言中典型的手工分配。通常,具有其它语言背景的人只盯着垃圾回收造成的中断,却没有完全理解自动内存管理发生作用的上下文环境。

标记 & 清除是 Java(及其它运行时环境)用于垃圾回收的基本算法。

在标记 & 清除算法中,引用会从每个线程栈的桢指向程序的堆。所以,从栈开始,循着指针找到所有可能的引用,然后再循着这些引用递归下去。

当递归完成,就找到了所有的活对象,其它的都是垃圾。

请注意,人们经常漏掉的一点是,运行时环境本身也有一个“分配清单(allocation list)”,上面列出了指向每个对象的指针,该列表由垃圾回收器负责维护,并帮助垃圾回收器进行垃圾清理。因此,运行时环境总是可以找出由它创建但尚未回收的对象。

图一

上面插图中所示的栈只是一个与单个应用程序线程相关的栈;每个应用程序线程都有一个类似的栈,每个栈本身都有一组指向堆的指针。

如果垃圾回收器试图在应用程序运行过程中获取活对象的快照,那么它就要追踪运动着的目标,那样很容易漏掉一些严重超时的对象分配,因而无法获得一个准确的快照。因此,“Stop the World”是有必要的;也就是,停止应用程序线程足够长的时间,以便捕获活对象的快照。

下面是垃圾回收器必须遵循的两条黄金法则:

  1. 垃圾回收器必须回收所有的垃圾。
  2. 垃圾回收器必须从不回收任何活对象。

但这两条规则并不是对等的;如果违反了第二条规则,结果会使数据遭到破坏。

另一方面,如果违反了第一条规则,则会是另一种情况,系统并不总是能够回收所有的垃圾,但最终会回收所有的垃圾,那么这是可以接受的,而实际上,这是垃圾回收器的基本原理。

HotSpot

现在,我们来说下 HotSpot,它实际上是一个 C、C++ 以及许多特定于平台的汇编程序组成的混合体。

当人们想到解释器,就会想到一个很大的 while 循环,其中包含一个很长的 switch 语句。但 HotSpot 解释器比那个要复杂的多(由于性能原因)。在开始阅读 JDK 源代码的时候,就会发现 HotSpot 中实在是有许多汇编程序代码。

对象创建

Java 会预先分配大量的连续空间,就是我们所说的“堆”。之后,HotSpot 完全在用户空间里管理这块内存。

如果一个 Java 进程占用了大量的系统(或内核)时间,那么毫无疑问,它不是在进行垃圾回收——因为所有的垃圾回收内存“簿记(bookkeeping)”都是在用户空间进行的。

内存池

图二

“永久代(PermGen)”是一个存储区域,用于保存那些需要在程序生存期内一直存活的东西,如类的元数据。不过,随着应用程序服务器的出现,它们有自己的类加载器,并且需要重新加载类的元数据,永久代作为一个优化决策开始显得糟糕,所幸,它在 Java 8 中消失了。

Java 8 将会使用一个名为“元空间(Metaspace)”的新概念。元空间与永久代并不完全相同。它在堆的外面,由操作系统管理。这意味着,它不会在 Java 堆中,而是在本地内存里。目前,这还不是一个非常好的消息,因为没有多少工具能够让用户轻松地查看本地内存。所以,永久代消失是件好事,但工具赶上这个变化还需要一些时间。

Java 堆布局

现在,我们来看下 Java 堆。注意堆空间之间的虚拟空间。它们提供了一点浮动量,以允许对内存池进行一定量的尺寸调整,又不用为任何对象移动付出代价。

图三

“弱代假设(Weak Generational Hypothesis)”

就现状而言,究竟为什么要将堆分成所有这些内存池?

图四

有的运行时事实无法通过静态分析推导出来。上面的插图说明有两组对象:一组存活时间短,一组存活时间长——所以,做额外的簿记以便利用这一事实是有意义的。在 Java 平台中,有许多类似的作为优化写入平台的事实。

演示

Ben Evans 进行了一系列的动画演示。第一个演示是个 Flash,说明了对象在 Eden 区和一个新生代 Survivor 空间之间移动,并最终进入老年代的过程。

图五是用 JavaFX 再现了同样的过程。

图五

运行时开关

‘强制性’参数

  • -verbose:gc——为用户输出一些 GC 信息
  • -Xloggc:< 文件路径 >——指定日志输出路径,要确保磁盘有空间
  • -XX:+PringGCDetails——为辅助工具提供“最低限度信息(Minimum information)” ——用这个参数代替 -verbose:gc
  • –XX:PrintTenuringDistribution——“过早提升(Premature promotion)”信息

基本堆大小参数

  • -Xms —— 设置预留给堆的最小内存值
  • -Xmx —— 设置预留给堆的最大内存值
  • -XX:MaxPermSize=——设置永久代的最大内存值 ——有利于 Spring 应用程序和应用服务器

以前,我们被教导要把 -Xms 和 -Xmx 的值设的一样大。不过这已经变了。因此,现在可以为 -Xms 设置一个合理范围内较小的值,或者根本就不设置,因为堆的适应能力现在已经非常好了。

其它参数

  • -XX:NewRatio=N
  • -XX:NewSize=N
  • -XX:MaxNewSize=N
  • -XX:MaxHeapFreeRatio
  • -XX:MinHeapFreeRatio
  • -XX:SurvivorRatio=N
  • -XX:MaxTenuringThreshold=N

图六

为什么要有日志文件

日志文件的好处是能够用于取证分析,可以使用户免于为了再现问题而不得不再执行一次代码(如果是一个罕见的生产环境错误,那么重现并不容易)。

另外,它们包含的信息比针对内存的 JMX MXBeans 所能提供的信息更多,且不说轮询 JMX 本身会引入一系列 GC 问题。

工具

  • HP JMeter(用 Google 查询一下)——免费,非常可靠,但不再提供支持 / 功能增强
  • GCViewer ——免费,开源,但界面有点丑
  • GarbageCat ——名字最好听
  • IBM GCMV ——支持 J9
  • jClarity Censum ——界面最美观,而且最有用——不过,这是我们的偏见!

小结

  • 需要了解一些 GC 基础理论
  • 要让新生代的大部分对象在年轻时死亡
  • 打开 GC 日志!——原始日志文件难以阅读——使用工具
  • 使用工具来帮助自己调优——测量,而不是猜测

查看完整演讲视频,请点击这里

关于作者

Ben Evans是一家 Java/JVM 性能分析创业公司 jClarity 的 CEO。在业余时间,他是伦敦 Java 社区的一名负责人,也是 Java 社区过程执行委员会成员之一。他先前的项目包括:对 Google IPO、金融交易系统做性能测试,为若干 90 年代最大的电影开发获奖网站等等。

查看英文原文:**** Visualizing Java Garbage Collection

2014-02-26 06:388724
用户头像

发布了 256 篇内容, 共 94.8 次阅读, 收获喜欢 12 次。

关注

评论

发布
暂无评论
发现更多内容

DeepSeek 搭配这些 AI 工具,PPT、图片、视频、文案秒出!

Techinsight

2025多链代币开发全景指南:从BSC到TON的实战策略与技术选型

区块链软件开发推广运营

交易所开发 dapp开发 链游开发 公链开发 公链开发代币开发

OceanBase如何支持应用多活

陈一之

高可用架构 oceanbase 应用多活

签约!亚太物业标杆启胜物业携手用友采购云,共启数智采购新旅程

用友BIP

必看!10 款好用的 AI 工具,个人与企业都能用

Techinsight

AI GENTS

普通人如何玩转 DeepSeek?本地部署攻略来了

Techinsight

2025 年 HR 必看!这 8 款数字化管理软件如何重塑企业效率?

Techinsight

2025 爆款 AI 工具,总有一款适合你

Techinsight

如何利用科学的预算管理为企业释放更多价值

智达方通

企业管理 全面预算管理 预算管理

博睿数据受邀出席2025GOPS全球运维大会深圳站!解锁LLM技术在智能运维中的深度应用

博睿数据

深度剖析!企业和个人本地部署 DeepSeek 的真实原因与利弊

Techinsight

HR黑科技:AI+RPA+飞书,智能招聘全流程自动化,效率提升300%!

Techinsight

RPA AI Agent

赋能新质生产力·智创产业新生态|2025青岛国际人工智能展会

AIOTE智博会

人工智能展览会 人工智能展会 人工智能展

2025 国内 RPA 选型秘籍:从推荐到避坑,一文读懂

Techinsight

2025 企业数字化新战场:DeepSeek 本地知识库的价值

Techinsight

AI 如何为 RPA 赋予 “超能力”及避坑指南

Techinsight

RPA RPA评测 RPAxAI RPA Agent RPA智能体

AI智能体:高效工作的超级助手,一文带你深度解析

Techinsight

AI Agent智能体是什么,一文看懂!

Techinsight

RPA+AI技术好在哪里?

Techinsight

RPA RPAxAI RPA Agent RPA智能体

有了AI Agents,RPA还有生存空间吗?

Techinsight

RPA AI Agents

海外云手机怎样帮企业省钱玩转海外社媒?

Ogcloud

云手机 海外云手机 海外社媒运营 海外社媒推广

谷歌A2A vs Anthropic MCP协议对比解析

测试人

人工智能

人工智能经济爆发!哪些行业将迎来巨变?

Techinsight

BeeWorks Meet更适合企业内部使用的原因

BeeWorks

即时通讯 IM 私有化部署 局域网视频软件

智能体领域:C端产品潜力显现,企业级产品各显神通

Techinsight

agent

Taro on Harmony :助力业务高效开发纯血鸿蒙应用

京东零售技术

Gone 框架的脚手架工具gonectl介绍

大鹏

Bilibili、中电信人工智能科技、商汤科技、联通云等正式加入Volcano社区用户组

华为云原生团队

云计算 容器 云原生 Volcano

千万级数据秒级响应!碧桂园基于 EMR Serverless StarRocks 升级存算分离架构实践

阿里云大数据AI技术

大数据 阿里云 Serverless EMR

常用的RPA软件有哪些?

Techinsight

RPA RPA Agent RPA智能体

RPA 技术赋能电商运营:从数据抓取到订单处理的全流程自动化实践

Techinsight

电商

可视化Java垃圾回收_Java_Ben Evans_InfoQ精选文章