使用 JeMalloc 查找 Java 应用程序中的本机内存泄漏

2023-11-26

目前我正在尝试解决 Java 内存问题: 我的 Java 应用程序不断使用越来越多的内存 最终它被 Linux OOM 杀手杀死。

很可能是本地内存泄漏,因为经过检查 使用 VisualVM 的 JVM 的元空间和堆看起来都不错。

使用top命令我可以看到JVM使用的内存 持续增加。

本文中的第一张图:

例子#1

与我在自己的应用程序中看到的完美匹配。

因此,我尝试使用 JeMalloc 来查找泄漏,如各种文章中所述。 这里我遇到了一个问题:当使用 jeprof 命令及以后 jeprof 本身的 top 命令,它确实显示了使用的函数 最多的内存,但这些是十六进制地址,所以我必须 缺少一些符号。但我不知道我需要哪些软件包,这对我来说是未知的。

我已经找到这个链接:Link #1

并安装了这个包: debuginfo-安装 java-1.8.0-openjdk

我首先尝试执行简单的步骤:

让 JeMalloc 与简单的应用程序一起使用,例如 w。 接下来让它与 java -version 一起使用。 到目前为止一切顺利,我还可以从 JeMalloc 获取具有完美概述的 PDF。

接下来让它与 java -jar simpletest.jar

接下来让它与 java -jar myapplication.jar

所以我的问题基本上是: 为了让 JeMalloc 显示所有符号名称以调试应用程序,我需要哪些包,例如:

public void test1() {
    InputStream fileInputStream = null;
    GZipInputStream gzipInputStream = null;

    try {
      fileInputStream = new FileInputStream("test.zip");
      gzipInputStream = new GZIPInputStream(fileInputStream);

      int data = gzipInputStream.read();
      while (data != -1) {
        // do something with data
        data = gzipInputStream.read();
      }

    } catch (Exception ex) {

    } finally {
      // Disabled to see whether JeMalloc can detect the leak
      /*try {
        if (gzipInputStream != null) {
          gzipInputStream.close();
        }
        if (fileInputStream != null) {
          fileInputStream.close();
        }

        gzipInputStream = null;
        fileInputStream = null;
      } catch (IOException e) {
      e.printStackTrace();
    }*/
  }
}

使用以下软件:

  • Linux CentOS 7
  • JeMalloc
  • OpenJDK

找到的文章:

第1条

文章#2

文章#3

文章#4


替换分配器(例如使用 jemalloc 或 tcmalloc)来分析内存使用情况可能会提供有关本机内存泄漏来源的提示,但仅限于 JVM 中加载的库中可用的本机代码符号。

要在堆栈跟踪中包含 Java 类/方法,需要生成一个将本机代码内存位置与其来源相关联的映射文件。在撰写本文时唯一的工具是https://github.com/jvm-profiling-tools/perf-map-agent

为了在堆栈中获得不仅仅是“解释器”名称,相关代码必须进行 JIT 编译,因此强制使用-XX:CompileThreshold=1JVM 命令行选项很有趣(IMO 生产中除外)。

当代理加载到 JVM 中、生成映射文件并进行 JIT 编译时,perf可用于报告 CPU 分析。内存泄漏调查需要更多处理。

最好的选择是获得bcc和它的memleak如果您的 Linux 内核是 4.9 或更高版本,则使用该工具:https://github.com/iovisor/bcc/blob/master/tools/memleak_example.txt

非常感谢布伦丹·格雷格

简单的配置后Debian系统就准备好了apt install bcc,但 RedHat 系统需要更多工作,如 CentOS 7 中所述http://hydandata.org/installing-ebpf-tools-bcc-and-ply-on-centos-7(在 CentOS 6 上更糟)

作为备选,perfonly 还可以使用特定探针报告泄漏堆栈跟踪。脚本和示例用法可在https://github.com/dkogan/memory_leak_instrumentation但必须适应 Java 上下文。

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

使用 JeMalloc 查找 Java 应用程序中的本机内存泄漏 的相关文章

  • 如何在 Android 应用程序中隐藏 Flutterwave API 密钥

    我正在构建一个 Android 应用程序 目前正在将 Flutterwave 集成到我的应用程序中以进行支付 建议我永远不要将 Flutterwave API 密钥放在我的应用程序上 那么我该如何隐藏这些键呢 我正在使用 Retrofit
  • 在 Ubuntu 16.04 上找不到 printf.c

    我最近切换到Ubuntu 16 04 我在用vscode作为 Ubuntu 上的 IDE 我配置了其他语言 但我无法做到这一点C C 我创建c cpp properties json launch json tasks json 当我开始编
  • 为什么在 10 个 Java 线程中递增一个数字不会得到 10 的值?

    我不明白 a 的值为0 为什么 a 不是10 那段代码的运行过程是怎样的 是否需要从Java内存模型来分析 这是我的测试代码 package com study concurrent demo import lombok extern sl
  • Java LostFocus 和 InputVerifier,按反向制表符顺序移动

    我有一个 GUI 应用程序 它使用 InputVerifier 在产生焦点之前检查文本字段的内容 这都是很正常的 然而 昨天发现了一个问题 这似乎是一个错误 但我在任何地方都找不到任何提及它的地方 在我将其报告为错误之前 我想我应该问 我在
  • 每个进程每个线程的时间量

    我有一个关于 Windows 和 Linux 中进程和线程的时间量子的问题 我知道操作系统通常为每个线程提供固定的时间量 我知道时间量根据前台或后台线程而变化 也可能根据进程的优先级而变化 每个进程有固定的时间量吗 例如 如果操作系统为每个
  • 有人用过 ServiceLoader 和 Guice 一起使用吗?

    我一直想通过我们的应用程序 构建系统进行更大规模的尝试 但更高的优先级不断将其推到次要地位 这似乎是加载 Guice 模块的好方法 并且避免了关于 硬编码配置 的常见抱怨 单个配置属性很少会自行更改 但您几乎总是会有一组配置文件 通常用于不
  • 未装饰窗户的 Windows Snap 功能?

    有谁知道如何允许未装饰的窗户使用此功能 唯一的选择就是重新实施它 有任何想法吗 谢谢 可停靠可能是唯一的JToolBar http docs oracle com javase tutorial uiswing components too
  • 使用 OkHttp 下载损坏的文件

    我编写的下载文件的方法总是会产生损坏的文件 public static String okDownloadToFileSync final String link final String fileName final boolean te
  • Bash 方法的返回值总是模 256

    我有一个 bash 脚本方法 它返回输入值 然而 返回值始终是模 256 的值 我用 google 搜索了一段时间 发现this http www tldp org LDP abs html exitcodes html文章说它总是以 25
  • 为什么解析这个 JSON 会抛出错误?

    我正在尝试解析这个 JSONObject query yahoo count 1 results rate Name USD INR id USDINR Time 12 19pm Date 10 31 2015 Bid 65 405 Ask
  • 数据库中的持久日期不等于检索日期

    我有一个具有 Date 属性的简单实体类 此属性对应于 MySQL 日期时间列 Entity public class Entity Column name start date Temporal TemporalType TIMESTAM
  • Android - 存储对ApplicationContext的引用

    我有一个静态 Preferences 类 其中包含一些应用程序首选项和类似的内容 可以在那里存储对 ApplicationContext 的引用吗 我需要该引用 以便我可以在不继承 Activity 的类中获取缓存文件夹和类似内容 你使用的
  • Java 8 Stream,获取头部和尾部

    Java 8 引入了Stream http download java net jdk8 docs api java util stream Stream html类似于 Scala 的类Stream http www scala lang
  • 无需 cron 在后台发送邮件

    我想知道是否有一种方法可以运行 PHP 循环 以便在后台向订阅者发送几百封电子邮件 我的目标是格式化新闻通讯 单击发送 然后关闭浏览器或更改页面 当然 发送电子邮件的实际过程将在后台运行 不会因浏览器关闭而中断 我知道这可以通过 cron
  • Lombok 不适用于 Eclipse Neon

    我下载了lombok jar lombok 1 16 14 jar 并将其放入我的下载中 然后我点击这个 jar 执行正确地识别了我的 MacOS 上的 Eclipse 实例 然后我选择了我想要的实例 Lombok也在pom xml中指定
  • Android ScrollView,检查当前是否滚动

    有没有办法检查标准 ScrollView 当前是否正在滚动 方向是向上还是向下并不重要 我只需要检查它当前是否正在滚动 ScrollView当前形式不提供用于检测滚动事件的回调 有两种解决方法可用 1 Use a ListView并实施On
  • Java 中清除嵌套 Map 的好方法

    public class MyCache AbstractMap
  • 什么是 Java2D 处理程序线程?

    我创建了一个使用 Hibernate 的示例 java 应用程序 当我进行线程转储时 我观察到一个名为 Java2D Disposer 的奇怪线程 有人能告诉我该线程的功能吗 AWT 系统中的某些实体需要最终确定以释放资源 最突出的例子是j
  • Java 的“&&”与“&”运算符

    我使用的示例来自 Java Herbert Schildt 的完整参考文献 第 12 版 Java 是 14 他给出了以下 2 个示例 如果阻止 第一个是好的 第二个是错误的 因此发表评论 public class PatternMatch
  • GAE 无法部署到 App Engine

    我正在尝试从 Eclipse 发布 Web 应用程序 我在 GAE 上创建了四个项目 可以通过登录我的帐户并查看控制台来查看它们 我已经改变了appengine web xml到项目的应用程序 ID 如果我将其更改为 GAE 上第一个创建的

随机推荐

  • PowerShell 删除项目不等待

    如果有这段代码 if Test Path Path OUT Remove Item OUT Recurse New Item ItemType directory Path OUT 有时它可以工作 但有时 New Item 行会产生一个权限
  • 通配符子域和静态子域的虚拟主机

    我有一个奇怪的情况 我想要 URLapp1 example com example com and example com全部使用不同的虚拟主机 这就是我所拥有的 不包括example com因为它只会让事情变得更加混乱
  • JNI:无法从回调中的本机方法找到 java 类

    我对 JNI 还很陌生 并且正在努力解决这个问题 我有一个由网络库 alljoyn 调用的 C 回调 在这个回调中 我需要调用Java代码 由于此回调位于另一个线程中 因此我使用以下代码来获取 JNIEnv 指针 jvm是全局指针 JNIE
  • HTML5 canvas ctx.fillText 不会换行吗?

    如果文本包含 n 我似乎无法将文本添加到画布 我的意思是 换行符不显示 工作 ctxPaint fillText s ome n n br thing x y 上面的代码将会绘制 s ome n br thing 在一条线上 这是 fill
  • iPhone:以编程方式使用前置摄像头拍照

    我想通过我的 iPhone 应用程序中的前置摄像头以编程方式拍照 我不希望用户选择图像选择器或与图像选择器进行任何交互 只想拍摄图像并将其保存在文档中 这可能吗 我从你的问题中了解到 AV Foundation 就是你所需要的 看看苹果的这
  • MySQL - 从字符串中搜索确切的单词

    我想从字符串中搜索确切的单词 例如 id Description 1 This is nice pen looking good 2 This is nice pendrive looking good 搜索字符串 pen 我当前的查询 S
  • 是否可以设置更高的轴标签 z 索引?

    在以下代码中 轴的标签隐藏在图形线后面 import numpy as np import matplotlib pyplot as plt X np linspace np pi np pi 256 endpoint True C S n
  • Linq int 到 string

    如何将 和 int 转换为字符串 以下均无效 from s in ctx Services where s Code ToString StartsWith 1 select s from s in ctx Services where C
  • 如何使用SQL查找表中N个连续记录

    我有以下带有示例数据的表定义 在下表中 客户产品和日期是关键字段 Table One Customer Product Date SALE X A 01 01 2010 YES X A 02 01 2010 YES X A 03 01 20
  • 通过带范围的关联保存时丢失属性 (Rails 4.0.0)

    代码 Rails 4 0 0 class Track lt ActiveRecord Base has many artist tracks has many owning artists gt where artist tracks gt
  • 创建“金字塔”矩阵

    假设给定一个具有奇数长度的对称行向量 其中每个元素都小于向量前半部分的下一个元素 并且每个元素都大于后半部分的下一个元素 并且中间元素是最大的 例如 1 2 3 2 1 or 10 20 50 20 10 我想创建一个方阵 其中行向量是它的
  • 有没有办法从大比例图像创建 xxhdpi、xhdpi、hdpi、mdpi 和 ldpi 可绘制对象?

    有没有办法从大尺寸图像自动创建 xxhdpi xhdpi hdpi mdpi 和 ldpi 可绘制对象 例如 假设我有一个 512x512 图像 并且我希望在适当的文件夹中针对 Android 支持的不同屏幕分辨率拥有该图像的不同版本 选项
  • 如何在C#中增加控制台窗口的大小?

    我正在为将在应用程序中实现的一项功能创建一个原型 特别是我正在将集合中的数据显示到控制台窗口 但不幸的是 某些行的跨度比控制台窗口的默认宽度更宽 我做了一点挖掘并发现增加窗口宽度的唯一方法是深入研究 Kernel32 dll 并手动完成 尽
  • 加快 Vagrant 上主机和来宾之间的同步延迟(NFS 同步文件夹)

    我正在使用 vagrant 在本地计算机上运行 wordpress 开发环境 并将 nfs 设置为默认文件共享机制 我在 Mac 上 总体性能非常好 除了一件事 同步延迟 我已经在来宾上设置了 grunt 观察程序来重新编译 css jav
  • UTF-8 编码与 Base-64 编码

    我想对一个文件 可能是图像或任何 pdf 进行编码并将其发送到服务器 我必须遵循哪种类型的编码和解码 服务端和客户端都在我们公司 我们可以在两个地方写逻辑 UTF 8 编码java默认支持 并使用Base 64编码我必须导入外部jar 对于
  • Jupyter 笔记本中的自动完成功能不起作用

    安装Anaconda最新版本后 我尝试了以下步骤 我无法让自动完成功能正常工作 关于我还需要尝试什么的任何建议 步骤1 1 pip安装jupyter contrib nbextensions 2 pip安装jupyter nbextensi
  • 忽略 ASP .NET MVC 中的文件夹

    我有一个现有的 ASP NET MVC 应用程序 我想忽略其中的特定文件夹 我打算在其中放置 PHP 脚本 我尝试按照描述添加忽略路由here但它不起作用 因为我仍然收到标准 ASP NET 配置错误 例如 假设我有这个文件夹结构 root
  • 如何使用 Async/Await 快速进行进度报告?

    我有一个需要 2 个回调的函数 我想将其转换为异步 等待 但我怎样才能在等待的同时不断返回进度呢 我在用https github com yannickl AwaitKit摆脱回调 typealias GetResultCallBack S
  • 使用 GROUP BY 和 Count(*) 进行匿名类型的 LINQ 查询

    我尝试使用 LINQ 查询来确定我拥有的每种特定对象类型的数量 并将这些值记录到匿名类型中 假设我有一些看起来像这样的数据 确实有暴露此属性的对象 但它的工作原理相同 GroupId 1 1 2 2 2 3 我知道如何在 SQL 中格式化我
  • 使用 JeMalloc 查找 Java 应用程序中的本机内存泄漏

    目前我正在尝试解决 Java 内存问题 我的 Java 应用程序不断使用越来越多的内存 最终它被 Linux OOM 杀手杀死 很可能是本地内存泄漏 因为经过检查 使用 VisualVM 的 JVM 的元空间和堆看起来都不错 使用top命令