Java JNA 包装器和内存消耗
Java JNA wrapper and memory consumption
我有一个问题,JVM 进程与 JNA 包装器如何显示内存消耗。
例如我 运行 Java 使用 OpenCV JNA 包装器的应用程序。 Java 应用程序本身消耗例如 1GB 的 RAM,而 OpenCV 本机库消耗 3GB 的 RAM。
所以总的来说,当我找到合适的 Java JVM 进程(通过 ps
命令)时,它会显示 1GB RAM 或 4GB(1 + 3) RAM?
您的 ps
输出将显示 1GB 的 RSS(驻留集大小——分配给该进程的内存量,位于 RAM 中。)Java 进程不会直接显示使用本机内存;但是,它将显示为 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
)保留多少本机内存,Java 应用程序始终在 RSS 中使用相同数量的内存,并限制 Java 使用 -Xmx
的堆大小不会阻止超出此限制的本机内存分配。然而,1 GiB 的本机内存显然从 OS 的 "available" 内存中消失了。
我将上面的代码放在一个循环中递增用于分配的左移值,运行 它使用 -Xmx512m
它应该将 JVM 堆限制为 512 MiB。包含所有 JVM 堆栈和堆内存的 RSS 保持在 ~50 MiB 运行ge。分配的内存确实显示在与进程关联的 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
我有一个问题,JVM 进程与 JNA 包装器如何显示内存消耗。
例如我 运行 Java 使用 OpenCV JNA 包装器的应用程序。 Java 应用程序本身消耗例如 1GB 的 RAM,而 OpenCV 本机库消耗 3GB 的 RAM。
所以总的来说,当我找到合适的 Java JVM 进程(通过 ps
命令)时,它会显示 1GB RAM 或 4GB(1 + 3) RAM?
您的 ps
输出将显示 1GB 的 RSS(驻留集大小——分配给该进程的内存量,位于 RAM 中。)Java 进程不会直接显示使用本机内存;但是,它将显示为 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
)保留多少本机内存,Java 应用程序始终在 RSS 中使用相同数量的内存,并限制 Java 使用 -Xmx
的堆大小不会阻止超出此限制的本机内存分配。然而,1 GiB 的本机内存显然从 OS 的 "available" 内存中消失了。
我将上面的代码放在一个循环中递增用于分配的左移值,运行 它使用 -Xmx512m
它应该将 JVM 堆限制为 512 MiB。包含所有 JVM 堆栈和堆内存的 RSS 保持在 ~50 MiB 运行ge。分配的内存确实显示在与进程关联的 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