WebSphere教程FG007-WebSphere JVM配置与性能优化实战
本文档风哥主要介绍WebSphere Application Server 9.0.5的JVM配置与性能优化,包括JVM基础知识、内存模型、垃圾回收机制、参数配置、性能调优、监控分析等内容,风哥教程参考WebSphere官方文档性能调优章节,适合WebSphere管理员在学习和测试中使用,如果要应用于生产环境则需要自行确认。更多视频教程www.fgedu.net.cn
Part01-基础概念与理论知识
1.1 JVM基础知识介绍
JVM(Java Virtual Machine)是Java程序运行的基础,WebSphere应用服务器运行在JVM之上。理解JVM的工作原理对于WebSphere性能优化至关重要。学习交流加群风哥微信: itpux-com
- 类加载器:加载Java类到JVM
- 运行时数据区:方法区、堆、栈、程序计数器
- 执行引擎:解释器、JIT编译器、GC
- 本地接口:与本地库交互
1.1.1 WebSphere使用的JVM
WebSphere 9.0.5使用IBM J9 VM(基于Java SE 8)
# 查看JVM版本
/WebSphere/app/java/bin/java -version
java version “1.8.0_401”
Java(TM) SE Runtime Environment (build 1.8.0_401-b09)
IBM J9 VM (build 2.9, JRE 1.8.0 Linux amd64-64-Bit Compressed References 20240315_123456 (JIT enabled, AOT enabled)
OpenJ9 – 123456
OMR – 123456
IBM – 123456)
# JVM位置
/WebSphere/app/java/
# JVM主要目录
├── bin/ # JVM可执行文件
├── lib/ # JVM库文件
├── jre/ # JRE运行环境
└── ext/ # 扩展库
1.2 JVM内存模型详解
JVM内存模型是理解JVM性能的关键:
1.2.1 JVM内存区域
┌─────────────────────────────────────────────────────────┐
│ JVM内存模型 │
├─────────────────────────────────────────────────────────┤
│ ┌─────────────────────────────────────────────────┐ │
│ │ 堆内存(Heap) │ │
│ │ ┌─────────────┐ ┌─────────────────────────┐ │ │
│ │ │ 新生代 │ │ 老年代 │ │ │
│ │ │ ┌───┬───┬───┐│ │ │ │ │
│ │ │ │Eden│S0 │S1 ││ │ │ │ │
│ │ │ └───┴───┴───┘│ │ │ │ │
│ │ └─────────────┘ └─────────────────────────┘ │ │
│ └─────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 方法区 │ │ 程序计数器 │ │ JVM栈 │ │
│ │ (Metaspace) │ │ │ │ │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ 本地方法栈 │ │ 直接内存 │ │
│ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────────────┘
# 内存区域说明
堆内存(Heap):
– 存储对象实例
– GC主要工作区域
– 可通过-Xms/-Xmx配置
新生代(Young Generation):
– Eden区:新对象首先分配
– Survivor区:S0和S1,用于复制算法
– 默认占堆的1/3
老年代(Old Generation):
– 存储长期存活对象
– 默认占堆的2/3
方法区(Metaspace):
– 存储类元数据
– Java 8后使用本地内存
– 可通过-XX:MetaspaceSize配置
JVM栈:
– 每个线程一个栈
– 存储局部变量和方法调用
– 可通过-Xss配置
1.2.2 内存配置参数
堆内存配置:
-Xms
-Xmx
-Xmn
新生代配置:
-XX:NewSize=
-XX:MaxNewSize=
-XX:NewRatio=
-XX:SurvivorRatio=
元空间配置:
-XX:MetaspaceSize=
-XX:MaxMetaspaceSize=
线程栈配置:
-Xss
直接内存配置:
-XX:MaxDirectMemorySize=
# 配置示例
-Xms4096m -Xmx8192m -Xmn2048m
-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m
-Xss512k
1.3 JVM垃圾回收机制
JVM垃圾回收是自动内存管理的核心:
1.3.1 垃圾回收器类型
1. Serial GC(串行GC)
– 单线程执行GC
– 适合小型应用
– 参数:-XX:+UseSerialGC
2. Parallel GC(并行GC)
– 多线程执行GC
– 吞吐量优先
– WebSphere默认GC
– 参数:-XX:+UseParallelGC
3. CMS GC(并发标记清除)
– 低停顿时间
– 适合响应时间敏感应用
– 参数:-XX:+UseConcMarkSweepGC
4. G1 GC(Garbage First)
– 分代收集
– 可预测停顿时间
– 适合大内存应用
– 参数:-XX:+UseG1GC
# GC类型对比
GC类型 停顿时间 吞吐量 内存占用 适用场景
─────────────────────────────────────────────────────
Serial 长 高 低 小型应用
Parallel 中 最高 中 批处理应用
CMS 短 中 高 响应敏感应用
G1 可控 高 高 大内存应用
1.3.2 GC工作流程
新生代GC(Minor GC):
1. Eden区满时触发
2. 存活对象复制到Survivor区
3. Survivor区对象年龄+1
4. 年龄达到阈值晋升老年代
老年代GC(Major GC / Full GC):
1. 老年代空间不足时触发
2. 回收老年代和新生代
3. 停顿时间较长
# GC日志示例
[GC (Allocation Failure) [PSYoungGen: 204800K->20480K(230400K)] 204800K->20480K(768000K), 0.0251234 secs] [Times: user=0.05 sys=0.00, real=0.03 secs]
[Full GC (Ergonomics) [PSYoungGen: 20480K->0K(230400K)] [PSOldGen: 512000K->51200K(537600K)] 532480K->51200K(768000K), [Metaspace: 65536K->65536K(1114112K)], 0.5123456 secs] [Times: user=0.50 sys=0.01, real=0.51 secs]
# GC日志参数
-Xverbosegclog:/WebSphere/logs/gc.log
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-XX:+PrintGCTimeStamps
1.4 JVM参数分类说明
JVM参数分为标准参数和非标准参数:
1.4.1 参数分类
标准参数(-):
– 所有JVM都支持
– 例如:-Xms, -Xmx, -Xss
非标准参数(-X):
– 大部分JVM支持
– 例如:-Xmn, -Xss
扩展参数(-XX):
– 特定JVM支持
– 布尔型:-XX:+
# 常用参数分类
内存参数:
-Xms, -Xmx, -Xmn, -Xss
-XX:NewSize, -XX:MaxNewSize
-XX:MetaspaceSize, -XX:MaxMetaspaceSize
GC参数:
-XX:+UseSerialGC
-XX:+UseParallelGC
-XX:+UseConcMarkSweepGC
-XX:+UseG1GC
性能参数:
-XX:+AggressiveOpts
-XX:+UseCompressedOops
-XX:InitiatingHeapOccupancyPercent
调试参数:
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-Xverbosegclog
Part02-生产环境规划与建议
2.1 JVM内存规划
JVM内存规划需要考虑多个因素:
2.1.1 内存规划原则
1. 堆内存规划
– 初始堆与最大堆设置为相同值,避免动态扩展
– 堆内存不超过物理内存的50%
– 为操作系统和其他进程预留足够内存
2. 新生代规划
– 新生代大小为堆内存的1/3到1/2
– 高频创建对象的应用可适当增大新生代
– Survivor区比例根据对象存活时间调整
3. 元空间规划
– 根据应用类数量设置
– 大型应用建议512MB以上
– 设置最大值防止内存泄漏
4. 线程栈规划
– 默认1MB通常足够
– 递归调用多的应用可适当增大
– 线程数多的应用可适当减小
# 不同规模内存规划
小型应用(8GB物理内存):
-Xms2048m -Xmx4096m
-Xmn1024m
-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m
-Xss512k
中型应用(32GB物理内存):
-Xms8192m -Xmx16384m
-Xmn4096m
-XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=1024m
-Xss512k
大型应用(128GB物理内存):
-Xms32768m -Xmx65536m
-Xmn16384m
-XX:MetaspaceSize=1024m -XX:MaxMetaspaceSize=2048m
-Xss1m
2.2 JVM垃圾回收器选择
选择合适的垃圾回收器对性能至关重要:
2.2.1 GC选择指南
应用特征分析:
1. 响应时间要求
– 高响应要求:CMS或G1
– 一般响应要求:Parallel或G1
2. 吞吐量要求
– 高吞吐量要求:Parallel
– 平衡吞吐量:G1
3. 内存大小
– 小于4GB:Serial或Parallel
– 4GB-16GB:Parallel或G1
– 大于16GB:G1
4. CPU核心数
– 单核或双核:Serial
– 多核:Parallel或G1
# 推荐配置
批处理应用:
-XX:+UseParallelGC
-XX:ParallelGCThreads=8
Web应用(响应敏感):
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
大内存应用:
-XX:+UseG1GC
-XX:G1HeapRegionSize=16m
-XX:MaxGCPauseMillis=500
2.3 JVM性能调优策略
JVM性能调优需要系统化的方法:
2.3.1 调优流程
1. 基准测试
– 建立性能基线
– 记录关键指标
– 确定调优目标
2. 问题分析
– 分析GC日志
– 识别性能瓶颈
– 确定调优方向
3. 参数调整
– 一次调整一个参数
– 记录每次调整
– 测试调整效果
4. 效果验证
– 对比调优前后
– 验证是否达标
– 记录调优结果
# 调优目标
响应时间优化:
– 减少GC停顿时间
– 使用低延迟GC
– 优化内存分配
吞吐量优化:
– 减少GC频率
– 使用高吞吐GC
– 增加堆内存
内存使用优化:
– 减少内存占用
– 优化对象生命周期
– 解决内存泄漏
2.4 JVM监控规划
JVM监控是性能优化的基础:
2.4.1 监控指标
内存指标:
– 堆内存使用率
– 新生代使用率
– 老年代使用率
– 元空间使用率
GC指标:
– GC频率
– GC停顿时间
– GC吞吐量
– 对象晋升速率
线程指标:
– 线程数量
– 线程状态分布
– 死锁检测
类加载指标:
– 类加载数量
– 类卸载数量
# 监控工具
命令行工具:
jstat:JVM统计监控
jmap:内存映射工具
jstack:线程堆栈工具
jinfo:配置信息工具
图形工具:
JConsole:JMX监控
VisualVM:综合监控
JMC:Java Mission Control
WebSphere工具:
PMI:性能监控基础设施
TPV:Tivoli Performance Viewer
Part03-生产环境项目实施方案
3.1 WebSphere JVM配置实战
WebSphere JVM配置操作:
3.1.1 通过管理控制台配置
步骤:
1. 登录管理控制台
https://fgedu-dmgr.net.cn:9043/ibm/console
2. 导航到JVM配置
服务器 > 服务器类型 > WebSphere应用程序服务器
> server1 > Java和进程管理 > 进程定义 > Java虚拟机
3. 配置堆内存
初始堆大小:8192
最大堆大小:16384
4. 配置通用JVM参数
-Xmn4096m
-XX:MetaspaceSize=512m
-XX:MaxMetaspaceSize=1024m
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-Xverbosegclog:/WebSphere/logs/gc.log
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
5. 保存并重启服务器
3.1.2 通过wsadmin配置
# 连接wsadmin
/WebSphere/app/profiles/Dmgr01/bin/wsadmin.sh -lang jython \
-username fgeduadmin -password fgedu123
# 获取服务器ID
server = AdminConfig.getid(‘/Cell:fgeduCell01/Node:fgeduNode01/Server:server1/’)
# 获取JVM配置
jvm = AdminConfig.list(‘JavaVirtualMachine’, server)
print jvm
# 设置堆内存
AdminConfig.modify(jvm, ‘[[initialHeapSize 8192] [maximumHeapSize 16384]]’)
# 设置通用JVM参数
jvmArgs = ‘-Xmn4096m -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=1024m -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -Xverbosegclog:/WebSphere/logs/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps’
AdminConfig.modify(jvm, ‘[[genericJvmArguments “‘ + jvmArgs + ‘”]]’)
# 保存配置
AdminConfig.save()
# 同步节点
AdminNodeManagement.syncActiveNodes()
# 退出
exit
# 重启服务器
/WebSphere/app/profiles/AppSrv01/bin/stopServer.sh server1
/WebSphere/app/profiles/AppSrv01/bin/startServer.sh server1
3.1.3 验证JVM配置
1. 查看进程参数
ps -ef | grep java | grep server1
websphere 12345 1 5 10:00 ? 00:01:23 /WebSphere/app/java/bin/java \
-Xms8192m -Xmx16384m -Xmn4096m \
-XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=1024m \
-XX:+UseG1GC -XX:MaxGCPauseMillis=200 \
-Xverbosegclog:/WebSphere/logs/gc.log \
-XX:+PrintGCDetails -XX:+PrintGCDateStamps \
…
2. 使用jinfo查看
jinfo -flags $(pgrep -f “server1”)
Attaching to process ID 12345, please wait…
Non-default VM flags:
-XX:InitialHeapSize=8589934592
-XX:MaxHeapSize=17179869184
-XX:MaxMetaspaceSize=1073741824
-XX:MetaspaceSize=536870912
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
3. 查看内存使用
jmap -heap $(pgrep -f “server1”)
Attaching to process ID 12345, please wait…
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 17179869184 (16384.0MB)
NewSize = 4294967296 (4096.0MB)
Heap Usage:
G1 Heap:
capacity = 17179869184 (16384.0MB)
used = 4294967296 (4096.0MB)
free = 12884901888 (12288.0MB)
25.0% used
3.2 JVM垃圾回收配置实战
JVM垃圾回收配置操作:
3.2.1 Parallel GC配置
适用场景:批处理应用、高吞吐量应用
# JVM参数
-XX:+UseParallelGC
-XX:+UseParallelOldGC
-XX:ParallelGCThreads=8
-XX:NewRatio=2
-XX:SurvivorRatio=8
# 配置说明
ParallelGCThreads:并行GC线程数,建议设置为CPU核心数
NewRatio:老年代与新生代比例,默认2(老年代:新生代=2:1)
SurvivorRatio:Eden与Survivor比例,默认8(Eden:S0:S1=8:1:1)
# 通过wsadmin配置
jvmArgs = ‘-XX:+UseParallelGC -XX:+UseParallelOldGC -XX:ParallelGCThreads=8 -XX:NewRatio=2 -XX:SurvivorRatio=8’
AdminConfig.modify(jvm, ‘[[genericJvmArguments “‘ + jvmArgs + ‘”]]’)
AdminConfig.save()
# GC日志示例
[GC [PSYoungGen: 2097152K->262144K(2359296K)] 2097152K->262144K(7864320K), 0.0523456 secs] [Times: user=0.15 sys=0.02, real=0.05 secs]
[Full GC [PSYoungGen: 262144K->0K(2359296K)] [PSOldGen: 0K->262144K(5505024K)] 262144K->262144K(7864320K), [Metaspace: 131072K->131072K(1155072K)], 0.3123456 secs] [Times: user=0.30 sys=0.01, real=0.31 secs]
3.2.2 G1 GC配置
适用场景:大内存应用、响应时间敏感应用
# JVM参数
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:G1HeapRegionSize=16m
-XX:InitiatingHeapOccupancyPercent=45
-XX:G1ReservePercent=10
-XX:ParallelGCThreads=8
-XX:ConcGCThreads=2
# 配置说明
MaxGCPauseMillis:最大GC停顿时间目标
G1HeapRegionSize:Region大小,建议为堆大小的1/2048
InitiatingHeapOccupancyPercent:触发并发GC的堆占用百分比
G1ReservePercent:保留内存百分比
ParallelGCThreads:并行GC线程数
ConcGCThreads:并发GC线程数
# 通过wsadmin配置
jvmArgs = ‘-XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:G1HeapRegionSize=16m -XX:InitiatingHeapOccupancyPercent=45 -XX:G1ReservePercent=10 -XX:ParallelGCThreads=8 -XX:ConcGCThreads=2’
AdminConfig.modify(jvm, ‘[[genericJvmArguments “‘ + jvmArgs + ‘”]]’)
AdminConfig.save()
# GC日志示例
[GC pause (G1 Evacuation Pause) (young), 0.0152345 secs]
[Parallel Time: 12.3 ms, GC Workers: 8]
[GC Worker Start (ms): Min: 123.4, Avg: 123.5, Max: 123.6, Diff: 0.2]
[Ext Root Scanning (ms): Min: 1.2, Avg: 1.5, Max: 2.1, Diff: 0.9]
[Update RS (ms): Min: 0.5, Avg: 0.8, Max: 1.2, Diff: 0.7]
[Scan RS (ms): Min: 0.3, Avg: 0.5, Max: 0.8, Diff: 0.5]
[Code Root Scanning (ms): Min: 0.1, Avg: 0.2, Max: 0.3, Diff: 0.2]
[Object Copy (ms): Min: 5.2, Avg: 6.1, Max: 7.3, Diff: 2.1]
[Termination (ms): Min: 0.1, Avg: 0.3, Max: 0.5, Diff: 0.4]
[Eden: 2048.0M(2048.0M)->0.0B(2048.0M) Survivors: 256.0M->256.0M Heap: 4096.0M(16384.0M)->2048.0M(16384.0M)]
[Times: user=0.08 sys=0.01, real=0.02 secs]
3.3 JVM监控与分析实战
JVM监控与分析操作:
3.3.1 使用jstat监控
1. 查看GC统计
jstat -gc $(pgrep -f “server1”) 1000 10
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
25600 25600 0.0 20480.0 204800.0 102400.0 1048576.0 204800.0 65536 61440 8192 7680 15 0.512 2 0.234 0.746
25600 25600 0.0 20480.0 204800.0 112640.0 1048576.0 204800.0 65536 61440 8192 7680 15 0.512 2 0.234 0.746
…
# 字段说明
S0C/S1C:Survivor区容量
S0U/S1U:Survivor区使用量
EC/EU:Eden区容量/使用量
OC/OU:老年代容量/使用量
MC/MU:元空间容量/使用量
YGC/YGCT:Young GC次数/时间
FGC/FGCT:Full GC次数/时间
2. 查看GC汇总
jstat -gcutil $(pgrep -f “server1”)
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 80.00 50.00 19.53 93.75 93.75 15 0.512 2 0.234 0.746
3. 查看GC原因
jstat -gccause $(pgrep -f “server1”)
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT LGCC GCC
0.00 80.00 50.00 19.53 93.75 93.75 15 0.512 2 0.234 0.746 Allocation Failure No GC
4. 查看类加载
jstat -class $(pgrep -f “server1”)
Loaded Bytes Unloaded Bytes Time
12345 23456.7 12 123.4 15.23
3.3.2 分析GC日志
1. 查看GC日志
tail -100 /WebSphere/logs/gc.log
2. 使用GC日志分析工具
# GCViewer(开源工具)
java -jar gcviewer.jar /WebSphere/logs/gc.log
# GCEasy(在线工具)
# https://gceasy.io/
3. 关键指标分析
GC频率:
– Young GC频率:每秒几次到每分钟几次
– Full GC频率:应该很少,每小时不超过1次
GC停顿时间:
– Young GC停顿:通常几十毫秒
– Full GC停顿:通常几百毫秒到几秒
内存使用:
– 老年代使用率:不应持续增长
– 元空间使用率:稳定后不应增长
# GC分析脚本
#!/bin/bash
# gc_analyze.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
GC_LOG=/WebSphere/logs/gc.log
echo “=== GC分析报告 ===”
# Young GC次数
YGC_COUNT=$(grep -c “GC (” $GC_LOG)
echo “Young GC次数: $YGC_COUNT”
# Full GC次数
FGC_COUNT=$(grep -c “Full GC” $GC_LOG)
echo “Full GC次数: $FGC_COUNT”
# 平均GC时间
echo “最近10次GC时间:”
grep “GC (” $GC_LOG | tail -10 | grep -oP ‘\d+\.\d+ secs’ | head -10
echo “=== 分析完成 ===”
3.4 JVM故障诊断实战
JVM故障诊断操作:
3.4.1 内存溢出诊断
1. 启用堆转储
# JVM参数添加
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/WebSphere/logs/
2. 手动生成堆转储
jmap -dump:format=b,file=/WebSphere/logs/heap.hprof $(pgrep -f “server1”)
Dumping heap to /WebSphere/logs/heap.hprof …
Heap dump file created
3. 分析堆转储
# 使用MAT(Memory Analyzer Tool)
# 或使用jhat
jhat -J-Xmx4g /WebSphere/logs/heap.hprof
Reading from /WebSphere/logs/heap.hprof…
Dump file created Fri Apr 10 10:00:00 CST 2026
Snapshot read, resolving…
Resolving 1234567 objects…
Chasing references, expect 246 dots…
Eliminating duplicate references…
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.
# 浏览器访问 http://localhost:7000
4. 常见内存泄漏原因
– 静态集合类持有对象引用
– 未关闭的资源(连接、流)
– 监听器未注销
– ThreadLocal未清理
– 缓存未设置过期策略
3.4.2 CPU高使用诊断
1. 查找高CPU线程
# 获取Java进程ID
PID=$(pgrep -f “server1”)
# 查看线程CPU使用
top -H -p $PID
top – 10:00:00 up 30 days, 10:00, 1 user, load average: 5.00, 4.50, 4.00
Threads: 100 total, 5 running, 95 sleeping, 0 stopped, 0 zombie
%Cpu(s): 80.0 us, 10.0 sy, 0.0 ni, 5.0 id, 0.0 wa, 0.0 hi, 5.0 si
…
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
12345 websphere 20 0 16.000g 8.000g 51200 R 80.0 25.0 0:10.23 java
12346 websphere 20 0 16.000g 8.000g 51200 R 75.0 25.0 0:09.87 java
2. 生成线程转储
# 方式1:使用kill -3
kill -3 $PID
# 方式2:使用jstack
jstack $PID > /WebSphere/logs/thread_dump.txt
# 方式3:使用wsadmin
AdminTask.dumpThreads(‘[-nodeName fgeduNode01 -serverName server1]’)
3. 分析线程转储
# 查找高CPU线程
# 将线程ID转换为16进制
printf “%x\n” 12345
3039
# 在线程转储中查找
grep -A 20 “nid=0x3039” /WebSphere/logs/thread_dump.txt
“http-9080-123” – Thread t@12345
java.lang.Thread.State: RUNNABLE
at com.fgedu.app.FgeduService.process(FgeduService.java:123)
at com.fgedu.app.FgeduController.handle(FgeduController.java:45)
…
4. 常见CPU高使用原因
– 死循环
– 正则表达式回溯
– 频繁GC
– 加密运算
– 序列化/反序列化
Part04-生产案例与实战讲解
4.1 JVM内存调优案例
某企业JVM内存调优案例:
4.1.1 案例背景
企业背景:
– 应用类型:电商系统
– 并发用户:5000
– 服务器配置:32核CPU,128GB内存
– 问题:频繁Full GC,响应慢
调优前配置:
-Xms4096m -Xmx4096m
-XX:+UseParallelGC
问题分析:
1. 堆内存偏小,对象快速晋升老年代
2. Parallel GC停顿时间长
3. 没有启用GC日志
# 调优目标
– 减少Full GC频率
– 降低GC停顿时间
– 提高响应速度
4.1.2 调优实施
1. 调整堆内存
# 增大堆内存到32GB
-Xms16384m -Xmx32768m
2. 调整新生代
# 增大新生代到8GB
-Xmn8192m
3. 切换GC
# 使用G1 GC
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
4. 启用GC日志
-Xverbosegclog:/WebSphere/logs/gc.log
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
# 完整配置
-Xms16384m -Xmx32768m -Xmn8192m
-XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=1024m
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:G1HeapRegionSize=16m
-XX:InitiatingHeapOccupancyPercent=45
-Xverbosegclog:/WebSphere/logs/gc.log
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
# 调优效果
调优前:
– Full GC频率:每10分钟1次
– Full GC停顿:2-3秒
– 响应时间:500ms
调优后:
– Full GC频率:每2小时1次
– GC停顿:200ms以内
– 响应时间:100ms
4.2 JVM GC优化案例
JVM GC优化案例:
4.2.1 案例背景
企业背景:
– 应用类型:支付系统
– 并发用户:10000
– 服务器配置:64核CPU,256GB内存
– 问题:GC停顿导致交易超时
调优前配置:
-Xms65536m -Xmx65536m
-XX:+UseParallelGC
问题分析:
1. Parallel GC停顿时间长(500ms+)
2. 大内存不适合Parallel GC
3. 支付系统对响应时间敏感
# 调优目标
– GC停顿控制在100ms以内
– 避免交易超时
4.2.2 调优实施
1. 切换到G1 GC
-XX:+UseG1GC
-XX:MaxGCPauseMillis=100
2. 优化G1参数
-XX:G1HeapRegionSize=32m
-XX:InitiatingHeapOccupancyPercent=40
-XX:G1ReservePercent=15
-XX:G1HeapWastePercent=5
-XX:G1MixedGCCountTarget=16
3. 并发GC线程优化
-XX:ParallelGCThreads=16
-XX:ConcGCThreads=4
# 完整配置
-Xms65536m -Xmx65536m
-XX:MetaspaceSize=1024m -XX:MaxMetaspaceSize=2048m
-XX:+UseG1GC
-XX:MaxGCPauseMillis=100
-XX:G1HeapRegionSize=32m
-XX:InitiatingHeapOccupancyPercent=40
-XX:G1ReservePercent=15
-XX:G1HeapWastePercent=5
-XX:G1MixedGCCountTarget=16
-XX:ParallelGCThreads=16
-XX:ConcGCThreads=4
-Xverbosegclog:/WebSphere/logs/gc.log
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
# 调优效果
调优前:
– GC停顿:500ms+
– 交易超时率:5%
调优后:
– GC停顿:80ms
– 交易超时率:0.1%
4.3 JVM故障处理案例
JVM故障处理案例:
4.3.1 内存溢出故障
故障现象:
服务器崩溃,日志显示:
java.lang.OutOfMemoryError: Java heap space
故障诊断:
1. 检查堆内存配置
-Xms4096m -Xmx4096m
2. 分析堆转储
# 加载heap.hprof到MAT
# 发现大对象:com.fgedu.cache.DataCache
3. 分析代码
# 发现缓存没有设置过期时间
# 数据持续增长直到OOM
解决方案:
1. 增加堆内存
-Xms8192m -Xmx16384m
2. 修复代码
# 添加缓存过期策略
cache.expire(3600); // 1小时过期
3. 启用OOM时堆转储
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/WebSphere/logs/
# 验证结果
# 系统稳定运行,无OOM
4.3.2 死锁故障
故障现象:
应用响应慢,部分请求无响应
故障诊断:
1. 检查线程状态
jstack $(pgrep -f “server1”) | grep -A 5 “BLOCKED”
2. 分析线程转储
Found one Java-level deadlock:
=============================
“Thread-1”:
waiting to lock monitor 0x00007f1234567890 (object 0x0000000123456789, a com.fgedu.service.FgeduService),
which is held by “Thread-2”
“Thread-2”:
waiting to lock monitor 0x00007f1234567891 (object 0x000000012345678a, a com.fgedu.service.FgeduService),
which is held by “Thread-1”
Java stack information for the threads listed above:
===================================================
“Thread-1”:
at com.fgedu.service.FgeduService.methodA(FgeduService.java:100)
– waiting to lock <0x0000000123456789>
– locked <0x000000012345678a>
“Thread-2”:
at com.fgedu.service.FgeduService.methodB(FgeduService.java:200)
– waiting to lock <0x000000012345678a>
– locked <0x0000000123456789>
解决方案:
1. 重启服务器恢复服务
/WebSphere/app/profiles/AppSrv01/bin/stopServer.sh server1
/WebSphere/app/profiles/AppSrv01/bin/startServer.sh server1
2. 修复代码
# 统一锁获取顺序
# 使用tryLock设置超时
# 使用并发工具类替代手动加锁
# 验证结果
# 系统稳定运行,无死锁
Part05-风哥经验总结与分享
5.1 JVM调优检查清单
JVM调优检查清单:
配置检查:
□ 堆内存设置合理
□ 新生代大小合理
□ 元空间大小合理
□ GC类型选择正确
□ GC参数配置正确
□ GC日志已启用
监控检查:
□ 内存使用监控
□ GC频率监控
□ GC停顿监控
□ 线程数量监控
□ CPU使用监控
优化检查:
□ 基准测试已完成
□ 调优目标明确
□ 参数调整有记录
□ 效果已验证
□ 文档已更新
# JVM调优流程
1. 建立基线
2. 分析问题
3. 制定方案
4. 实施调整
5. 验证效果
6. 持续监控
5.2 JVM常见问题
JVM常见问题及解决方案:
5.2.1 常见问题汇总
问题1:频繁Full GC
原因:堆内存不足、内存泄漏、大对象
解决:增大堆内存、修复内存泄漏、优化对象
问题2:GC停顿长
原因:堆内存大、GC类型不合适
解决:使用G1 GC、调整GC参数
问题3:内存溢出
原因:堆内存不足、内存泄漏
解决:增大堆内存、修复内存泄漏
问题4:CPU高使用
原因:死循环、频繁GC、线程多
解决:优化代码、调整JVM、减少线程
问题5:类加载失败
原因:类路径错误、类版本冲突
解决:检查类路径、解决冲突
问题6:线程死锁
原因:锁获取顺序不一致
解决:统一锁顺序、使用并发工具
5.3 JVM最佳实践
基于多年WebSphere运维经验,总结JVM最佳实践:
5.3.1 配置原则
- 内存配置:初始堆与最大堆设置为相同值
- GC选择:根据应用特点选择合适的GC
- 日志启用:生产环境必须启用GC日志
- 监控完善:建立完善的监控体系
5.3.2 调优建议
- 先监控后调优:基于数据做决策
- 一次一个参数:便于分析效果
- 测试环境验证:生产前充分测试
- 记录调优过程:便于回溯和分享
本文档详细介绍了WebSphere 9.0.5的JVM配置与性能优化,包括JVM基础知识、内存模型、垃圾回收机制、参数配置、性能调优、监控分析等内容。通过学习本文档,读者可以掌握WebSphere JVM调优的方法和最佳实践,提升应用性能。更多视频教程www.fgedu.net.cn
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
