Можно ли проверить текущее используемое пространство кучи во время выполнения? - PullRequest
2 голосов
/ 22 января 2012

Я пишу приложение, которое генерирует большой файл xlsx, используя apache-POI.В определенное время я получаю исключение OutOfHeapSpace.

Я хочу решить его, записав содержимое в файл xlsx, когда я определю, что скоро у меня не хватит места, и, таким образом, освободить память, а затем прочитатьфайл с диска и продолжение записи.

Лучшим решением может быть предопределение количества ячеек, которые я запишу в каждом «блоке», а затем запись блока на диск, но в любом случае этозаставил меня задуматься, есть ли способ определить пространство кучи, оставленное во время выполнения?

Ответы [ 4 ]

3 голосов
/ 22 января 2012

Освобождение неиспользуемой памяти во время выполнения, вероятно, не очень надежно, поскольку JVM обладает значительной свободой при выборе времени для сбора мусора.

POI недавно представил SXSSF API , который использует потоковую передачу и, таким образом, значительно сокращает объем памяти для написания электронных таблиц.Это должно помочь даже с очень большими файлами xsls.Есть несколько недостатков, которые показаны здесь .Но если вы можете жить с ними, это должно облегчить вам проблемы, связанные с кучей.

3 голосов
/ 22 января 2012

MemoryMXBean может предоставить вам достаточное количество информации о текущем использовании памяти.

public class PrintMemory {
    public static void main(String[] args) {
        MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean();
        long[] array;
        for (int i = 0; i < 100; i++) {
            array = new long[100000];
            System.out.printf("%d%n", memoryMXBean.getHeapMemoryUsage());
        }
    }
}
2 голосов
/ 22 января 2012

Вы можете получить доступную память, но она говорит вам только то, что вы можете выделить без запуска GC.

Вместо этого вы можете запустить GC и посмотреть, сколько памяти свободно после подопечных.Проблема в том, что у него есть издержки на выполнение.

Другой вариант - следить за очистками GC через JMX и смотреть, сколько свободно после того, как он естественным образом запускает GC (если он не запускается, вы неесть проблема)

1 голос
/ 22 января 2012

Стоит задуматься об использовании одного из новых компонентов JVM JMX MBeans.Как этот MemoryPoolMXBean

...