JVM调优实践:记录初次JVM调优经历
JVM调优实践:记录初次JVM调优经历
- 前言
- GC 调优准则
- GC 调优目的
- 关于 GC 频率
- JVM调优工具
- 参考文章
- 初步调优
- 基本指令
- 选择垃圾收集器
- 初步确定堆大小的理论依据
- 计算总堆与新生代大小
- 查看下当前停顿时间
- Jconsole 观察下
前言
之前关于 JVM 调优大部分都只是一些理论依据,具体经验没有,这回正好记录下。
中间一些碰壁与返工的部分就跳过了。
GC 调优准则
- GC优化是到最后不得已才采用的手段
- 多数导致GC问题的Java应用,我们应该尝试优化代码,减少大对象与全局变量的创建,减少创建的对象数量。
- 在应用上线之前,先考虑将机器的JVM参数设置到最优(就是我现在干的)
- 在实际使用中,分析GC情况优化代码比优化GC参数要多得多
GC 调优目的
- 减少从新生代进入老年代的对象数量
- 减少 Full GC 的执行时间与频率
关于 GC 频率
- Minor GC执行的很快(小于50ms)
- Minor GC执行的并不频繁(大概10秒一次)
- Full GC执行的很快(小于1s)
- Full GC执行的并不频繁(10分钟一次)
JVM调优工具
jps: 用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程号。
jinfo: 可以根据进程号输出并修改运行时的java 进程的opts。
jstat: 一个极强的监视VM内存工具。可以用来监视VM内存内的各种堆和非堆的大小及其内存使用量。
jmap: 打印出某个java进程(使用pid)内存内的所有’对象’的情况(如:产生那些对象,及其数量)。
jstack: 用于查询线程的使用情况,以及帮你快速找到死锁线程,以便快速定位问题。
jcmd: 全功能命令,是上面功能的集合,具体的可以看 help
jconsole: UI 查看,缺点线上你可能没法连,正式Dump太大,根本下不下来,因此能用命令学会用命令
jvisualvm: 同样是个 UI 查看器,缺点线上你可能没法连,正式Dump太大,根本下不下来,因此能用命令学会用命令
Arthas: 阿里巴巴出品的全链路追踪工具,功能强大,甚至可以热更新代码,推荐正式服用这个。Athas Gitee
参考文章
站在前人的肩膀上,必不可少
JVM命令参数大全
jstat命令查看jvm的GC情况 (以Linux为例)
JVM内存设置多大合适?Xmx和Xmn如何设置?
查看jvm常用命令
如何优化java垃圾回收机制
JVM 调优方法
Java自带JVM监控工具jstat使用详细说明
初步调优
基本指令
不管咋样我都会加的指令
- -XX:+PrintGCDetails: 打印 GC 信息
- -XX:+HeapDumpOnOutOfMemoryError: 出现 OOM 异常时,打印 dump
- -XX:HeapDumpPath=/root/: dump 存放位置,这是为了出现一些突发情况时,方便排查
选择垃圾收集器
深入理解 Java 虚拟机:JVM 中的 GC 垃圾收集器总结
垃圾收集器的选择首先需要了解垃圾收集器的特点,我这的项目属于哪种普通的网站项目,比起吞吐量,更加注重网站的响应速度,因此我这里选择的是 CMS 垃圾收集器,优点在于耗时较长的垃圾回收阶段可以与用户线程并发运行。缺点就不赘述了,多注意下。
- -XX:+UseConcMarkSweepGC: 启用 CMS 垃圾收集器
- -XX:+CMSParallelInitialMarkEnabled: 开启多线程并发进行标记,减少暂停时间
- -XX:+CMSScavengeBeforeRemark: 在重新标记前先执行一次新生代GC,GC可以回收掉一些新生代中没有再被引用的对象,然后重新标记阶段再进行扫描时,就可以少扫描一些对象,耗时自然就减少了,CMS重新标记阶段的性能也能因此提升。
- -XX:+UseCMSCompactAtFullCollection: 用于在 CMS 收集器 顶不住要进行 Full GC 时,开启内存碎片的合并整理过程,开关参数,默认开启,因此不专门加了。
初步确定堆大小的理论依据
根据推荐公式以及其它人的经验来看
- 总堆大小为,老年代在FGC情况下的3-4倍,取大点用FGC的4倍
- Sun官方建议年轻代的大小为整个堆的3/8左右
计算总堆与新生代大小
由于不知道该给多大堆,所以先给个足够大的值
-Xmx1024m -Xms1024m
本地启动项目
定位进程号
利用 jmap -histo:live <pid>
打印每个class的实例数目,内存占用,类全名信息.live子参数加上后,只统计活的对象数量. 此时会触发FullGC,线上操作请注意,FGC会导致系统卡顿。
接着利用 jmap -heap <pid>
查看目前堆栈信息
因此总堆计算:
67 x 4 = 268M,取整使用512M作为堆大小
新生代:
512 x 3 / 8 = 192M
命令:
-Xmx512m -Xms512m -Xmn192m
查看下当前停顿时间
配置好VM后,重启项目
1000ms统计1次,共打印10次
jstat -gcutil <pid> 1000 10
停顿时间公式:
YGC平均耗时(毫秒/次) = YGCT(秒)/ YGC(次数)x 1000
FGC平均耗时(毫秒/次) = FGCT(秒)/ FGC(次数)x 1000
YGC平均耗时:0.153 / 16 x 1000 = 9.56(ms)
FGC平均耗时:0.052 / 4 x 1000 = 13(ms)
Jconsole 观察下
本地用 Jconsole 看下情况,命令行执行 jconsole
,出来图形化界面后,选择要观察的进程
从图形上来看还算并没有什么异常,中间波动是我不小心断开重连导致的
整体上看没啥问题,上线测试服看看。
JVM调优实践:记录初次JVM调优经历相关推荐
- JVM性能调优实践——G1 垃圾收集器分析、调优篇
前言 关于G1 GC以及其他垃圾收集器的介绍可以参考前一篇JVM性能调优实践--G1 垃圾收集器介绍篇.了解了G1垃圾收集器的运行机制之后,就可以针对一些GC相关参数来调整内存分配以及运行策略.下文的 ...
- 深入理解JVM虚拟机10:JVM常用参数以及调优实践
本文转自[JVM常用参数以及调优实践](https://blog.csdn.net/a724888/article/details/78367780) JVM常用参数选项 jvm 可配置的参数选项可以 ...
- 一次线上 JVM 调优实践,FullGC 40 次/天到 10 天一次的优化过程
点击关注公众号,Java干货及时送达 来源 | https://blog.csdn.net/cml_blog/article/details/81057966 通过这一个多月的努力,将 FullGC ...
- 一次线上JVM调优实践,FullGC40次/天到10天一次的优化过程
作者 | cmlbeliever 来源 | https://blog.csdn.net/cml_blog/article/details/81057966 通过这一个多月的努力,将FullGC从40次 ...
- JVM性能调优实践:G1 垃圾收集器介绍篇
前言 前面两篇主要整理了性能测试的主要观察指标信息:性能测试篇,以及JVM性能调优的工具:JVM篇.这一篇先简单总结一下GC的种类,然后侧重总结下G1(Garbage-First)垃圾收集器的分代,结 ...
- JVM常用参数以及调优实践
JVM常用参数选项 jvm 可配置的参数选项可以参考 Oracle 官方网站给出的相关信息:http://www.oracle.com/technetwork/java/javase/tech/vmo ...
- 高并发场景下JVM调优实践之路
一.背景 2021年2月,收到反馈,视频APP某核心接口高峰期响应慢,影响用户体验. 通过监控发现,接口响应慢主要是P99耗时高引起的,怀疑与该服务的GC有关,该服务典型的一个实例GC表现如下图: 可 ...
- JVM调优笔记:认识JVM内存模型(jdk1.8)
文章目录 1.什么是JVM 2.jdk.jre.jvm关系 3.JVM执行过程 4.JVM执行程序的过程 5.JVM运行时数据区 虚拟机栈(线程私有) 本地方法栈(线程私有) 程序计数器(线程私有) ...
- JVM系列之故障排查与性能调优(重点)
1.故障排查与性能调优 1.1.概述 1.1.1.生产环境中的问题? 生产环境发生了OOM,该如何处理?如何判断是否是内存泄漏导致的? 生产环境应该给Java进程分配多少内存? 生产环境应该如何选择垃 ...
- “金三银四”春招指南之“性能调优”:MySQL+Tomcat+JVM,看完还怕面试官的轰炸?
春招指南之"性能调优":MySQL+Tomcat+JVM,还怕面试官的轰炸? 01 MySQL性能调优 1.1 MySQL性能调优问题有哪些?怎么学? 关于这个,给大家看一份学习大 ...
最新文章
- FAST-LIO2:快速直接的激光雷达与惯导里程计
- android学习笔记55——ContentProvider_2
- 小甲鱼-013元组tuple:上了枷锁的列表
- python 几种点积运算方式效率分析
- jacoco + junit + mock 单测没有统计覆盖率问题
- python 的笔记
- jssdk 保存文件到手机_手机混用闪存到底是真是假?教你查手机闪存型号
- 从0-1入门python爬虫,看这篇就够了!
- 暑期集训 Day2 简单博弈论
- (C/C++学习笔记)附页: C/C++变量的存储类型
- Scala Case Class
- 4.性能之巅 洞悉系统、企业与云计算 --- 观测工具
- 腾讯、阿里、京东…互联网大厂2022新年礼盒长啥样?
- Discuz收费插件模版合集包;discuz大部分插件下载地址;http://pan.baidu.com/s/1nt5hwU1
- 说一下html5 drag api,HTML5 DragAPI
- 01【托业口语】考试介绍
- JDK7下载|JDK1.7下载可选择window版和linux版
- Window bat脚本教程
- 为什么你应该学习编程?
- java事件溯源_领域事件与事件溯源 - 解道Jdon