У меня есть 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 выделял все больше и больше памяти от ОС?
РЕДАКТИРОВАТЬ: Чем быстрее я выделяю и освобождаю память, тем быстрее растет память в ОС