Процесс Java с постоянным размером кучи выделяет все больше памяти в ОС - PullRequest
2 голосов
/ 24 мая 2019

У меня есть Java-приложение, которое, похоже, выделяет все больше и больше памяти из ОС (но размер кучи совсем не увеличивается!) Это приложение, связывающееся с ПЛК, поэтому ему требуется довольно много ЦП.

для тестирования porpuse Я написал эту программу, чтобы убедиться, что проблема не в какой-то библиотеке:

public static void main(String[] args) {
    Random rand= new Random();
    if (args[0].equals("auto")) {
        for(int i = 0; i< Integer.valueOf(args[2]);i++) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    List<byte[]> threaddata = new ArrayList<>();
                    while(true) {                               
                        byte[] arr = new byte[Integer.valueOf(args[3])];
                        rand.nextBytes(arr);
                        threaddata.add(arr);
                        Thread.sleep(Long.valueOf(args[1]));
                        threaddata.clear();
                        Thread.sleep(Long.valueOf(args[1]));                                
                    }
                }                   
            }).start();
        }
    }

Я запустил приложение, как это

java -XX:NativeMemoryTracking=detail -Xmx1G -XX:+UseG1GC -XX:G1PeriodicGCInterval=10000 -XX:G1HeapWastePercent=10 -jar gctest.jar auto 100 3 10000000

это означает, чтоприложение распределяет и выпускает 10 МБ каждые 100 мс в 3 потоках.

Теперь я наткнулся на Native Memory Tracking, который дает мне этот вывод для Internal

-                  Internal (reserved=367356KB, committed=367356KB)
                        (malloc=367324KB #3131147)
                        (mmap: reserved=32KB, committed=32KB)

При запуске требовалось около 15MBтеперь он нуждается почти 400MB

Я только что натолкнулся на эту документацию , но она мне совсем не помогает.Любая подсказка, как я мог препятствовать тому, чтобы java выделял все больше и больше памяти от ОС?

РЕДАКТИРОВАТЬ: Чем быстрее я выделяю и освобождаю память, тем быстрее растет память в ОС

1 Ответ

1 голос
/ 28 мая 2019

Я запустил ваш фрагмент.

Вот так это выглядит в VisualVM (JDK 11, стандартные настройки):

enter image description here

Я проверил использование ресурсов в диспетчере задач (Windows).Это константа.

Итак, я проверил на Linux.Пришлось установить htop и обновить JDK, но я не вижу здесь никакой разницы.Вот вывод htop после запуска программы в течение 5 минут.Значения VIRT и RES остаются прежними, общее потребление памяти остается одинаковым.

enter image description here

И вот через 5 минут.Res изменилось до 119M, но я не думаю, что о чем беспокоиться*

[root@Ukyo 130 /download]# while sleep 300; do jcmd 16920 VM.native_memory |grep Internal -A 3; done
               Internal (reserved=605KB, committed=605KB)
                        (malloc=565KB #1151)
                        (mmap: reserved=40KB, committed=40KB)

               Internal (reserved=605KB, committed=605KB)
                        (malloc=565KB #1151)
                        (mmap: reserved=40KB, committed=40KB)
...