Java 性能
2023-05-05 09:40:59 0 举报
AI智能生成
Java 性能优化总结。
作者其他创作
大纲/内容
⭐ 性能监控与故障处理
参数配置
基本参数
内存区域
堆初始值:-Xms
堆最大值:-Xmx
堆新生代:-Xmn
初始值:-XX:NewSize
最大值:-XX:MaxNewSize
JVM 栈:-Xss
直接内存最大值:-XX:MaxDirectMemorySize
方法区
初始值:-XX:PermSize
最大值:-XX:MaxPermSize
JIT
JIT 编译代码区大小:-XX:ReservedCodeCacheSize
其他
IntegerCache 大小:-XX:AutoBoxCacheMax
随机数生成器:-Djava.security.egd=file:/dev/urandom
减少异常栈输出:-XX:-OmitStackTraceInFastThrow
取消偏向锁:-XX:-UseBiasedLocking
日志参数
打印详细 GC 日志:-XX:+PrintGCDetails
打印 GC 发生时间戳:-XX:+PrintGCTimeStamps
打印对象引用状态:-XX:+PrintReferenceGC
GC 日志写入磁盘文件:-Xloggc:gc.log
保存堆转储快照:-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=xxx.bin
通用优化参数
空间分配担保:-XX:+HandlePromotionFailure
内存预分配:-XX:+AlwaysPreTouch
Survivor 与 Eden 区占比:-XX:SurvivorRatio
进入老年代年龄阈值:-XX:MaxTenuringThreshold
进入老年代内存阈值:-XX:PretenureSizeThreshold
GC 优化
使用 ParNew + CMS
-XX:+UseParNewGC
-XX:+UseConcMarkSweepGC
并行执行 GC:-XX:ExplicitGCInvokesConcurrent
触发 Full GC 的老年代内存阈值:-XX:CMSInitiatingOccupancyFaction
执行 Full GC 后对老年代进行碎片整理:-XX:+UseCMSCompactAtFullCollection
执行 x 次 Full GC 后对老年代进行碎片整理:-XX:CMSFullGCsBeforeCompaction
并行处理 Reference 对象:-XX:+ParallelRefProcEnabled
在 CMS 重新标记阶段之前的 YGC:-XX:+CMSScavengeBeforeRemark
触发 CMS 收集的阈值:-XX:CMSInitiatingOccupancyFraction
启用自定义的触发 CMS 收集的阈值:-XX:+UseCMSInitiatingOccupancyOnly
使用 G1
-XX:+UseG1GC
单个区域大小:-XX:G1HeapRegionSize
新生代默认占比:-XX:G1NewSizePercent
新生代最大占比:-XX:G1MaxNewSizePercent
GC 最长可停顿时间:-XX:MaxGCPauseMills
触发混合回收的老年代内存阈值:-XX:InitiatingHeapOccupancyPercent
最后阶段混合回收执行次数:-XX:G1MixedGCCountTarget
停止执行回收的内存比例阈值:-XX:G1HeapWastePercent
开始执行回收的内存比例阈值:-XX:G1MixedGCLiveThresholdPercent
并发收集使用的线程数量:-XX:ConcGCThreads
字符串排重:-XX:+UseStringDeduplication
生产部署
单节点单 JVM
单节点逻辑集群
系统监控
监控工具
JVM 工具
命令行工具
jps :JVM 进程状况
-m:输出启动时传递给 main 方法参数
-l:输出主类全名(JAR 包路径)
-v:输出 JVM 启动参数
jstat:JVM 统计信息监视
-class
-gcutil
-gccause
-gc [new|old|perm] [capacity]
-compiler
-printcompilation
-gccapacity
-gcnew
-gcnewcapacity
-gcoldcapacity
-gcmetacapacity
jinfo:Java 配置信息工具
jmap:Java 内存映射工具
-heap
-dump
-finalizerinfo
-histo
-permstat
-F
jstack:Java 堆栈跟踪工具
-F:没有响应时强制输出
-l:锁相关信息
-m:调用本地方法时显示 C/C++ 堆栈
jstatd:远程主机信息收集
hprof:性能统计工具
HSDIS:JIT 生成代码反汇编
jhat:JVM 堆转储快照分析
jcmd:多功能命令行
perf 和 gperftools:Native 调用分析
图形化工具
VisualVM:多合一故障处理工具
JMC:虚拟机诊断工具
MAT:多功能分析工具
JConsole:Java 监视与管理控制台
GC 分析:GCeasy
Linux 工具
系统资源使用情况:top
监控内存和 CPU:vmstat
监控 I/O 使用:iostat
多功能诊断器:pidstat
进程状况:ps
进程崩溃信息:dmesg
字节码工具
javap
jclasslib
JMX
Jolokia
其他工具
Arthas
监控指标
监控体系搭建
InfluxDB
Telegraf
Grafana
Spring Boot
性能调优
业务分析
基本思路
垃圾收集器
数据结构
日志分析
字段信息
预估性优化
资源评估
调优案例
测试优化
线上监控
调优案例
批处理系统 GC 缓慢
使用 CMS
使用 G1
其他优化
问题排查
链路分析
结合 jprofiler 分析火焰图
内存泄漏
保留现场
服务器
网络
进程
CPU
磁盘
内存
其他
案例分析
JVM
进程快照
堆快照
栈快照
堆
泄漏现象
HaspMap 错误
字符串 intern
文件未正常关闭
直接内存
基本现象
案例分析
使用工具
pmap
gdb
perf
gperftools
解决问题
接口服务阻塞
线程堆栈分析
代码分析
CPU 负载过高
代码中的死循环
定位线程
监听方法调用情况
使用 OGNL 检测代码
GC 效果不理想
定位线程
热更新代码
*《Java 性能权威指南》
明确优化与性能
JVM 概览
硬件与操作系统
性能测试模式与反模式
微基准测试与统计
理解垃圾收集
垃圾收集高级话题
垃圾收集日志、监控、调优及工具
JVM 上的代码执行
理解即时编译
Java 语言性能技术
并发性能技术
剖析
高性能日志和消息系统
Java 9 以及 Java 的未来方向
导论
性能测试方法
测试真实应用
微基准测试
必须使用被测的结果
不要包含无关的操作
必须输入合理的参数
热身期
编译效应
宏基准测试
介基准测试
理解批处理流逝时间、吞吐量和响应时间
用统计方法应对性能变化
尽早频繁测试
Java 性能调优工具箱
操作系统工具和分析
CPU 监控
CPU 使用率
单 CPU 使用率
多 CPU 使用率
CPU 运行队列
磁盘使用率
网络使用率
Java 监控工具
基本 VM 信息
调优标志
线程信息
类信息
实时 GC 分析
事后堆转储
性能分析工具
采样分析器
探查分析器
阻塞方法和线程时间线
本地分析器
Java 任务控制
Java 飞行记录器
JFR 事件
JIT 编译器
编译与解释
热点编译
优化策略
编译器类型
编译器类型
Client (C1)
Server (C2)
分层编译
优化启动
优化批处理
优化长时间运行的应用
JIT 编译器版本
调优代码缓存
编译阈值
检测编译过程
编译线程
方法内联
逃逸分析
逆优化
代码被丢弃
逆优化僵尸代码
分层编译级别
执行级别
一般情况
server 编译器队列满
client 编译器全忙
逆编译
垃圾收集入门
对象判断
引用计数
可达性分析
垃圾收集器
分代收集
内存区域
Minor GC 与 Full GC
Serial
Throughput
CMS
G1
垃圾收集算法的选择
批量任务
吞吐量测试
响应时间测试
CMS 与 G1
垃圾收集调优
调整堆大小
调整代空间
调整永久代与元空间
控制并发
自适应调整
垃圾收集算法
Throughput 收集器
CMS 收集器
G1 收集器
高级调优
堆内存最佳实践
堆分析
减少内存使用
对象生命周期管理
原生内存最佳实践
内存占用
针对不同系统优化 JVM
线程与同步的性能
线程池
ForkJoinPool
线程同步
JVM 线程调优
监控线程与锁
Java EE 性能调优
Web 容器基本性能
线程池
EJB 会话 Bean
XML 和 JSON 处理
对象序列化
Java EE 网络 API
数据库性能的最佳实践
JDBC
JPA
Java SE API 技巧
缓冲式 I/O
类加载
随机数
Java 原生接口
异常
字符串
集合框架
AggressiveOpts
Lambda 表达式
流和过滤器
程序编译与代码优化
JVM 做出的优化
运行时优化
锁优化
偏向锁
轻量级锁
内存分配优化
模板解释器
内联缓存
即时编译优化
方法内联
逃逸分析
基于程序运行 profile 的投机性优化
前端编译与优化
前端编译器(Javac)
0. 初始化注解处理器
1. 解析与填充符号表
词法、语法分析
填充符号表
2. 注解处理
3. 语义分析与字节码生成
标注检查
数据流及控制流分析
解语法糖
字节码生成
语法糖
泛型
类型擦除
自动装拆箱、循环遍历
条件编译
插入式注解处理器
后端编译与优化
即时编译器(JIT)
解释器与编译器
解释执行
编译执行
C1(Client)
C2(Server)
Graal
分层编译
执行状态
1. 纯解释执行,不带 profiling
2. 执行不带 profiling 的 C1 代码
3. 执行仅带方法及回边次数 profiling 的 C1 代码
4. 执行带所有 profiling 的 C1 代码
5. 执行 C2 代码
Profiler
编译对象与触发条件
编译过程
C1
C2
提前编译器(AOT)
编译器优化技术
方法内联
类型继承关系分析(CHA)
逃逸分析
栈上分配
标量替换
同步消除
公共子表达式消除
数组边界检查消除
隐式异常处理
消除反射
自动装/拆箱消除
安全点消除
......
高效并发
Java 内存模型
编译器优化重排序
即时编译器的“as-if-serial”
实例 1
实例 2
“happens-before”关系
线程内关系
线程间关系
传递关系
内存屏障(memory barrier)
volatile
安全发布(safe publication)
Java 与线程
线程的实现
Java 线程调度
状态转换
协程
内核线程的局限
协程的复苏
Java 的解决方案
线程安全
共享数据
不可变
绝对线程安全
相对线程安全
线程兼容
线程对立
实现方法
悲观:互斥同步
ReentrantLock
Synchronized
乐观:非阻塞同步
CAS
无同步
纯代码(Pure Code)
线程本地存储(Thread Local Storage)
锁优化
编译优化
锁消除
运行优化
偏向锁
轻量级锁
锁状态
对象头内存布局
虚拟机栈
具体操作
重量级锁
锁粗化
自旋锁
synchronized 的主要逻辑
0 条评论
下一页