JVM调优随笔

本文记载了个人对JVM调优的一些个人使用经验,进来既有缘,希望对看到的朋友有所帮助


一、命令和工具的使用:
1 查看系统启动的java线程: jps -l

2 动态添加gc日志参数:
3 添加gc详细日志:jinfo -flag +PrintGCDetails 线程id
4 添加内存溢出自动导出堆信息:+HeapDumpOnOutOfMemoryError

5 堆信息导出: jmap -dump:live,format=b,file=heap.bin 17956
6 用:elipse的 MAT工具进行分析
7 堆信息查看工具:jstack 线程ID


二、当发现程序启动比较慢的时候,觉得需要进行jvm参数调整则步骤如下:
1、 开启日志分析 -XX:+PrintGCDetails 发现有多次 GC 包括 FullGC
2、 发现GC日志多次对方法区进行GC,则可能是空间不足
调整 Metadata 空间 -XX:MetaspaceSize=64m 减少 FullGC
3、 YGC次数频繁
减少 Minorgc 次数,增加参数 -Xms500m GC 减少至 5 次(如果觉得还是多,则继续增加内存值)
4、 YGC次数调整
增加新生代比重,增加参数 -Xmn900mGC 减少至 1 次
5、堆栈内存值还可以继续增加,但是效果不明显的话,数值需要自己衡量
加大新生代,调整参数 -Xms2000m -Xmn1800m 还是避免不了 GC,没有必要调整这么大,资源浪费
6、设置的例子:-Xms5m-Xmx5m-XX:+PrintGCDetails-XX:+UseSerialGC


三、设置垃圾回收器
-XX:+UseSerialGC
-XX:+UseParNewGC
-XX:+UseConcMarkSweepGC
-XX:+UseG1GC

四、GC调整原则
GC 的时间够小
GC 的次数够少
发生 FullGC 的周期足够的长,时间合理,最好是不发生。
注:如果满足下面的指标,则一般不需要进行 GC: MinorGC 执行时间不到 50ms;
MinorGC 执行不频繁,约 10 秒一次;
FullGC 执行时间不到 1s;
FullGC 执行频率不算频繁,不低于 10 分钟 1 次;


五、操作 响应时间统计:
打开一个站点 几秒
数据库查询一条记录(有索引) 十几毫秒
机械磁盘一次寻址定位 4 毫秒
从机械磁盘顺序读取 1M 数据 2 毫秒
从 SSD 磁盘顺序读取 1M 数据 0.3 毫秒
从远程分布式换成 Redis 读取一个数据 0.5 毫秒
从内存读取 1M 数据 十几微妙
Java 程序本地方法调用 几微妙
网络传输 2Kb 数据 1 微妙
并发数
同一时刻,对服务器有实际交互的请求数。 和网站在线用户数的关联:1000 个同时在线用户数,可以估计并发数在 5%到 15%


评估并发:并发=在线人数*15%

原文地址:https://www.cnblogs.com/lean-blog/p/13297431.html