Skip to main content
Documents
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

Java 运维

内容:部署、监控、日志、排错、性能、JVM、容器化、CI/CD、运维工具等。

1. 生产环境部署策略

✅ 推荐部署方式

优先顺序(从强到弱):

  1. 容器化 + Kubernetes(最佳)
  2. systemd 方式部署 JAR
  3. Supervisor
  4. 直接 nohup 后台跑(不推荐生产)

示例:systemd 运行 Java 程序

[Unit]
Description=My Java App
After=network.target

[Service]
User=www
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/java -Xms512m -Xmx512m -jar myapp.jar --spring.profiles.active=prod
SuccessExitStatus=143
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

2. Java 运维必备:JVM 参数标准规范

标准可用于生产的 JVM 参数

JAVA_OPTS="
  -Xms1024m
  -Xmx1024m
  -XX:+UseG1GC
  -XX:MaxGCPauseMillis=200
  -XX:+HeapDumpOnOutOfMemoryError
  -XX:HeapDumpPath=/opt/logs/heapdump.hprof
  -XX:+PrintGCDetails
  -XX:+PrintGCDateStamps
  -Xloggc:/opt/logs/gc.log
"

内存大小规则

  • 容器环境:

    Xms = Xmx = container_limit * 80%
    ``
    
  • 物理机:按内存 50%-70%

3. Java 在线监控(必会)

工具 用途
jps 查看 Java 进程
jstat GC、类加载统计
jstack 线程栈、死锁分析
jmap dump 内存、heap 查看
jcmd 万能工具,可以替代大部分命令
prometheus+jmx-exporter 最强 Java 监控

示例:查看 GC:

jstat -gc <pid> 1s 10

查看线程死锁:

jstack <pid>

导出 Heap dump:

jmap -dump:format=b,file=heap.hprof <pid>

4. Java 日志运维

生产建议采用:

  • logback
  • 日志按天滚动
  • 错误日志单独文件
  • JSON 日志(方便 ELK)

示例 logback:

<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    <fileNamePattern>/data/logs/app.%d{yyyy-MM-dd}.log.gz</fileNamePattern>
    <maxHistory>15</maxHistory>
</rollingPolicy>

5. Java 线上常见故障排查流程

CPU 100%

top  # 找到 java 进程 PID
top -Hp <pid>  # 找到占 CPU 的线程
printf "%x\n" <线程ID>  # 转换为十六进制
jstack <pid> | grep -A30 <0x线程ID>

内存泄漏

jmap -dump:format=b,file=heap.hprof <pid>

然后使用 MATVisualVM 分析。

GC 导致卡顿

查看 GC 日志:

tail -f gc.log

结合:

jstat -gcutil <pid> 1s

6. Java 服务优化(运维视角)

最推荐 GC

  • G1GC(JDK 11+ 默认)
  • 响应快、停顿低、维护简单

常见性能调优点

  • 避免日志量过大
  • 线程池设置合理
  • 限流 / 熔断(Sentinel / Resilience4j)
  • 数据库连接池正确配置(HikariCP)

示例 Hikari:

maximumPoolSize = CPU * 2 + 1
connectionTimeout = 30000
idleTimeout = 600000

7. 容器化 Java 运维(Kubernetes)

Dockerfile 最佳实践

FROM eclipse-temurin:17-jre

WORKDIR /app
COPY myapp.jar .

ENV JAVA_OPTS="-Xms512m -Xmx512m -XX:+UseG1GC"

ENTRYPOINT ["sh","-c","java $JAVA_OPTS -jar myapp.jar"]

Kubernetes 部署最佳实践

  • 设置 livenessProbe / readinessProbe
  • 设置 资源限制
  • 设置 滚动升级
  • 设置 日志 stdout:由容器平台收集

示例:

resources:
  requests:
    memory: "512Mi"
    cpu: "200m"
  limits:
    memory: "1024Mi"
    cpu: "1"

8. Java 运维必用工具

工具 用途
jvisualvm 本地监控
arthas 阿里开源神器,定位线上问题最强
MAT 分析 heap dump
jmc (Java Mission Control) 事件驱动监控(JDK17+)
Btrace 热修改、注入跟踪

Arthas 启动:

java -jar arthas-boot.jar

9. 日常运维 checklist

  • 监控 GC、CPU、RAM、线程
  • 定期 rotate 日志
  • 定期 dump 一次线程栈
  • 容器设置合理 JVM 参数
  • 服务自启动 systemd/Supervisor/k8s
  • 数据库连接池稳定
  • 限流、防雪崩
  • 观察健康检查是否成功