首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java JNA包装器和内存消耗

问Java JNA包装器和内存消耗
EN

Stack Overflow用户
提问于 2019-04-23 18:11:12
回答 1查看 449关注 0票数 1

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

例如,我运行使用OpenCV JNA包装器的Java应用程序。例如,Java应用程序本身消耗1 3GB的内存,而OpenCV本地库则消耗3 3GB的内存。那么,当我找到合适的Java JVM进程(通过ps命令)时,它会显示1 4GB内存还是4 4GB(1 + 3)内存?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-23 23:46:37

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

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

代码语言:javascript
复制
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中始终使用相同数量的内存,并且使用-Xmx限制Java堆大小并不会阻止分配超过此限制的本机内存。然而,本机内存的1 GiB显然从操作系统的“可用”内存中消失了。

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

代码语言:javascript
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55808872

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档