阅读GC日志是处理Java虚拟机内存问题的基础技能,它只是一些人为确定的规则,没有太多技术含量。在本书的第1版中没有专门讲解如何阅读分析GC日志,为此作者收到许多读者来信,反映对此感到困惑,因此专门增加本节内容来讲解如何理解GC日志。
每一种收集器的日志形式都是由它们自身的实现所决定的,换而言之,每个收集器的日志格式都可以不一样。但虚拟机设计者为了方便用户阅读,将各个收集器的日志都维持一定的共性,例如以下两段典型的GC日志:
33.125: [GC [DefNew: 3324K->152K(3712K), 0.0025925 secs] 3324K->152K(11904K), 0.0031680 secs]
100.667: [Full GC [Tenured: 0K->210K(10240K), 0.0149142 secs] 4603K->210K(19456K), [Perm : 2999K->2999K(21248K)], 0.0150007 secs] [Times: user=0.01 sys=0.00, real=0.02 secs]
最前面的数字“33.125:”和“100.667:”代表了GC发生的时间,这个数字的含义是从Java虚拟机启动以来经过的秒数。
GC日志开头的“[GC”和“[Full GC”说明了这次垃圾收集的停顿类型,而不是用来区分新生代GC还是老年代GC的。如果有“Full”,说明这次GC是发生了Stop-The-World的,例如下面这段新生代收集器ParNew的日志也会出现“[Full GC”(这一般是因为出现了分配担保失败之类的问题,所以才导致STW)。如果是调用System.gc()方法所触发的收集,那么在这里将显示“[Full GC (System)”。
[Full GC 283.736: [ParNew: 261599K->261599K(261952K), 0.0000288 secs]
接下来的“[DefNew”、“[Tenured”、“[Perm”表示GC发生的区域,这里显示的区域名称与使用的GC收集器是密切相关的,例如上面样例所使用的Serial收集器中的新生代名为“Default New Generation”,所以显示的是“[DefNew”。如果是ParNew收集器,新生代名称就会变为“[ParNew”,意为“Parallel New Generation”。如果采用Parallel Scavenge收集器,那它配套的新生代称为“PSYoungGen”,老年代和永久代同理,名称也是由收集器决定的。
后面方括号内部的“3324K->152K(3712K)”含义是“GC前该内存区域已使用容量-> GC后该内存区域已使用容量 (该内存区域总容量)”。而在方括号之外的“3324K->152K(11904K)”表示“GC前Java堆已使用容量 -> GC后Java堆已使用容量 (Java堆总容量)”。
再往后,“0.0025925 secs”表示该内存区域GC所占用的时间,单位是秒。有的收集器会给出更具体的时间数据,如“[Times: user=0.01 sys=0.00, real=0.02 secs]”,这里面的user、sys和real与Linux的time命令所输出的时间含义一致,分别代表用户态消耗的CPU时间、内核态消耗的CPU事件和操作从开始到结束所经过的墙钟时间(Wall Clock Time)。CPU时间与墙钟时间的区别是,墙钟时间包括各种非运算的等待耗时,例如等待磁盘I/O、等待线程阻塞,而CPU时间不包括这些耗时,但当系统有多CPU或者多核的话,多线程操作会叠加这些CPU时间,所以读者看到user或sys时间超过real时间是完全正常的
相关推荐
然后,将生成的GC日志文件导入到GCViewer,工具会自动解析并生成相应的图表。 在分析过程中,你可以关注以下几个关键指标: 1. **GC暂停时间**:长时间的GC暂停可能会影响应用的响应速度,尤其是对于低延迟的应用...
- **启动参数**:使用了-Djava.home指定JRE路径、-Xdump来在内存崩溃时生成快照、-verbose:gc来开启GC日志、-Xms2000m/-Xmx8000m来分别设置JVM的初始和最大堆内存。 #### 原因分析 ##### OOM 异常 OOM(`...
1. **GC日志分析**:通过分析GC日志,可以了解GC的行为模式,如full GC频率、暂停时间等。 2. **CMS GC日志分析**:Concurrent Mark Sweep(CMS)是一种低暂停时间的垃圾回收器,其日志分析有助于优化CMS配置。 ###...
- **离线分析工具**: GC日志、GCViewer 可以用于离线分析垃圾回收行为。 - **分析器**: 如MAT (Memory Analyzer Tool) 可以帮助识别内存泄漏等问题。 **2.4 GC调优—常规** - **参数设置**: 基本参数如-Xms、-...
- **日志分析**:定期审查日志文件,查找可能的错误或异常情况。 - **备份与恢复**:实施定期备份计划,并测试恢复流程以确保在灾难发生时能够快速恢复业务。 #### 六、Oracle 10g RAC 的高级主题 - **自动故障恢复...
2. **开启verbose:gc参数**:在Java应用中,可以通过添加`verbose:gc`参数来开启垃圾回收的日志,以便观察对象空间的变化。如果发现每次Full GC后对象空间持续增加,且Minor GC无法有效释放空间,最后导致Full GC也...
最后,"详解DNS的常用记录(下)"文档将继续深入探讨其他类型的DNS记录,如PTR、TXT和SRV记录,这些记录在实现反向查找、提供文本信息和定义特定服务位置时起着重要作用。 通过这一系列教程的学习,读者不仅可以...
- **死锁**:两个或多个线程互相等待对方持有的锁,导致程序无法继续执行。 - **性能瓶颈**:由于各种原因导致的应用程序响应时间变长。 ##### 3.2 故障诊断工具 - **VisualVM**:一个功能强大的工具,可以监控JVM...
2. Microsoft.NET4.0.30319.exe:这个文件很可能是.NET Framework 4.0的完整安装程序,如果系统中没有4.0版本,需要先安装这个文件,才能继续安装kiwi syslog server所需的4.0.30319更新。 总结来说,.NET ...
例如,通过分析GC日志找出Full GC的原因,或者使用Eclipse Memory Analyzer Tool(MAT)来分析堆dump文件,识别内存泄漏。对于不同的内存溢出问题,我们需要采取不同的策略,如增大堆内存、调整年轻代和老年代的大小...
3. **线程死锁**:多个线程互相等待对方释放资源,导致无法继续执行。使用jstack命令分析线程状态,找出死锁的线程。 4. **类装载异常**:可能是由于类路径设置错误,或者类冲突导致。检查类路径设置,确保每个类只...
HBase 的性能优化包括GC 问题解决、计算和存储分离、冷热数据分离、诊断系统、迁移和备份等。 HBase 在阿里巴巴集团内的未来发展方向包括: 1. Multi-model DB:HBase 将继续支持多种数据模型,满足阿里巴巴集团...
`nohup`命令使得Java应用在终端关闭后还能继续运行,并且其标准输出和错误输出被重定向到指定的日志文件。 3. **环境变量**: `export LC_ALL=zh_CN.UTF-8`设定当前环境的语言环境为简体中文UTF-8,确保脚本输出的...
6. **日志框架改进**: `java.util.logging`包进行了改进,提供了更强大的日志功能,可以配置不同的日志级别和处理器。 7. **Swing组件增强**: 对Swing GUI库进行了升级,包括更好的布局管理、新的组件以及对无障碍...
5. 并发(Concurrent)垃圾回收:在垃圾回收的同时允许应用程序线程继续运行,尽量降低应用程序的停顿时间。 6. 部分并发(Mostly-concurrent)垃圾回收:这种垃圾回收器尝试在大部分时间中并行工作,只在某些关键...
接下来,D50079GC20_sg2.pdf可能会继续深入这些主题,或者涵盖以下内容: 6. **数据库架构和体系结构**:详细介绍Oracle数据库的物理和逻辑组件,如控制文件、联机重做日志、PGA(程序全局区)和SGA(系统全局区)...
4. **垃圾收集信息**:分析GC日志,判断是否由于频繁的垃圾回收导致性能下降。 5. **锁和同步信息**:查看线程间的锁竞争,分析是否因锁竞争造成性能瓶颈。 使用JCA 456时,首先需要获取到WebSphere服务器在内存...
3. **线程死锁**:多线程编程中,如果多个线程互相等待对方释放资源,可能会形成死锁,导致JVM无法继续执行。使用`jstack`命令可以分析线程状态,找出潜在的死锁问题。 4. **类加载器问题**:Java的类加载机制如果...
2. **GC日志分析**:检查垃圾收集器的日志,分析垃圾回收频率、耗时以及每次回收释放的内存,判断是否垃圾回收机制出现问题。 3. **代码审查**:查找可能导致内存泄漏的代码,如无用的对象引用、静态集合类中存储...
例如,在数据库中执行insert操作,如果第一次执行失败,第二次执行时可以继续插入数据,而不会出现重复插入的情况。在Java中,可以使用synchronized关键字来实现幂等性。 2.线程安全:在多线程环境中,需要确保线程...