Tianyi's Blog Tianyi's Blog
首页
  • 计算机网络
  • 操作系统
  • 计算机科学
  • Nginx
  • Vue框架
  • 环境配置
  • Java
  • JVM
  • Spring框架
  • Redis
  • MySQL
  • RabbitMQ
  • Kafka
  • Mirror Sites
  • Dev Tools
  • Docker
  • Jenkins
  • Scripts
  • Windows
  • 科学上网
  • 旅行
  • 网站日记
  • 软件
  • 电子产品
  • 杂野
  • 分类
  • 友情链接
GitHub (opens new window)

Tianyi

一直向前,永不停止
首页
  • 计算机网络
  • 操作系统
  • 计算机科学
  • Nginx
  • Vue框架
  • 环境配置
  • Java
  • JVM
  • Spring框架
  • Redis
  • MySQL
  • RabbitMQ
  • Kafka
  • Mirror Sites
  • Dev Tools
  • Docker
  • Jenkins
  • Scripts
  • Windows
  • 科学上网
  • 旅行
  • 网站日记
  • 软件
  • 电子产品
  • 杂野
  • 分类
  • 友情链接
GitHub (opens new window)
  • Java

  • Golang

  • JVM的奇妙世界

    • 虚拟机1-宏观视角
    • 虚拟机2-字节码
    • 虚拟机3-输入层
    • 虚拟机4-运行时数据区
    • 虚拟机5-垃圾收集器
    • 虚拟机6-调优
      • 优化参数
        • Best Practice
      • JVM监控
    • JVM调优
  • Spring

  • Spring增强封装

  • Redis

  • MySQL

  • RabbitMQ

  • Kafka

  • 分享

  • 后端
  • JVM的奇妙世界
tianyi
2024-06-12
目录

虚拟机6-调优

# 优化参数

JVM调优,主要调三块:一是堆内存大小,二是选垃圾收集器,三是年轻代大小。

但先说个前提:别一出问题就调参数,先查代码!内存溢出、奇怪问题,多半是代码漏了资源没关,就像篱笆破了羊跑了,光抓羊不修篱笆没用。调优前,确保代码没内存泄漏,再根据业务场景调,不然你就是在瞎搞!!!

调优得有数据,得加监控,收集性能数据,再动手。那怎么调?看这几步:

第一,选项基础。JVM参数分三类:

  • -(如-version),标准选项,任何JVM都认,没兼容问题。
  • -X(如-Xms),非标准但主流JVM都支持,基本稳定。
  • -XX(如-XX:+PrintGCDetails),不稳定参数,不同版本支持不同,随时可能废,用前查文档。加号开,减号关,记住了。

第二,实战建议。

  1. 垃圾收集器:我推荐G1。JDK 1.8就有,1.9默认,用-XX:+UseG1GC开就行。为啥选G1?简单、智能、不分代是趋势,参数少,Oracle敢默认放到1.9用。

  2. 堆大小:-Xms和-Xmx设一样,比如2GB起步,避免运行时动态调整,省开销。

    1. 怎么定大小?上线时设大点,跑几天看监控日志,找堆峰值,乘2或3就够了。
    2. 日志咋开?用-Xloggc:logs/gc.log设路径,-XX:+PrintGCTimeStamps看时间,-XX:+PrintGCDetails看详情
  3. 线程栈:-Xss256k。默认1MB太浪费,高并发下几千线程,内存扛不住。普通业务128k够,复杂点256k也行。若不够,检查代码,别指望调大解决问题。栈只存指针,256k装不下那就是程序的问题,效率早崩了。

  4. G1停顿:-XX:MaxGCPauseMillis=500。G1默认200毫秒停顿上限,调到500毫秒,多给点时间回收更多垃圾,减少GC次数,提升吞吐量。副作用是延迟高点,但半秒延迟用户感知不大,按业务调就行。

# Best Practice

这里做一个小总结

java -jar -XX:+UseG1GC -Xms2G -Xmx2G -Xss256k -XX:MaxGCPauseMillis=300 -Xloggc:/logs/gc.log -XX:+PrintGCTimeStamps -XX:+PrintGCDetails test.jar

## 参考配置参数
 -XX:+UseG1GC -Xms2G -Xmx2G -Xss256k -XX:MaxGCPauseMillis=300 -Xloggc:/logs/gc.log -XX:+PrintGCTimeStamps -XX:+PrintGCDetails

-Xss200k -Xms2g -Xmx2g -XX:MaxGCPauseMillis=100 -XX:G1HeapRegionSize=4m -XX:+UseG1GC -XX:ReservedCodeCacheSize=512m -XX:+AlwaysPreTouch
1
2
3
4
5
6

调优别瞎搞,先修代码,再看场景。G1配好堆和栈,日志监控定大小,停顿微调到500毫秒,基本够用。

# JVM监控

命令 说明 常用格式 注意点
jps 查看Java进程PID jps 简单高效,替代ps和netstat
jinfo 查看JVM环境与参数 jinfo 3669 > out.txt 静态数据,可存档分析
jstat 查看JVM内存及GC状态 jstat -gcutil 3669 1000 10 可改-gc看数值,或脚本长期跑
jstack 查看各线程调用方法堆栈 jstack -l 3669 线程多时需配合工具,不直接看
jmap 生产统计+ 生成堆dump文件 jmap -histo 3669 | head -n 20 jmap -dump:live,format=b,file=dump.hprof 3669 调优排错关键,live只dump存活对象
jhat dump分析工具 jhat dump.hprof 生产环境不推荐,安全性差
完善页面 (opens new window)
虚拟机5-垃圾收集器
JVM调优

← 虚拟机5-垃圾收集器 JVM调优→

最近更新
01
JDK
02-23
02
BadTasteCode && 优化
09-11
03
Gradle 实践操作指南及最佳实践
09-11
更多文章>
Theme by Vdoing | Copyright © 2021-2025 Tandy | 粤ICP备2023113440号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式