JVM学习笔记

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切换需要修改

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值