JVM调优实践:记录初次JVM调优经历

  • 前言
  • GC 调优准则
  • GC 调优目的
  • 关于 GC 频率
  • JVM调优工具
  • 参考文章
  • 初步调优
    • 基本指令
    • 选择垃圾收集器
    • 初步确定堆大小的理论依据
    • 计算总堆与新生代大小
    • 查看下当前停顿时间
    • Jconsole 观察下

前言

之前关于 JVM 调优大部分都只是一些理论依据,具体经验没有,这回正好记录下。

中间一些碰壁与返工的部分就跳过了。

GC 调优准则

  1. GC优化是到最后不得已才采用的手段
  2. 多数导致GC问题的Java应用,我们应该尝试优化代码,减少大对象与全局变量的创建,减少创建的对象数量。
  3. 在应用上线之前,先考虑将机器的JVM参数设置到最优(就是我现在干的)
  4. 在实际使用中,分析GC情况优化代码比优化GC参数要多得多

GC 调优目的

  1. 减少从新生代进入老年代的对象数量
  2. 减少 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调优经历相关推荐

  1. JVM性能调优实践——G1 垃圾收集器分析、调优篇

    前言 关于G1 GC以及其他垃圾收集器的介绍可以参考前一篇JVM性能调优实践--G1 垃圾收集器介绍篇.了解了G1垃圾收集器的运行机制之后,就可以针对一些GC相关参数来调整内存分配以及运行策略.下文的 ...

  2. 深入理解JVM虚拟机10:JVM常用参数以及调优实践

    本文转自[JVM常用参数以及调优实践](https://blog.csdn.net/a724888/article/details/78367780) JVM常用参数选项 jvm 可配置的参数选项可以 ...

  3. 一次线上 JVM 调优实践,FullGC 40 次/天到 10 天一次的优化过程

    点击关注公众号,Java干货及时送达 来源 | https://blog.csdn.net/cml_blog/article/details/81057966 通过这一个多月的努力,将 FullGC ...

  4. 一次线上JVM调优实践,FullGC40次/天到10天一次的优化过程

    作者 | cmlbeliever 来源 | https://blog.csdn.net/cml_blog/article/details/81057966 通过这一个多月的努力,将FullGC从40次 ...

  5. JVM性能调优实践:G1 垃圾收集器介绍篇

    前言 前面两篇主要整理了性能测试的主要观察指标信息:性能测试篇,以及JVM性能调优的工具:JVM篇.这一篇先简单总结一下GC的种类,然后侧重总结下G1(Garbage-First)垃圾收集器的分代,结 ...

  6. JVM常用参数以及调优实践

    JVM常用参数选项 jvm 可配置的参数选项可以参考 Oracle 官方网站给出的相关信息:http://www.oracle.com/technetwork/java/javase/tech/vmo ...

  7. 高并发场景下JVM调优实践之路

    一.背景 2021年2月,收到反馈,视频APP某核心接口高峰期响应慢,影响用户体验. 通过监控发现,接口响应慢主要是P99耗时高引起的,怀疑与该服务的GC有关,该服务典型的一个实例GC表现如下图: 可 ...

  8. JVM调优笔记:认识JVM内存模型(jdk1.8)

    文章目录 1.什么是JVM 2.jdk.jre.jvm关系 3.JVM执行过程 4.JVM执行程序的过程 5.JVM运行时数据区 虚拟机栈(线程私有) 本地方法栈(线程私有) 程序计数器(线程私有) ...

  9. JVM系列之故障排查与性能调优(重点)

    1.故障排查与性能调优 1.1.概述 1.1.1.生产环境中的问题? 生产环境发生了OOM,该如何处理?如何判断是否是内存泄漏导致的? 生产环境应该给Java进程分配多少内存? 生产环境应该如何选择垃 ...

  10. “金三银四”春招指南之“性能调优”:MySQL+Tomcat+JVM,看完还怕面试官的轰炸?

    春招指南之"性能调优":MySQL+Tomcat+JVM,还怕面试官的轰炸? 01 MySQL性能调优 1.1 MySQL性能调优问题有哪些?怎么学? 关于这个,给大家看一份学习大 ...

最新文章

  1. FAST-LIO2:快速直接的激光雷达与惯导里程计
  2. android学习笔记55——ContentProvider_2
  3. 小甲鱼-013元组tuple:上了枷锁的列表
  4. python 几种点积运算方式效率分析
  5. jacoco + junit + mock 单测没有统计覆盖率问题
  6. python 的笔记
  7. jssdk 保存文件到手机_手机混用闪存到底是真是假?教你查手机闪存型号
  8. 从0-1入门python爬虫,看这篇就够了!
  9. 暑期集训 Day2 简单博弈论
  10. (C/C++学习笔记)附页: C/C++变量的存储类型
  11. Scala Case Class
  12. 4.性能之巅 洞悉系统、企业与云计算 --- 观测工具
  13. 腾讯、阿里、京东…互联网大厂2022新年礼盒长啥样?
  14. Discuz收费插件模版合集包;discuz大部分插件下载地址;http://pan.baidu.com/s/1nt5hwU1
  15. 说一下html5 drag api,HTML5 DragAPI
  16. 01【托业口语】考试介绍
  17. JDK7下载|JDK1.7下载可选择window版和linux版
  18. Window bat脚本教程
  19. 为什么你应该学习编程?
  20. java事件溯源_领域事件与事件溯源 - 解道Jdon

热门文章

  1. HTML 常用选择框
  2. python调用photoshop_Python和Photoshop
  3. 上海落户条件—海归落户上海
  4. 电脑usb蓝牙的使用
  5. 独家解读 | 2018 恶意机器流量报告
  6. lol超长id注册手把手教程 第一期
  7. MIPI-DSI 三种 Video Mode 理解
  8. 企业自建私有云-openstack-介绍
  9. 网工必会stp /rstp /mstp (笔记)
  10. 锂电池基本原理解析:充电及放电机制