RandomAccessFile Утечка памяти - PullRequest
2 голосов
/ 25 ноября 2010

Я использую RandomAccessFile в Java. У меня проблема с утечкой памяти. Я упростил свой код до следующего:

public static void main(String[] args) throws IOException, InterruptedException
{
    RandomAccessFile r = new RandomAccessFile(new File("test.dat"), "rw");
    r.write(new byte[150000000], 0, 150000000);
    r.getFD().sync();
    r.close();
    r = null;

    while (true) { Thread.sleep(1000); }
}

После выполнения этого кода (и предоставления достаточного времени для GC) заявленное использование памяти приложением составляет чуть более 150 МБ.

Что я пропустил? Или ява виновата?

Ответы [ 3 ]

6 голосов
/ 25 ноября 2010

ГХ сделает доступной память только для использования в JVM.Память, освобожденная GC, не автоматически возвращается в ОС.JVM, как правило, очень неохотно возвращает память в ОС, так как скоро она может понадобиться снова, и получение памяти из ОС - это относительно дорогая операция.Вы можете использовать Visual VM .Если вы хотите, чтобы JVM быстрее возвращала память в ОС, вы можете использовать параметры настройки Oracle JVM , в частности -XX:MaxHeapFreeRatio и -XX:MinHeapFreeRatio

2 голосов
/ 25 ноября 2010

Как вы проверяете использование памяти? Использование, сообщаемое ОС, только указывает на то, что размер кучи Java увеличился. Вы не можете знать, пуста ли куча, заполнена ли она, но с объектами, подходящими для GC.

Вы должны использовать какой-либо инструмент, связанный с Java (например, VisualVM или jmap). Это даст вам лучшее представление о состоянии памяти кучи. С VisualVM вы можете активировать GC вручную, а затем проверить занятость кучи, чтобы определить, есть ли утечка памяти или нет.

1 голос
/ 25 ноября 2010

Память восстанавливается только при работе ГХ, а ГХ работает только тогда, когда это необходимо. Попробуйте вызвать System.gc (), если хотите уменьшить использование памяти.

Кстати: Java не гарантирует возвращение памяти в ОС, скорее, она увеличивает внутреннюю свободную память.

...