jvm重要参数可视化和线上问题排查

jvm重要参数可视化和线上问题排查

    • 目标
    • jvm参数
      • 分类(了解)
      • 运行时数据区相关的(jdk1.8)
      • 处理 OOM 相关的
      • 垃圾回收器相关的
      • GC 日志记录相关的
      • 意义,默认值,调优原则(重要, 待拆分)
    • 排查 OOM 流程 和 常见原因
    • 参考文章

目标

  • 熟悉常用的 jvm参数 含义,默认值
  • 了解配置这些默认值的一般原则
  • 线上排查内存溢出的步骤和常见原因分析

jvm参数

分类(了解)

  • 根据jvm参数开头可以区分参数类型,共三类:--X-XX
  • 标准参数(-):所有的JVM实现都必须实现这些参数的功能,而且向后兼容
  • 非标准参数(-X):默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足,且不保证向后兼容
    • 例子:Xms20m,-Xmx20m,-Xmn20m
  • 非Stable参数(-XX):此类参数各个jvm实现会有所不同,将来可能会随时取消,需要慎重使用;
    • 例子:-XX:+PrintGCDetails,-XX:-UseParallelGC,-XX:+PrintGCTimeStamps

运行时数据区相关的(jdk1.8)

在这里插入图片描述

  1. 程序计数器(无参数)
  2. 虚拟机栈(本地方法栈)
    • -Xss: stack size 设置每个线程的栈大小,等同于 -XX:ThreadStackSize
  3. 方法区(元空间)
    • -XX:MetaspaceSize: 设置 Metaspace 的初始(和最小大小)
    • -XX:MaxMetaspaceSize: 设置 Metaspace 的最大大小
    • 1.8 之前使用
      • -XX:PermSize
      • -XX:MaxPermSize
    • 求和
      • 堆内存 = 新生代(Young Generation) + 老年代() ; 新生代 = Eden + S0 + S1
    • -Xms: memory size 设置jvm初始化堆大小
    • -Xmx: memory max 设置jvm初始化堆最大值,等同于 -XX:MaxHeapSize
    • -XX:NewRatio: 设置 新生代 和 老年代 的比例
    • 新生代
      • -XX:SurvivorRatio: 设置 新生代内部的 比例
      • 一共有两种指定 新生代内存(Young Generation)大小的方法
        • 通过 -XX:NewSize-XX:MaxNewSize 指定 初始值和最大值
        • 通过 -Xmn memory new 设置新生代大小,NewSize 与 MaxNewSize 设为一致
    • 老年代
      • -XX:MaxTenuringThreshold: 新生代中对象存活次数,默认15。(若对象在eden区,经历一次MinorGC后还活着,则被移动到Survior区,年龄加1。以后,对象每次经历MinorGC,年龄都加1。达到阀值,则移入老年代)

处理 OOM 相关的

  • 线上环境比配,方便分析内存溢出
    • -XX:+HeapDumpOnOutOfMemoryError
    • -XX:HeapDumpPath=./java_pid<pid>.hprof
  • 了解
    • -XX:OnOutOfMemoryError="< cmd args >;< cmd args >"
    • -XX:+UseGCOverheadLimit

垃圾回收器相关的

  • 埋个坑

GC 日志记录相关的

  • 埋个坑

意义,默认值,调优原则(重要, 待拆分)

  • 虚拟机栈
    • Xss1024k 等同于 -XX:ThreadStackSize=1024k
      • 意义:设置线程栈占用内存大小。

      注意:一般在相同物理内存下,如果减少-xss值会产生更大的线程数,但不同的操作系统对进程内线程数是有限制的,是不能无限生成。

  • 堆内存
    • -Xms2G -Xmx4G
      • 意义:设置堆内存的初始值和最大值。

      建议:通常这两个配置参数相等,可以使得堆相对稳定,避免不停震荡,动态扩容

  • 新生代
    • 方法一: Xmn256m
      • 为 新生代分配 256m 的内存(NewSize 与 MaxNewSize 设为一致)
    • 方法二:-XX:NewSize=256m -XX:MaxNewSize=1024m
      • 设置新生代的初始值和最大值。

      注意:不要将 -mn 和 -mx 设置相等,会导致 没有老年代,进而 oom。 -mn 过小会增加Minor GC频率,过大会减小老年代的大小。一般设为整个堆空间的1/4或1/3.

排查 OOM 流程 和 常见原因

  1. 对于线上环境,设置参数,拿到 oom 时堆内存快照
    1. 线上环境一般不能使用 jdk自带的故障分析工具,需要提前保存 堆内存快照
    2. -XX:+HeapDumpOnOutOfMemoryError
    3. -XX:HeapDumpPath=/app/logs/app.dump
  2. 使用快照分析工具分析 堆内存快照
    1. MAT(Memory Analyzer Tool)
    2. jvisualvm
  3. 常见的问题和原因
    1. java.lang.OutOfMemoryError: Java heap space
      • 首先肯定这是一个堆内存空间引起的问题,可能的原因有:
        1. 内存加载数据量过大
          • 例如不受行数限制的数据库查询语句,或者不限制字节数的文件读取等,事故系统显然没有这些情况;
        2. 内存泄漏(资源未关闭/无法回收)
          • 当系统存在大量未关闭的 IO 资源,或者错误使用ThreadLocal等场景时也会发生OOM,经排查,也不存在这种情况;
        3. 系统内存不足
          • 系统内存不足以支撑当前业务场景所需要的内存,过小的机器内存或者不合理的JVM内存参数。

参考文章

  • https://javaguide.cn/java/jvm/jvm-parameters-intro.html
  • https://javaguide.cn/java/jvm/jvm-in-action.html
  • https://cloud.tencent.com/developer/article/1406848

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/6813.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c#数据库:1.c#创建并连接数据库

安装软件:SQL Server Management Studio Management Studio Visual Studio 2022 启动服务: 打开SQL Server Management Studio Management Studio ,连接到服务器(GUANZU是我的计算机名) 新建数据库,随便起个名字叫aq: c#代码: using System; using System.Collections.Gener…

深度学习:基于Keras,使用长短期记忆神经网络模型LSTM和RMSProp优化算法进行销售预测分析

前言 系列专栏&#xff1a;【机器学习&#xff1a;项目实战100】【2024】✨︎ 在本专栏中不仅包含一些适合初学者的最新机器学习项目&#xff0c;每个项目都处理一组不同的问题&#xff0c;包括监督和无监督学习、分类、回归和聚类&#xff0c;而且涉及创建深度学习模型、处理非…

[C++核心编程-02]----C++引用详解和使用方法分析

前言 在C中&#xff0c;引用是一个别名&#xff0c;它允许将一个已存在的变量或对象用不同的名称来访问。引用在定义时必须初始化&#xff0c;并且一旦初始化就不能再绑定其他对象&#xff0c;因此引用在声明时被初始化后就不能再改变引用对象。引用使用&符号进行声明。 引…

【C++STL详解(六)】--------list的模拟实现

目录 前言 一、接口总览 一、节点类的模拟实现 二、迭代器类的模拟实现 迭代器的目的 list迭代器为何要写成类&#xff1f; 迭代器类模板参数说明 模拟实现 1.构造函数 2.*运算符重载 3.->运算符重载 4.前置 5.后置 6.前置-- 7.后置-- 8.! 9. 三、list类的…

【Mac】graphpad prism for Mac(专业医学绘图工具) v10.2.3安装教程

软件介绍 GraphPad Prism for Mac是一款专业的科学数据分析和绘图软件&#xff0c;广泛用于生物医学和科学研究领域。它具有强大的统计分析功能&#xff0c;可以进行各种数据分析&#xff0c;包括描述性统计、生存分析、回归分析、方差分析等。同时&#xff0c;它还提供了丰富…

Axios、Fetch、原生Ajax、微信小程序的wx.request是什么?使用方法是?(简洁且带有代码示例)

Axios、Fetch和原生AJAX、微信小程序的wx.request都是用于在前端发送网络请求的工具。它们可以用来与服务器通信并接收响应数据。 一、Axios Axios是一个基于Promise的HTTP客户端&#xff0c;可用于浏览器和Node.js&#xff0c;用于全局安装或在模块系统中使用。可以通过Axio…

滑动验证码登陆测试编程示例

一、背景及原理 处理登录时的滑动验证码有两个难点&#xff0c;第一个是找到滑块需要移动的距离&#xff0c;第二个是模拟人手工拖动的轨迹。模拟轨迹在要求不是很严的情况下可以用先加速再减速拖动的方法&#xff0c;即路程的前半段加速度为正值&#xff0c;后半段为负值去模…

Apache 开源项目文档中心 (英文 + 中文)

进度&#xff1a;持续更新中。。。 Apache Ambari 2.7.5 Apache Ambari Installation 2.7.5.0 (latest)Apache Ambari 安装 2.7.5.0 (latest)Apache Ambari Administering 2.7.5.0 (latest)

Java学习之super VS this

在Java中&#xff0c;super和this关键字用于引用当前对象或父类对象的成员变量或方法。 一、super关键字&#xff1a; super关键字用于在子类中访问父类的成员变量或方法。使用super关键字调用父类构造方法。使用super关键字可以避免父类和子类中相同名称的变量或方法冲突。 …

Go未用代码消除与可执行文件瘦身

在日常编写Go代码时&#xff0c;我们会编写很多包&#xff0c;也会在编写的包中引入了各种依赖包。在大型Go工程中&#xff0c;这些直接依赖和间接依赖的包数目可能会有几十个甚至上百个。依赖包有大有小&#xff0c;但通常我们不会使用到依赖包中的所有导出函数或类型方法。 这…

如何高速下载,百度 阿里 天翼 等网盘内的内容

如何高速下载&#xff0c;百度 阿里 天翼 等网盘内的内容&#x1f3c5; 前言教程下期更新预报&#x1f3c5; 前言 近段时间经常给大家分享各种视频教程&#xff0c;由于分享的资料是用迅雷网盘存的&#xff0c;但是绝大部分用户都是使用的某度&#xff0c;阿某的这些网盘&…

VScode添加c/c++头文件路径

1.设置工作区include path方法&#xff1a; 命令面板 -> 输入c/c 修改配置文件&#xff0c;添加路径&#xff1a; 2.全局路径&#xff1a; 设置 - > 搜索include path

tomcat+maven+java+mysql图书管理系统1-配置项目环境

目录 一、软件版本 二、具体步骤 一、软件版本 idea2022.2.1 maven是idea自带不用另外下载 tomcat8.5.99 Javajdk17 二、具体步骤 1.新建项目 稍等一会&#xff0c;创建成功如下图所示&#xff0c;主要看左方目录相同不。 给maven配置国外镜像 在左上…

WSL (Windows Subsystem for Linux) 中将默认用户更改为 root

要在 WSL (Windows Subsystem for Linux) 中将默认用户更改为 root&#xff0c;你可以使用以下步骤&#xff1a; 打开你的命令提示符或 PowerShell。首先&#xff0c;你需要知道你的 Linux 发行版的名称。你可以通过运行以下命令来列出所有安装的 WSL 发行版及其状态&#xff…

【DPU系列之】Bluefield 2 DPU卡的功能图,ConnectX网卡、ARM OS、Host OS的关系?(通过PCIe Switch连接)

核心要点&#xff1a; CX系列网卡与ARM中间有一个PCIe Swtich的硬件单元链接。 简要记录。 可以看到图中两个灰色框&#xff0c;上端是Host主机&#xff0c;下端是BlueField DPU卡。图中是BF2的图&#xff0c;是BF2用的是DDR4。DPU上的Connect系列网卡以及ARM系统之间有一个…

cmd命令跳转至指定目录

1、指定目录与当前目录在同一盘符&#xff1a;直接cd 指定目录。2、指定目录与当前目录不在同一盘符&#xff1a; a、方法一&#xff1a;cd 指定目录&#xff0c;此时不会跳转&#xff0c;接着再输入指定目录的盘符即可。 b、方法二&#xff1a;输入指定目录所在的盘符&#xf…

C++:map和set类

关联式容器 在初阶阶段&#xff0c;我们已经接触过STL中的部分容器&#xff0c;比如&#xff1a;vector、list、deque、 forward_list(C11)等&#xff0c;这些容器统称为序列式容器&#xff0c;因为其底层为线性序列的数据结构&#xff0c;里面 存储的是元素本身。那什么是关…

树莓派上开发音视频应用常用的第三方库

在树莓派上做音视频开发&#xff0c;可以借助一些第三方库&#xff0c;下面按照音频和视频&#xff0c;介绍一些常用的库。 这些库都是音频和多媒体处理相关的&#xff0c;用于开发音频和视频应用程序&#xff0c;例如游戏、媒体播放器、语音合成等。 音频开发库&#xff1a;…

Postgresql复制序列(sequence)

数据迁移时&#xff0c;有关序列&#xff08;sequence&#xff09;的复制&#xff0c;例如要将序列从数据库 A 复制到数据库 B&#xff0c;你可以执行以下步骤&#xff1a; 在数据库 A 中找到表tab序列的定义。使用找到的定义在数据库 B 中重新创建序列。 在 PostgreSQL 中&a…

Docker的私有仓库部署-Harbor

目录 一. Docker原生私有仓库 Registry 1. Registry 的介绍 2. Registry 的部署过程 二. Registry 的升级——Habor 1. Harbor 简介 2. Harbor 特性 3. Harbor 的构成 4. Harbor 部署 4.1 部署 Docker-Compose 服务 4.2 部署 Harbor 服务 4.2.1 下载或上传 Harbor…