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
注: 改用串行收集器作为后备
有关碎片
标记--清除和标记-压缩
-- 标记--清除有碎片产生
-- 标记--压缩没有碎片产生
JVM调优思路及Demo
Demo(并行吞吐量):
-XX:+PrintGDetails -Xmx512M -Xms128M
-XX:+HeapDumpOnOutOfMemoryError
-XX:+UseParallelGC
-XX:+UseParallelOldGC
-XX:ParallelGCThreads=8
-XX:PermSize=32M
-Xloggc:d:/gc.log
Demo(GC停顿):
-XX:+PrintGDetails -Xmx512M -Xms128M
-XX:+HeapDumpOnOutOfMemoryError
-XX:+UseConcMarkSweepGC
-XX:ConcGCThreads=8
-XX:PermSize=32M
-Xloggc:d:/gc.log
类装载器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切换需要修改