GC log 解读

本贴最后更新于 2398 天前,其中的信息可能已经事过景迁

gc log 是 java 程序在出现内存问题时候最好的查看问题的有利日志。下面我们来一步一步分析 gc log。

首先,默认 java 程序是不会开启 gc log,我们可以在给 jvm 参数加上-XX:+PrintGCDetails (这个只是我们在本地调试使用,在生成环境下不可使用。

下面我们可以模拟一个程序,来查看日志。

public class GcLog { static final int MB = 1024 * 1024; static void printGC() { byte[] b1, b2, b3, b4; b1 = new byte[MB]; b2 = new byte[MB]; b3 = new byte[MB]; b4 = new byte[2*MB]; } public static void main(String[] args) { // TODO Auto-generated method stub printGC(); } }

可以给可以 jvm 加上如下的启动参数:-Xmx10M -Xms10M -Xmn6M -XX:+PrintGCDetails -XX:SurvivorRatio=7

从代码,可以看到 jvm 分配的内存大小一共为 10M,其中老变态 4M,年轻态 6M,同时针对年轻态 eden 和 Survivor 共享 6M,分配的比例为 7:1:1,其中 eden 大小为 4.6M,Survivor 的两个区域各自为 0.6M

这里我们默认采用 CMS 垃圾回收,下面我们运行程序,会看到如下的日志

[GC [DefNew: 3298K->149K(5504K), 0.0053498 secs] 3298K->3221K(9600K), 0.0053750 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] Heap def new generation total 5504K, used 2391K [0x33e60000, 0x34460000, 0x34460000) eden space 4864K, 46% used [0x33e60000, 0x34090b28, 0x34320000) from space 640K, 23% used [0x343c0000, 0x343e5418, 0x34460000) to space 640K, 0% used [0x34320000, 0x34320000, 0x343c0000) tenured generation total 4096K, used 3072K [0x34460000, 0x34860000, 0x34860000) the space 4096K, 75% used [0x34460000, 0x34760030, 0x34760200, 0x34860000) compacting perm gen total 12288K, used 376K [0x34860000, 0x35460000, 0x38860000) the space 12288K, 3% used [0x34860000, 0x348be298, 0x348be400, 0x35460000) ro space 10240K, 55% used [0x38860000, 0x38de3320, 0x38de3400, 0x39260000) rw space 12288K, 55% used [0x39260000, 0x39906128, 0x39906200, 0x39e60000)

下面来从程序的角度分析日志的。

程序中按照顺序申请了 1M-->1M--->1M--->2M 的内存

当第一次申请 1M 的时候,新生态空间足够直接放入

当第二次申请 1M 的时候,新生态空间依然足够,直接放入

当第三次申请 1M 的时候,新生态空间依然足够,直接放入

当第四次申请 1M 的时候,新生态空间不足开始 GC,而此时有 3 个 1M 的对象,而 Survivor 区域不满 1M,所以直接进入老年态,这是原来的 3 个 1M 对象进入老年态,2M 的对象进入 eden

[GC [DefNew: 3298K->149K(5504K), 0.0053498 secs] 3298K->3221K(9600K), 0.0053750 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]

看一下这行:

DefNew 表示新生态:3298K->149K(5504K), 0.0053498 secs

表示新生态由 3298K 回收变成了 149K,即之前的 3M 回收了,5504K 表示该区域的总内存大小

3298K->3221K(9600K), 0.0053750 secs] 表示整个 jvm 堆的大小由于没有可以回收的对象,所以总大小本质没发生改变,9600K 是 java 的总堆大小 9600K。(虽然分配 10M,其中还有持久态等其他内存区域)

[Times: user=0.00 sys=0.00, real=0.01 secs] 表示 gc 所花费的系统资源

-------------------------------------------------------------------------------华丽分割线---------------------------------------------------------------------------------------------------------

再来看看这堆详细的信息

Heap
def new generation total 5504K, used 2391K [0x33e60000, 0x34460000, 0x34460000)-------------> 新生态的大小,total,used
eden space 4864K, 46% used [0x33e60000, 0x34090b28, 0x34320000)
from space 640K, 23% used [0x343c0000, 0x343e5418, 0x34460000)-------------> 本例中由于该区域很小,无法放入对象,所以其实没使用到。
to space 640K, 0% used [0x34320000, 0x34320000, 0x343c0000)
tenured generation total 4096K, used 3072K [0x34460000, 0x34860000, 0x34860000)-------------> 老年态
the space 4096K, 75% used [0x34460000, 0x34760030, 0x34760200, 0x34860000)
compacting perm gen total 12288K, used 376K [0x34860000, 0x35460000, 0x38860000)-------------> 由于老年态共 4M,已经放入 3M 了,所以开启了压缩。
the space 12288K, 3% used [0x34860000, 0x348be298, 0x348be400, 0x35460000)
ro space 10240K, 55% used [0x38860000, 0x38de3320, 0x38de3400, 0x39260000)
rw space 12288K, 55% used [0x39260000, 0x39906128, 0x39906200, 0x39e60000)

对于生成环境下的 java 程序可以加上来生成 gc log,方便出现问题的时候去排查

-verbose:gc -Xloggc:/usr/gclog -XX:+PrintGCDetails XX:+PrintGCTimeStamps

暂时先到这边,jvm 内存模型这里就不多说了,后续我会写一些 jvm 优化已经在线调试线上系统的工具。

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3203 引用 • 8217 回帖
  • JVM

    JVM(Java Virtual Machine)Java 虚拟机是一个微型操作系统,有自己的硬件构架体系,还有相应的指令系统。能够识别 Java 独特的 .class 文件(字节码),能够将这些文件中的信息读取出来,使得 Java 程序只需要生成 Java 虚拟机上的字节码后就能在不同操作系统平台上进行运行。

    180 引用 • 120 回帖 • 2 关注
  • GC
    17 引用 • 45 回帖

相关帖子

回帖

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • 星云链

    星云链是一个开源公链,业内简单的将其称为区块链上的谷歌。其实它不仅仅是区块链搜索引擎,一个公链的所有功能,它基本都有,比如你可以用它来开发部署你的去中心化的 APP,你可以在上面编写智能合约,发送交易等等。3 分钟快速接入星云链 (NAS) 测试网

    3 引用 • 16 回帖
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    948 引用 • 1460 回帖 • 4 关注
  • 微服务

    微服务架构是一种架构模式,它提倡将单一应用划分成一组小的服务。服务之间互相协调,互相配合,为用户提供最终价值。每个服务运行在独立的进程中。服务于服务之间才用轻量级的通信机制互相沟通。每个服务都围绕着具体业务构建,能够被独立的部署。

    96 引用 • 155 回帖
  • 互联网

    互联网(Internet),又称网际网络,或音译因特网、英特网。互联网始于 1969 年美国的阿帕网,是网络与网络之间所串连成的庞大网络,这些网络以一组通用的协议相连,形成逻辑上的单一巨大国际网络。

    98 引用 • 367 回帖
  • 禅道

    禅道是一款国产的开源项目管理软件,她的核心管理思想基于敏捷方法 scrum,内置了产品管理和项目管理,同时又根据国内研发现状补充了测试管理、计划管理、发布管理、文档管理、事务管理等功能,在一个软件中就可以将软件研发中的需求、任务、bug、用例、计划、发布等要素有序的跟踪管理起来,完整地覆盖了项目管理的核心流程。

    10 引用 • 15 回帖 • 4 关注
  • 学习

    “梦想从学习开始,事业从实践起步” —— 习近平

    173 引用 • 541 回帖
  • OpenCV
    15 引用 • 36 回帖
  • WiFiDog

    WiFiDog 是一套开源的无线热点认证管理工具,主要功能包括:位置相关的内容递送;用户认证和授权;集中式网络监控。

    1 引用 • 7 回帖 • 611 关注
  • GitLab

    GitLab 是利用 Ruby 一个开源的版本管理系统,实现一个自托管的 Git 项目仓库,可通过 Web 界面操作公开或私有项目。

    46 引用 • 72 回帖 • 2 关注
  • Lute

    Lute 是一款结构化的 Markdown 引擎,支持 Go 和 JavaScript。

    29 引用 • 202 回帖 • 37 关注
  • CSDN

    CSDN (Chinese Software Developer Network) 创立于 1999 年,是中国的 IT 社区和服务平台,为中国的软件开发者和 IT 从业者提供知识传播、职业发展、软件开发等全生命周期服务,满足他们在职业发展中学习及共享知识和信息、建立职业发展社交圈、通过软件开发实现技术商业化等刚性需求。

    14 引用 • 155 回帖
  • 深度学习

    深度学习(Deep Learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。

    43 引用 • 44 回帖
  • 爬虫

    网络爬虫(Spider、Crawler),是一种按照一定的规则,自动地抓取万维网信息的程序。

    106 引用 • 275 回帖 • 2 关注
  • 生活

    生活是指人类生存过程中的各项活动的总和,范畴较广,一般指为幸福的意义而存在。生活实际上是对人生的一种诠释。生活包括人类在社会中与自己息息相关的日常活动和心理影射。

    230 引用 • 1432 回帖
  • Ant-Design

    Ant Design 是服务于企业级产品的设计体系,基于确定和自然的设计价值观上的模块化解决方案,让设计者和开发者专注于更好的用户体验。

    17 引用 • 23 回帖 • 15 关注
  • API

    应用程序编程接口(Application Programming Interface)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

    79 引用 • 431 回帖
  • 开源中国

    开源中国是目前中国最大的开源技术社区。传播开源的理念,推广开源项目,为 IT 开发者提供了一个发现、使用、并交流开源技术的平台。目前开源中国社区已收录超过两万款开源软件。

    7 引用 • 86 回帖 • 1 关注
  • SendCloud

    SendCloud 由搜狐武汉研发中心孵化的项目,是致力于为开发者提供高质量的触发邮件服务的云端邮件发送平台,为开发者提供便利的 API 接口来调用服务,让邮件准确迅速到达用户收件箱并获得强大的追踪数据。

    2 引用 • 8 回帖 • 512 关注
  • 正则表达式

    正则表达式(Regular Expression)使用单个字符串来描述、匹配一系列遵循某个句法规则的字符串。

    31 引用 • 94 回帖 • 2 关注
  • Visio
    1 引用 • 2 回帖
  • Excel
    31 引用 • 28 回帖
  • 音乐

    你听到信仰的声音了么?

    62 引用 • 512 回帖
  • IPFS

    IPFS(InterPlanetary File System,星际文件系统)是永久的、去中心化保存和共享文件的方法,这是一种内容可寻址、版本化、点对点超媒体的分布式协议。请浏览 IPFS 入门笔记了解更多细节。

    20 引用 • 245 回帖 • 241 关注
  • 资讯

    资讯是用户因为及时地获得它并利用它而能够在相对短的时间内给自己带来价值的信息,资讯有时效性和地域性。

    56 引用 • 85 回帖 • 3 关注
  • Jenkins

    Jenkins 是一套开源的持续集成工具。它提供了非常丰富的插件,让构建、部署、自动化集成项目变得简单易用。

    54 引用 • 37 回帖 • 2 关注
  • Scala

    Scala 是一门多范式的编程语言,集成面向对象编程和函数式编程的各种特性。

    13 引用 • 11 回帖 • 165 关注
  • Wide

    Wide 是一款基于 Web 的 Go 语言 IDE。通过浏览器就可以进行 Go 开发,并有代码自动完成、查看表达式、编译反馈、Lint、实时结果输出等功能。

    欢迎访问我们运维的实例: https://wide.b3log.org

    30 引用 • 218 回帖 • 642 关注