如何在 Windows 上为 Java 应用程序使用 mimalloc (或 jemalloc )?

问题描述 投票:0回答:1

我们在 Windows 上有一个完全用 java(实际上是 kotlin)编写的应用程序。使用malloc,我们的应用程序进程似乎在增长并且没有释放内存,并且堆或Java本机内存分析器中的任何其他部分都没有问题。最后我们发现问题是 malloc 没有释放一些内存,因为当我们在 Linux 上使用 LD_PRELOAD 和 mimalloc (或 jemalloc )运行应用程序时,它工作得很好。(更多详细信息请参阅here)。 我的问题是,如何让我们的 java 应用程序对所有内容使用 mimalloc (或 jemalloc )而不是 Windows 中的 malloc ? (有些相当于 Windows 中 Linux 中的 PRE_LOAD )。

java windows malloc jemalloc mimalloc
1个回答
0
投票

在Windows上,相当于Linux上的LD_PRELOAD,它允许您预加载特定的库,例如mimalloc或jemalloc,是通过多种方法实现的。以下是在 Windows 上为 Java (Kotlin) 应用程序实现此目的的几种方法:

  1. 使用SetDllDirectory API: 在 Windows 中,您可以使用 SetDllDirectory API 加载自定义分配器 DLL(如 mimalloc.dll 或 jemalloc.dll),以确保您的自定义分配器先于其他分配器找到并加载。

实现这一目标的步骤: 下载或构建适用于 Windows 的 mimalloc.dll 或 jemalloc.dll(确保它与您的体系结构兼容,例如 x64 或 x86)。 将 DLL 放置在与 Java (Kotlin) 应用程序相同的目录中,或者在启动 JVM 之前使用 SetDllDirectory 指定目录。 在 Java 程序或启动脚本的开头添加以下行: 巴什 复制代码 java -Djava.library.path =“path_to_your_allocator_dll” 2.使用全局环境变量: 设置PATH环境变量以包含mimalloc.dll或jemalloc.dll所在的目录。这将允许系统在标准内存分配例程之前加载它。

步骤:

在 PATH 环境变量中添加自定义分配器 DLL 的路径。 重新启动您的应用程序,它应该会获取分配器 DLL。 3. 通过动态链接覆盖 malloc: 如果您可以控制 Java 应用程序与之交互的本机库(例如 JNI 库),您可以显式链接到 mimalloc.dll 或 jemalloc.dll,而不是标准的 msvcrt.dll 来进行内存管理。

步骤:

确保您的本机库(如果有)使用自定义分配器。 配置您的构建系统以动态链接自定义分配器。 4.运行时注入DLL: 您可以使用第三方DLL注入工具将mimalloc.dll或jemalloc.dll注入到进程中。虽然这种方法不太优雅,但它可以有效地强制 JVM 使用自定义内存分配器。

DLL Injector 等工具或使用 CreateRemoteThread 和 LoadLibrary 编写自己的注入器可用于加载所需的内存分配器 DLL。

使用 SetDllDirectory 的示例: 如果您使用批处理文件来启动 Java 应用程序,您可以执行以下操作:

批次 复制代码

@echo off
set "ALLOCATOR_PATH=C:\path\to\mimalloc"
set "PATH=%ALLOCATOR_PATH%;%PATH%"
java -jar yourapp.jar

这种方法确保当 Java 应用程序启动时,它使用 mimalloc.dll 进行内存分配。

注意事项: 确保您使用的 mimalloc.dll 或 jemalloc.dll 版本与您的 JVM 兼容并匹配体系结构(x86 或 x64)。 您可能需要使用不同版本的 mimalloc 或 jemalloc 进行测试,以确保与 Windows 和 JVM 的兼容性。 这些是确保 Windows 上的 Java (Kotlin) 应用程序使用 mimalloc 或 jemalloc 而不是默认的 malloc 的一些常见方法。

© www.soinside.com 2019 - 2024. All rights reserved.