定位排查Java线上内存溢出问题(服务重启,没有捕获到日志)

2023-10-31

一、场景

        线上项目device服务模块内存不断上涨导致CPU较高,导致触发脚本执行重启,接口自动化测试平台不断的报500拒绝连接等错误提示。

排查:

        通过服务器日志查询并没有异常错误信息打印,查看docker容器的日志发现错误是打印控制台,无法从控制台中找到有价值的日志

短暂方案解决:

        内存溢出问题因为JVM内存分配不够大导致的,调大JVM的内存可以短暂解决此问题,但解决不了根本问题,需要从代码层去定位排查

二、Java启动参数分析(调试参数)

调试参数列表:

参数及其默认值

-XX:-CITime

打印消耗在JIT编译的时间

-XX:ErrorFile=./hs_err_pid<pid>.log

保存错误日志或者数据到文件中

-XX:-ExtendedDTraceProbes

开启solaris特有的dtrace探针

-XX:HeapDumpPath=./java_pid<pid>.hprof

指定导出堆信息时的路径或文件名

-XX:-HeapDumpOnOutOfMemoryError

当首次遭遇OOM时导出此时堆中相关信息

-XX:OnError="<cmd args>;<cmd args>"

出现致命ERROR之后运行自定义命令

-XX:OnOutOfMemoryError="<cmd args>;<cmd args>"

当首次遭遇OOM时执行自定义命令

-XX:-PrintClassHistogram

遇到Ctrl-Break后打印类实例的柱状信息,与jmap -histo功能相同

-XX:-PrintConcurrentLocks

遇到Ctrl-Break后打印并发锁的相关信息,与jstack -l功能相同

-XX:-PrintCommandLineFlags

打印在命令行中出现过的标记

-XX:-PrintCompilation

当一个方法被编译时打印相关信息

-XX:-PrintGC

每次GC时打印相关信息

-XX:-PrintGC Details

每次GC时打印详细信息

-XX:-PrintGCTimeStamps

打印每次GC的时间戳

-XX:-TraceClassLoading

跟踪类的加载信息

-XX:-TraceClassLoadingPreorder

跟踪被引用到的所有类的加载信息

-XX:-TraceClassResolution

跟踪常量池

-XX:-TraceClassUnloading

跟踪类的卸载信息

-XX:-TraceLoaderConstraints

跟踪类加载器约束的相关信息

 

三、项目配置启动参数

1、打开docker-compose.yaml,进行编辑

 

1、表示JVM启动运行内存的配置

2、表示当前配置首次遭遇OOM时导出此时堆中相关信息

3、表示运行的jar

4、表示运行所指向的配置

只要发生OOM,就会将对应的堆文件导出,可以根据堆文件进行问题排查

四、MAT工具使用

        是一个快速且功能丰富的Java堆分析器,可以定位排查内存泄漏的问题

1、安装独立版本的MAT

        下载压缩包解压到本地文件夹中,解压完就可以直接使用,双击运行

        下载地址:http://www.eclipse.org/mat/downloads.php

 

2、从生产环境将导出的dump内存快照文件存在本地

3、导入dump的文件

 4、分析

 

 

 

 

Shallow Heap浅堆:java对象占用的内存

Retained Heap深堆:java对象及对象引用的类占用的内存 ,jvm gc回收时释放的内存

Retained Heap深堆大于等于Shallow Heap浅堆

5、定位代码抛出抛出异常分析

 

从这个报错线程里面我们可以发现关键的几个类或者几个方法:

com.seirobotics.device.service.task.ThreadExportCsvData.exportCsvData()V (ThreadExportCsvData.java:74)

com.seirobotics.device.service.impl.DeviceFromMongoServiceImpl.getDeviceStatusBySns(Ljava/util/List;Ljava/lang/String;)Ljava/util/List; (DeviceFromMongoServiceImpl.java:455)

org.springframework.data.mongodb.core.MongoTemplate.find(Lorg/springframework/data/mongodb/core/query/Query;Ljava/lang/Class;Ljava/lang/String;)Ljava/util/List; (MongoTemplate.java:823)

通过以上的排查,我们已经定位到代码的报错的位置,最后我们再回归代码进行检测代码,然后找到问题点进行改正。

重点:通过配置ymal文件,产生内存溢出时,会自动将堆文件给导出到服务器,通过堆文件去排查定位问题

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

定位排查Java线上内存溢出问题(服务重启,没有捕获到日志) 的相关文章

  • removeall 和removeif 的用例

    我找到了这个 fun main val list MutableList
  • 调整巨大数组的大小

    我正在我的应用程序中处理巨大的数组 需要调整它们的大小 假设您有一个 2Gb 的阵列 并且想要将其大小调整为 3Gb 有没有办法在暂时不需要 5Gb 的情况下调整它的大小 例如 给定一个 1Gb 堆 使用 Xmx1G flag public
  • 如何以最短的等待时间加速 Java Selenium 脚本

    我目前正在开发一个 java selenium 项目 这通常是一个小脚本 我必须在其中检查每个元素是否存在 并基于触发一些操作 但我们主要关心的是完成脚本的持续时间 基本上 我在脚本中使用了下面的每一个并运行了测试 尽管在每种情况下脚本都在
  • Hibernate 对集合的查询过滤器

    我想执行以下查询 from Item i where i categoryItems catalogId catId 然而 这会产生以下异常 非法尝试取消引用集合 所以我用谷歌搜索 找到了这个 Hibernate 论坛帖子https for
  • 使用 apache PDF-Box 插入 PDF 附件的缩略图

    我有一个代码可以将文件附加到 PDF 文件 PDDocument doc new PDDocument PDPage page new PDPage doc addPage page read attachment file File fi
  • 使用 API 将文件上传到 Google 云端硬盘并出现错误 403

    我想将 zip 文件上传到 Google 云端硬盘 我使用 Java 快速入门 https developers google com drive v3 web quickstart java https developers google
  • 坐标算法 - 绕中心旋转

    通过查看这张图片 我想您会很好地理解我的问题 图片已删除 网址不再有效 现在返回广告 所以基本上我想要一个函数 它接受一个对象作为参数 并根据我之前添加的对象数量为该对象提供正确的坐标 假设我将所有这些对象添加到一个数组中 objectAr
  • 使用套接字和 AsyncTask 强制关闭

    堆栈的人们大家好 请参阅下面我的班级代码和我的 LogCat 尝试连接时我受到强力关闭 如果有人能帮助我找出原因 我将不胜感激 基本上代码的作用是 从意图中获取 IP 地址 连接到端口 32 的 IP 然后发送一个命令 等待响应并发送另一个
  • 检测文本字段溢出

    假设我有一个 PDF 文档 其中的文本字段定义了某种字体和大小 有没有办法确定某些文本是否适合字段矩形内PDFBox 我试图避免文本未完全显示在字段内的情况 因此 如果给定字体和大小的文本溢出 我想将字体大小更改为Auto 0 此代码重新创
  • 将 UUID 存储为 base64 字符串

    我一直在尝试使用 UUID 作为数据库键 我希望占用尽可能少的字节数 同时仍然保持 UUID 表示形式的可读性 我认为我已经使用 base64 将其减少到 22 个字节 并删除了一些尾随的 这些 对于我的目的来说似乎没有必要存储 这种方法有
  • 我如何解释这个 JVM 错误?

    我有一个使用一些本机代码的 Java 应用程序 但它出现了错误 我想知道where它有错误 但我不确定如何读取 hs err pid 转储文件 Native frames J compiled Java code j interpreted
  • Android webview 滚动不起作用

    我正在尝试在网络视图中向下滚动到页面底部 我正在使用谷歌在其教程中提供的网络视图示例 我正在使用这行代码来尝试滚动 但它不起作用 mWebView pageDown true 关于如何使其以编程方式滚动有什么建议吗 谢谢 public cl
  • Hibernate注解放置问题

    我有一个我认为很简单的问题 我见过两种方式的例子 问题是 为什么我不能将注释放在字段上 让我举一个例子 Entity Table name widget public class Widget private Integer id Id G
  • Java:迭代 Collection 的最佳方法(此处为 ArrayList)

    今天 当我看到一段我已经使用了数百次的代码时 我很高兴地开始编码 迭代集合 此处为 ArrayList 出于某种原因 我实际上查看了 Eclipse 的自动完成选项 这让我想知道 在什么情况下以下循环比其他循环更好使用 经典的数组索引循环
  • SAML 服务提供商 Spring Security

    当使用预先配置的服务提供者元数据时 在 Spring Security 中 是否应该有 2 个用于扩展元数据委托的 bean 定义 一份用于 IDP 元数据 一份用于 SP 元数据
  • 如何使用 Java 处理 Selenium WebDriver 中的新窗口?

    这是我的代码 driver findElement By id ImageButton5 click Thread sleep 3000 String winHandleBefore driver getWindowHandle drive
  • 比较两个文本文件的最快方法是什么,不将移动的行视为不同

    我有两个文件非常大 每个文件有 50000 行 我需要比较这两个文件并识别更改 然而 问题是如果一条线出现在不同的位置 它不应该显示为不同的 例如 考虑这个文件A txt xxxxx yyyyy zzzzz 文件B txt zzzzz xx
  • 如何在不超过最大值的情况下增加变量?

    我正在为学校开发一个简单的视频游戏程序 我创建了一个方法 如果调用该方法 玩家将获得 15 点生命值 我必须将生命值保持在最大值 100 并且由于我目前的编程能力有限 我正在做这样的事情 public void getHealed if h
  • Cassandra java驱动程序协议版本和连接限制不匹配

    我使用的java驱动程序版本 2 1 4卡桑德拉版本 dsc cassandra 2 1 10cql 的输出给出以下内容 cqlsh 5 0 1 Cassandra 2 1 10 CQL spec 3 2 1 Native protocol
  • 如何安全地解决这个 Java 上下文类加载器问题?

    我的数百名用户中只有一位在启动我的 Java 桌面应用程序时遇到问题 他只有大约三分之一的时间开始 另外三分之二的时间在启动时抛出 NullPointerException Exception in thread AWT EventQueu

随机推荐

  • Linux进阶_PAM认证机制详解

    成功不易 加倍努力 PAM认证机制 1 PAM 介绍 2 PAM架构 3 PAM相关文件 4 PAM工作原理 5 PAM 配置文件格式说明 6 PAM模块帮助 7 常用PAM模块 7 1 pam shells 模块 7 2 pam secu
  • AWD平台搭建

    这里采用github开源的AWD平台 https github com vidar team Cardinal 搭建平台 查看教程和官方文档 https cloud tencent com developer article 1744139
  • unity 之Animation

    Animation Clips Animation Clip 在untiy中有两种方式创建 一种是从外边导入 另一种是在unity内部创建 Animation from External Sources 外部导入的animation可以有
  • 海外自媒体多账号运营注意事项看这里!

    做跨境电商的小伙伴都知道 要想获得电商平台之外的流量 就必须做海外自媒体账号运营 且是多个账号运营 这样才能积累更多的流量 但海外自媒体账号运营不是一件容易的事情 注意事项比较多 很多小白刚入行不清楚 这里我就大家汇总了一些海外自媒体多账号
  • linux 设置端口密码,SSH更改默认端口号及实现免密码远程登陆

    近来在复习防火墙管理工具 iptables 的基本使用方法 涉及到对端口添加或删除防火墙策略的内容 之前对ssh更改默认端口号及免密码登录的方法不熟悉 这次做一个基本的总结防止自己遗忘 错误偏差及其他经验之处 还望各位多多支出 系统环境 两
  • 自定义横向ProgressBar样式圆角改直角

    横向progressBar的progress部分是圆角的 如果background是直角 那看起来不怎么和谐 所以这篇博文介绍progress部分改直角 在drawable目录下新建一个 progress style xml
  • R语言 第3章 R语言常用的数据管理(2)

    关注公众号凡花花的小窝 收获更多的考研计算机专业编程相关的资料 字符串处理 正则表达其实就是对文本进行模式匹配 所有语言中的正则表达式都有一些共同的特征 我们使用help regex 命令查看R正则表达的帮助内容 在我看来 正则表达式的主要
  • umi框架实战项目

    29 9React课程 第10节 umi框架实战项目 第10节 umi框架实战项目 第10节 umi框架实战项目 Generator是异步解决方案 next执行下一个步骤 可以放在后面也可以放在前面 Yield表示暂停 import Rea
  • [已解决]java.lang.NoClassDefFoundError: com/google/common/base/Function

    为了解决inject的报错 pom已经被我改乱了 结果最后即便改过来 项目编译报了以上错误 据说是缺少一个jar包 我用的是selenium 2 46 0 所以需要下载对应版本 selenium server standalone 2 46
  • Sentinel高并发解决方案

    Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景 本文介绍阿里开源限流熔断方案 Sentinel 功能 原理 架构 快速入门以及相关框架比较 基本介绍 1 名词解释 服务限流 当系统资源不够 不足以应对大量请求 对系统
  • 常见异常解析

    ConcurrentHashMap与CopyOnWriteArrayList比较 博客分类 Java ConcurrentHashMap ConcurrentHashMap引入了Segment 每个Segment又是一个hashtable
  • LeetCode 之 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面(Java)

    文章目录 LeetCode 之 剑指 Offer 21 调整数组顺序使奇数位于偶数前面 Java 一 题目 二 解题思路 三 代码 LeetCode 之 剑指 Offer 21 调整数组顺序使奇数位于偶数前面 Java 一 题目 剑指 Of
  • QuaggaJS在给定图像中定位条形码的工作原理

    QuaggaJS在给定图像中定位条形码的工作原理 一 介绍 二 步骤 1 创建图像的二进制表示 2 将图像切成网格 20 x 15个单元 3 提取每个细胞的骨架 4 组件标记 5 确定组件的方向 6 测定细胞质量 7 查找连接的单元格 8
  • PDF去水印教程

    现在的互联网时代是一个共享的时代 我们一定会经常从网络上面下载一些文件资料等等 那么是不是经常会遇到一些网站上的PDF文件会含有该网站的水印或者网址链接等等 这些水印有时候会影响我们正常的阅读文件 那么我们就需要将他们都去掉 接下来我们就是
  • java利用条件运算符的嵌套来完成此题:学习成绩> =90分.....(java50道经典编程题)

    题目 利用条件运算符的嵌套来完成此题 学习成绩 gt 90分的同学用A表示 60 89分之间的用B表示 60分以下的用C表示 这是一个写条件运算的例子 先和大家聊一下条件运算符 所谓条件运算也是比较简单的格式如下 基本格式 条件 值1 值2
  • AD9910模块高速DDS模块、功能性能讲解、开发调试注意事项、代码详解、电子设计大赛DDS

    AD9910模块高速DDS模块 STM32 驱动代码 功能性能讲解 开发调试注意事项 代码详解 电子设计大赛DDS 目录 AD9910模块高速DDS模块 STM32 驱动代码 功能性能讲解 开发调试注意事项 代码详解 电子设计大赛DDS 1
  • 稀疏数组和二维数组转换(以及持久化io实现)

    稀疏数组 1 当一个数组中大部分元素为0 或者为同一值的数组时 可以使用稀疏数组来保存数组 2 稀疏数组的处理方式是 a 记录数组一共有几行几列 有多少个不同值 b 把具有不同值元素的行 列及值记录在一个小规模的数组中 从而缩小程序的规模
  • 遥感影像深度学习样本制作

    交流QQ 3239516597 对于遥感同学 在学习深度学习时 第一步就要解决遥感数据样本的制作 遥感影像数据的样本根据不同的应用也有所不同 不知道的同学可以去看视频 遥感深度学习样本制作视频1 今天介绍一下如果已经有了遥感影像和对应的类别
  • 地址栏输入 URL 敲下回车后发生了什么

    浏览器地址栏输入 URL 回车后发生了什么 一 总结分析 分析如下 从输入 URL到回车后发生的行为如下 URL解析 DNS 查询 TCP 连接 HTTP 请求 响应请求 页面渲染 URL解析 首先判断你输入的是一个合法的URL 还是一个待
  • 定位排查Java线上内存溢出问题(服务重启,没有捕获到日志)

    一 场景 线上项目device服务模块内存不断上涨导致CPU较高 导致触发脚本执行重启 接口自动化测试平台不断的报500拒绝连接等错误提示 排查 通过服务器日志查询并没有异常错误信息打印 查看docker容器的日志发现错误是打印控制台 无法