JVM调优
Trace 跟踪参数
打印简要GC
- verbose:gc
- -XX:+printGC
打印详细GC
- -XX:+PrintGCDetails
- -XX:+PrintGCTimeStamps 打印GC发生的时间
重定向GC.log
- Xloggc:log/gc.log – 默认以当前目录为基础
每次GC后,都打印堆信息
- -XX:+PrintHeapAtGC
监控类的加载
- -XX:+TraceClassLoading
打印类的使用情况
- -XX:+PrintClassHistogram
注: 需要在控制台下按下Ctrl+Break后才可以打印类的信息
堆的分配参数
- -Xmx:指定最大堆空间 -Xms:指定最小堆空间
思考:
- -Xmx和-Xms应该保持一个什么关系,可以让系统的性能尽可能的好呢?
- 如果你要做一个Java的桌面产品,需要绑定JRE,但是JRE又很大,你如何做一下JRE的瘦身呢?
设置新生代大小
- -Xmn: 固定值
- -XX:NewRatio: 按比例算(新生代[eden+2*s]和老年代[不包括永久区]). eg: 4, 1:4, 占整个堆的20%
- -XX:SurvivorRatio: 设置两个Survivor区和eden的比. eg: 8, Survivor:eden=2:8, 即一个Survivor占年轻代的10%
- -XX:+HeapDumpOnOutOfMemoryError: OOM时导出堆到文件
- -XX:+HeapDumpPath: 导出文件位置
- -XX:OnOutOfMemoryError: 在OOM时,执行一个脚本
永久区分配参数
- -XX:PermSize -XX:MaxPermSize
注: 堆没有用完的情况也有可以抛出OOM,因为永久区造成的,具体查看GC明细
- 栈大小分配
- –Xss: 每个线程的本大小,分配的大小与容易的线程数成反比。
GC的算法与种类
- 概念: 垃圾收集, 1960年List使用了GC, JAVA中 GC的对象是堆空间和永久区
算法:
引用计数法 通过引用计算来回收垃圾 引用和去引用伴随的加法和减法,影响性能很难处理循环引用
标记清除法 现代垃圾回收算法的基础
标记压缩 适合用于对象较多的场合
复制算法 相对于标记法效率更高 不适合用于对象较多的情况, 如老年代 空间浪费, 整合标记清理思想
分代思想
可触及性
Stop-The-World
GC参数
串行收集器
最古老,最稳定
效率高
可能会产生较长的停顿
-XX:+UseSerialGC
-- 新生代、老年代使用串行回收
-- 新生代复制算法
-- 老年代标记-压缩
并行收集器
ParNew
-XX:+UseParNewGC
--新生代并行
--老年代串行
-- Serial收集器新生代的并行版本
-- 复制算法
-- 多线程,需要多核支持
-- -XX:ParallelGCThreads限制线程数量
Parallel收集器
-- 类似ParNew
-- 新生代复制算法
-- 老年代 标记-压缩
-- 更加关注吞吐量
-- -XX:+UseParallelGC 使用Parallel收集器 + 老年代串行
-- -XX:+UseParallelOldGC 使用Parallel收集器 + 并行老年代
并行参数
-XX:MaxGCPauseMills
-- 最大停顿时间,单位毫秒
-- GC尽力保证回收时间不超过设定值(参考,可能会超过设置的时间)
-XX:GCTimeRatio
-- 0-100的取值范围
-- 垃圾收集时间占总时间的比
-- 默认99,即最大允许1%时间做GC
这两个参数矛盾,不能同时满足
CMS收集器
-- Concurrent Mark Sweep 并发标记清除
-- 标记--清除算法
-- 标记-压缩相比
-- 并发阶段会降低吞吐量
-- 老年代收集器(新生代使用ParNew)
-- -XX:+UseConcMarkSweepGC
-- -XX:+UseCMSCompactAtFullCollection Full GC 后,进行一次整理(整理过程是独占的,会引起停顿时间变长)
-- -XX:+CMSFullGCsBeforeCompaction 设置进行几次Full GC后,进行一个整理
-- -XX: ParallelCMSThreads 设定CMS的线程数量(通常和CPU核数相同)
特点:
-- 尽可能降低停顿
-- 会影响系统整体吞吐量和性能
-- 清理不彻底
-- 因为和用户线程一起运行,不能在空间快满时再清理
* -XX:CMSInitiatingOccupancyFraction设置触发GC的阈值
* 如果不幸内存预留空间不够,就会引起 concurrent mode failure
注: 改用串行收集器作为后备
有关碎片
标记--清除和标记-压缩
-- 标记--清除有碎片产生
-- 标记--压缩没有碎片产生
类装载器ClassLoader
系统性能监控
linux中常用功能
- uptime:
- top:
- vmstat:
- pidstat: 需要安装 sudo apt-get install sysstat
- 特点: 可以监控线程状态 -t 参数, 监控CPU: -u, 监控IO: -d
Windows中的监控工具
- 任务管理器
- Perfmon 性能监控器
- Process Explorer: 非自带
- pslist: 非自带
Java自带的工具
- MAT: eclipse 插件 Memory Analyzer (MAT)
偏向锁
- -XX:+UseBiasedLocking 默认启用
- 注: 在竞争激烈的场合,偏向锁会增加系统的负担
轻量级锁(BasicObjectLock)
- 减少锁持有时间: 锁优化的基本思想
- 减小锁粒度:
- 锁分离: 根据功能进行锁分离 eg: 读写锁
锁消除(基于逃逸):
- server -XX:+DoEscapeAnalysis -XX:+EliminateLocks 使用锁消除
- server -XX:+DoEscapeAnalysis -XX:-EliminateLocks 不使用锁消除
CAS(Compare And Swap) 比较交换
- CAS(V,E,N)
- Concurrent.atomic包下面的类都是无锁的实现(利用的是CAS实现),比一般有锁的实现效率要高。
业务系统分开,业务库也分开
系统之间使用RPC通信
底层换成 mybatis, 把数据库的MetaData全部缓存到Redis中
底层的DynamicDatasource切换需要修改