gpt4 book ai didi

Java JNA 包装器和内存消耗

转载 作者:行者123 更新时间:2023-11-30 01:51:39 25 4
gpt4 key购买 nike

我有一个问题,带有 JNA 包装器的 JVM 进程如何显示内存消耗。

例如,我运行使用 OpenCV JNA 包装器的 Java 应用程序。例如,Java 应用程序本身消耗 1GB RAM,OpenCV native 库消耗 3GB RAM。总的来说,当我找到合适的 Java JVM 进程(通过 ps 命令)时,它会显示 1GB RAM 或 4GB(1 + 3) RAM?

最佳答案

您的 ps 输出将显示 RSS 的 1GB(驻留集大小 - 分配给该进程并位于 RAM 中的内存量。)Java 进程不会直接显示已使用的 native 内存;但是,它将显示为 VSZ(虚拟内存大小 - 进程可以访问的所有内存,包括换出的内存、已分配但未使用的内存以及来自共享库的内存。)的一部分。

例如,我编写了以下代码:

import com.sun.jna.Memory;

public class TinyJavaBigC {
public static void main(String[] args) {
// Grab 1 GiB of memory
Memory buf = new Memory(1 << 30);
// Sleep long enough to grab ps
}
}

无论使用 new Memory(bytes)(有效调用 malloc)保留的 native 内存量是多少,Java 应用程序始终在 RSS 中使用相同数量的内存,并且使用 -Xmx 限制 Java 堆大小并不能阻止超出此限制的 native 内存分配。然而,1 GiB 的 native 内存显然从操作系统的“可用”内存中消失了。

我将上面的代码放在一个循环中,增加分配的左移值,并使用 -Xmx512m 运行它,这应该将 JVM 堆限制为 512 MiB。 RSS(包括所有 JVM 堆栈和堆内存)保持在 ~50 MiB 范围内。分配的内存确实显示在与进程关联的 VSZ 中。由于这还包括其他类型的内存,因此它不是直接测量,并且大大超出了可用 RAM 和交换文件大小限制,但它至少给出了分配增加的一些指示。

Native Memory          RSS          VSZ
1 byte 42.0 MiB 9.6 GiB
2 bytes 45.8 MiB 9.6 GiB
4 bytes 46.0 MiB 9.6 GiB
8 bytes 46.1 MiB 9.6 GiB
16 bytes 46.3 MiB 9.6 GiB
32 bytes 46.5 MiB 9.6 GiB
64 bytes 47.0 MiB 9.6 GiB
128 bytes 47.5 MiB 9.6 GiB
256 bytes 47.6 MiB 9.6 GiB
512 bytes 48.9 MiB 9.6 GiB
1 KiB 49.1 MiB 9.6 GiB
2 KiB 49.2 MiB 9.6 GiB
4 KiB 49.3 MiB 9.6 GiB
8 KiB 49.3 MiB 9.6 GiB
16 KiB 49.8 MiB 9.6 GiB
32 KiB 50.1 MiB 9.6 GiB
64 KiB 50.1 MiB 9.6 GiB
128 KiB 50.6 MiB 9.6 GiB
256 KiB 51.4 MiB 9.6 GiB
512 KiB 51.3 MiB 9.6 GiB
1 MiB 51.4 MiB 9.6 GiB
2 MiB 51.4 MiB 9.6 GiB
4 MiB 51.4 MiB 9.6 GiB
8 MiB 51.4 MiB 9.6 GiB
16 MiB 51.3 MiB 9.7 GiB
32 MiB 51.3 MiB 9.7 GiB
64 MiB 51.7 MiB 9.8 GiB
128 MiB 51.7 MiB 9.9 GiB
256 MiB 51.6 MiB 10.1 GiB
512 MiB 51.6 MiB 10.5 GiB
1 GiB 51.7 MiB 11.3 GiB
2 GiB 51.8 MiB 12.8 GiB
4 GiB 51.9 MiB 15.8 GiB
8 GiB 51.9 MiB 21.8 GiB
16 GiB 52.0 MiB 33.8 GiB
32 GiB 52.0 MiB 57.8 GiB
64 GiB 52.1 MiB 105.8 GiB
128 GiB 52.1 MiB 201.8 GiB
256 GiB 52.5 MiB 393.8 GiB
512 GiB 52.6 MiB 777.8 GiB
1 TiB 52.7 MiB 1.5 TiB
2 TiB 52.7 MiB 3.0 TiB
4 TiB 52.8 MiB 6.0 TiB
8 TiB 52.9 MiB 12.0 TiB
16 TiB 53.1 MiB 24.0 TiB
32 TiB 53.2 MiB 48.0 TiB
Exception in thread "main" java.lang.OutOfMemoryError: Cannot allocate 70368744177664 bytes

关于Java JNA 包装器和内存消耗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55808872/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com