簡體   English   中英

Java JNA包裝器和內存消耗

[英]Java JNA wrapper and memory consumption

我有一個疑問,帶有JNA包裝器的JVM進程如何顯示內存消耗。

例如,我運行使用OpenCV JNA包裝器的Java應用程序。 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中使用相同數量的內存,並且使用-Xmx限制Java堆大小並不會阻止超出此范圍的本機內存分配限制。 但是,本機內存的1 GiB顯然已從操作系統的“可用”內存中消失了。

我將上面的代碼放在循環中以增加左移值以進行分配,並使用-Xmx512m對其進行了-Xmx512m ,該-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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM