问题标签 [jemalloc]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
2307 浏览

makefile - 如何使用 cmake 链接 jemalloc 共享库

我试图在构建时将 jemalloc 库链接到我的应用程序中,并将其用作通用实现。根据https://github.com/jemalloc/jemalloc/wiki/Getting-Started使用的链接标志是:

所以我做了以下CMakeLists.txt

但是当我这样做时make,会出现以下错误

0 投票
0 回答
615 浏览

c - Linux 上的 redis jemalloc

这些天我进入了 Redis 开源项目,所以我已经阅读了该项目的 README。

读到这里,我不得不质疑 Redis 的内存分配器。

~~~

在构建 Redis 时选择非默认内存分配器是通过设置 MALLOC 环境变量来完成的。默认情况下,Redis 是针对 libc malloc 编译和链接的,但 jemalloc 是 Linux 系统上的默认值。之所以选择此默认值,是因为 jemalloc 已被证明比 libc malloc 具有更少的碎片问题。

~~~

我很难理解jemallocLinux 系统上 Redis 的默认设置的原因。

我简要地看到了 jemalloc,他们说,“jemalloc 的实现强调避免碎片和可扩展的并发支持”。

这仅仅是为了在 Linux 上获得更好的 Redis 性能,还是有任何理由使用 jemalloc?

感谢您阅读我的问题。

0 投票
2 回答
3148 浏览

java - jemalloc 使用 jeprof 从 '*.heap' 文件生成 gif

首先,jemalloc(在我的用例中)的目的是跟踪由 JNI 调用之类的事情引起的本机内存分配,所以让我们开始吧:

大家好,我这里有一些严重的问题。我们碰巧在我们的一个应用程序中发生了内存泄漏。它位于 JNI 库中,特别是对于那些了解它的人 - cplex。我已经知道了,但是自从我们的经理要求我现在获得证明以来,我正在花费大量时间来尝试获得证明。我遇到了一个名为 jemalloc 的怪物工具(是的,我知道它不仅仅是一个工具),它应该创建“ .heap”文件,这很棒,尽管我看不到任何方法可以从该文件中实际读取任何有意义的内容,但我还是成功了,这里是示例:生成的“ .heap”文件的 PNG 图像 - 仅前几行,但看起来很像

比我发现还有一个叫做“jeprof”的怪物显然可以将那个“ .heap”文件转换为漂亮的“ .gif”——你所要做的就是像这样运行命令:jeprof --show_bytes --gif /path/to/jvm/bin/java jeprof*.heap > /tmp/app-profiling.gif它应该会导致在此处的示例(和描述)中:https ://gdstechnology.blog.gov.uk/2015/12/11/using-jemalloc-to-get-to-the-bottom-of-a-memory-leak/ (您需要将页面向下滚动到“JEMALLOC 救援”部分以查看我正在谈论的 gif 示例)。

不幸的是,除了我所包含的博客之外,关于如何实际使用它的信息只有 0 条。每次我尝试使用以下确切命令生成该 gif 时:jeprof --show_bytes --gif java jeprof.out.14441.5.i5.heap > ../../../sheetchallenger/temp/app-profiling_14_10.gif- 我得到以下答案,并创建了一个大小为 0 字节的空 gif:

这是它似乎在谈论的“jeprof”文件(我的意思是第 3256 行周围的部分):

从字面上不知道这是想告诉我什么,为什么它使用http?做什么的?我知道没有创建某种类型的配置文件,或者它似乎在说什么配置文件,在哪里,如何?

提到我第一次运行这个“jeprof 堆文件到 gif 转换命令”时,我收到了以下回复,也许会有所帮助:

这到底是什么意思,我为什么要关心——这很重要,什么遥远的形式,什么的形式,为了什么?

所以基本上问题是:因为我已经可以生成那些不幸的“* .heap”文件(如果这些文件似乎不正确,请有人纠正我)我到底如何将它们转换为有用的东西,最好使用 jeprof 或任何东西别的?

我可以将它们转换为我在上面链接的本网站上显示的那个 gif ( https://gdstechnology.blog.gov.uk/2015/12/11/using-jemalloc-to-get-to-the-bottom-of -a-memory-leak/)或者我可以用它们做其他事情吗?

向你们所有人致以亲切的问候,希望有人能帮助我解决这个问题。

0 投票
2 回答
22434 浏览

gcc - 错误jemalloc/jemalloc.h:制作Redis时没有这样的文件或目录

我正在尝试设置我的 Redis 服务器,当执行 make 命令时,出现错误:“jemalloc/jemalloc.h:制作 Redis 时没有这样的文件或目录”,我已经尝试了所有我能找到的步骤,例如 make distclean 或 make MALLOC=libc。我正在开发 CentOS,它正在我的另一台 Ubuntu 服务器上工作。

系统信息:Linux ec4t02229 3.10.0-514.10.2.el7.x86_64 #1 SMP Fri Mar 3 00:04:05 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

以下是我的输出,任何建议将不胜感激。

0 投票
1 回答
1112 浏览

ruby - 使用 jemalloc 调试 sidekiq worker 内存泄漏

所以,我的 Sidekiq 工作人员出现了内存泄漏。我有一个工作服务器,只有一个队列用于这个工作任务,一周内达到大约 10G RSS。

我尝试仅使用 1 个工作线程在本地复制它,瞧——我在一夜之间从 200M 到 1G,处理 1 个任务/分钟。自然,我想知道泄漏了什么,所以我也在记录 RSS、heap_live_slots 和 heap_free_slots。当我绘制结果时,我可以看到稳定的RSS增长,而实时和空闲插槽随机波动,但在定义明确且恒定的边界内,而它们的总和保持不变。

在这一点上,我得出的结论是泄漏可能不是发生在 Ruby 代码中,而是发生在一些本机扩展中。所以我通过 RVM 重新安装了带有 Jemalloc 支持的 ruby​​: rvm reinstall 2.4.2 --with-jemalloc

然后我设置MALLOC_CONF

export MALLOC_CONF='prof_leak:true,lg_prof_sample:0,prof_final:true,stats_print:true'

并启动 Sidekiq。新启动的带有 1 个工作线程的 Sidekiq 价值大约 200M RSS,但是当我按 Ctrl+C 并查看 jemalloc 的统计输出时,我看到了一些完全不同的东西:

什么?6M映射?这不可能是真的。所以我启动 irb 并执行以下操作:

等到 irb 进程爬升到大约 1G RSS 后,我停止了进程……并看到完全相同的数字。也许可视化调用图会帮助我理解发生了什么?

所以有些事情显然是错误的,这就是我需要帮助解决的问题。

这是 jemalloc stat 的完整输出:https ://pastebin.com/RiMLtqA6

UPD。

因此,我更新了所有与本机扩展相关的 gem,输出如下 bundle exec ruby -e 'puts Gem.loaded_specs.values.select{ |i| !i.extensions.empty? }.map{ |i| "#{i.name} #{i.version}" }'

相同的结果:RSS内存插槽

0 投票
1 回答
1903 浏览

java - JVM_FindSignal 函数不断分配本机内存

我在 linux 机器上的 tomcat8 中部署的 java web 应用程序一直在泄漏本机内存,我尝试使用 jemalloc 分析来检测泄漏源,如下所述:https ://github.com/jeffgriffith/native-jvm-在运行超过 24 小时的服务器上泄漏 带有堆转储的分析工具的输出:

如图: 内存分配调用图

我还使用 Java 本机内存跟踪工具来查明泄漏https://docs.oracle.com/javase/8/docs/technotes/guides/vm/nmt-8.html NMT 报告内存在“内部”下泄漏' 部分。调用图表明 JVM_FindSignal 是作为 start_thread 的结果调用的,但是,NMT diff 工具报告应用程序线程的数量几乎是恒定的并且保持在 ~300。

JVM 选项:

那么,JVM_FindSignal 已分配但未释放 789 兆字节的本机内存,有没有人知道 JVM_FindSignal 做了什么以及为什么它会不断分配内存?

0 投票
0 回答
439 浏览

java - 如何在 Windows 7 32 位上运行的应用程序中调用 Jemalloc.dll

我想使用 jemalloc 对 DLL 进行内存分析。

我正在使用 jemalloc 4.3.0。我在 Microsoft Visual Studio 2015 中构建它。

现在如何jemalloc.dll在应用程序中使用?

该应用程序是 Java 语言,它使用用 C++ 编写的本机代码。我的操作系统是 Windows 7,32 位。

0 投票
0 回答
1022 浏览

c++ - 像 tcmalloc 一样在 Windows 上使用 jemalloc

我想jemalloc在 Windows上使用tcmalloc。在tcmalloc我只需要tcmalloc在源代码中包含标头并在链接器选项中使用tcmalloc_minimal.lib强制包含__tcmalloc符号进行链接。所有malloc和免费调用都被tcmalloc实现所取代。

但在 jemalloc 中,所有函数都有 je_ 前缀,它不会用 jemalloc 函数替换 CRT malloc/free 等。

我怎样才能做到这一点?

0 投票
0 回答
338 浏览

c - Windows VS2017 上的 jemalloc 环境设置

我正在按照此处给出的说明进行操作(此页面指示 VS2015,但从已发布的 jemalloc 获得的文件夹包含 2015 和 2017 的 sln),但运行失败:

来自“VS x86 Native Tools Command Prompt”(此处为 VS2017),日志如下:

我想我错过了一些先决条件或其他东西。我尝试从ftp://sourceware.org/pub/pthreads-win32/dll-latest手动安装 pthread (按照一些 google 链接)。但这是好的链接吗?

我也在这里看到了一些类似这个答案,但它对我不起作用,可能是因为引用了旧版本的 jemalloc。

如何在 Windows 上正确安装 jemalloc?

编辑:尝试使用 Cygwin 而不是 bash,现在的错误是:

0 投票
1 回答
4314 浏览

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

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

可能存在本机内存泄漏,因为在使用 VisualVM 检查 JVM 后,元空间和堆看起来都正常。

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

本文第一张图:

示例 #1

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

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

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

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

我尝试先完成简单的步骤:

让 JeMalloc 与一个简单的应用程序一起工作,例如 w。接下来让它与 java -version 一起工作。到目前为止一切顺利,我还可以从 JeMalloc 获得 PDF,并提供完美的概述。

接下来让它与 java -jar simpletest.jar << 这里我缺少符号 例如,如果我没有在此处关闭 GZipInputStream ,则它不会显示在 JeMalloc 结果中。

接下来让它与 java -jar myapplication.jar << 这里我也缺少符号。

所以我的问题基本上是:我需要什么包才能让 JeMalloc 显示所有符号名称来调试应用程序,例如:

使用以下软件:

  • Linux CentOS 7
  • 杰马洛克
  • OpenJDK

找到的文章:

第1条

第 2 条

第 3 条

第 4 条