Оболочка Java JNA и потребление памяти - PullRequest
1 голос
/ 23 апреля 2019

У меня вопрос, как процессы JVM с оболочками JNA показывают потребление памяти.

Например, я запускаю приложение Java, которое использует оболочку OpenCV JNA. Само Java-приложение потребляет, например, 1 ГБ ОЗУ, а собственные библиотеки OpenCV - 3 ГБ. Итак, если я найду подходящий процесс Java JVM (с помощью команды ps), он покажет 1 ГБ ОЗУ или 4 ГБ (1 + 3) ОЗУ?

1 Ответ

2 голосов
/ 23 апреля 2019

Ваш вывод ps покажет 1 ГБ для RSS (размер резидентного набора - сколько памяти выделено этому процессу и находится в ОЗУ.) Процесс 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 ГБ собственной памяти явно исчезли из «доступной» памяти ОС.

Я поместил приведенный выше код в цикл, увеличивая значение сдвига влево для выделения, и запустил его, используя -Xmx512m, который должен иметьограниченная куча JVM до 512 МиБ.RSS, который включает в себя все стеки и память кучи JVM, остался в диапазоне ~ 50 МБ.Выделенная память отображается в VSZ, связанной с процессом.Поскольку это также включает в себя другие типы памяти, это не является прямой мерой и значительно превышает доступную оперативную память и ограничения размера файла подкачки, но, по крайней мере, дает некоторое представление об увеличении выделения.

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
...