记录一次GC调优

背景:Java手游服务器,跨服出现明显的卡顿。 java version "1.8.0_40"

预测原因:怀疑是经常Full gc 导致进程卡顿。

解决方案:

调整Jvm参数,改为用G1gc -XX:+UseG1GC -XX:+UseStringDeduplication,放到正式环境观察。

对比数据。

gc次数和gc时间有明显的改进。

fgc次数减少89%。

### JVM GC Log 分析与性能方法 #### 1. **GC 的目标** GC 的主要目标是避免因垃圾回收而导致的程序性能下降。核心指标包括以下几个方面[^2]: - 吞吐量:执行用户代码的时间 / (执行用户代码时间 + GC 时间)。 - 延迟:GC 的暂停时间和业务逻辑执行时间内的延迟。 - 内存使用量:合理分配堆内存大小,防止频繁触发 Full GC。 #### 2. **发现和诊断问题的方法** ##### 使用工具监控 GC 行为 以下是常用的工具用于发现问题并分析其原因: - **jstat**: JDK 自带命令行工具,可提供详细的垃圾回收信息。 示例命令如下: ```bash jstat -gc <PID> 1000 5 ``` 参数说明:<PID> 是 Java 应用的进程 ID,`1000` 是每次统计之间的间隔(单位毫秒),`5` 是总统计次数。 - **VisualVM 和 Visual GC 插件**: 提供图形化界面,实时展示堆内存结构、变化趋势以及 GC 执行时间的趋势图。适用于开发环境中试,但在生产环境下可能会影响性能。 - **Prometheus + Grafana**: 高度定制化的监控解决方案,适合复杂的生产环境。需要运维团队支持配置和维护。 ##### 分析 GC 日志 GC 日志记录了每一次垃圾回收的行为细节,可以通过以下方式获取日志数据: 开启 GC 日志的方式是在启动 Java 程序时加入参数: ```bash -javaagent:<path-to-agent>.jar \ -Xlog:gc*:file=gc.log:time,uptime,pid,tid,level,tags:filecount=5,filesize=1M ``` 上述命令会生成名为 `gc.log` 的文件,并按每 1MB 切分最多保留 5 份日志文件[^4]。 #### 3. **GC 日志分析工具** 当 GC 日志数量庞大时,手动分析变得困难,因此可以借助专门的日志分析工具完成自动化处理: - **GCViewer**: 将原始 GC 日志转换为易于理解的可视化图表。运行示例如下: ```bash java -jar gcviewer_1.3.4.jar gc_log_file.log ``` - **gceasy.io**: 在线平台,只需上传本地 GC 文件即可获得直观的报告。它不仅提供了历史对比功能,还能够给出具体的化建议。 #### 4. **基于 GC 日志的性能策略** 根据 GC 日志中的关键字段进行针对性整: - 如果 Eden 区域经常被填满,则考虑增加年轻代 (`Young Generation`) 大小或者修改 `-Xmn` 参数。 - 若老年代 (`Old Generation`) 出现过多的对象堆积现象,需评估是否应该增大整个堆空间(`Heap Size`) 或者启用 G1 收集器以改善混合回收效率[^1]。 另外需要注意的是,在实际操作过程中应当遵循一定的原则[^3]: - 上线前尽可能预先设定好最合适的 JVM 参数组合; - 对于大部分应用场景来说,默认配置已经足够满足需求,无需额外干预; - 当遇到严重的 GC 性能瓶颈时,先排查是否存在低效编码习惯造成的资源浪费问题,比如过度创建短生命周期对象等行为。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值