Управление памятью Java: мониторинг памяти в стиле iOS? - PullRequest
1 голос
/ 22 февраля 2012

Мне очень любопытно, есть ли в Java какой-либо способ освободить память по мере необходимости - так же, как UIApplicationDidReceiveMemoryWarningNotification в iOS?

Например, у меня может быть массив, используемый в качестве структуры кэшированияв моей программе, и когда JVM испытывает нехватку памяти (пространство кучи истощается), я могу получить уведомление об освобождении некоторой памяти, принудительно установив GC и очистив кэш массива?

Прокомментируйте, если вы считаете, что вопросне понятно для вас ~

Ответы [ 4 ]

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

ГХ запускается автоматически при необходимости, поэтому вам не нужно уведомление об этом.

Для кешей, где вы хотите вручную удалять записи при нехватке памяти, вы можете использовать SoftReference s. Если вы храните только мягкую ссылку на запись в кэше, сборщик мусора автоматически удалит записи из кэша, если ему потребуется больше памяти.

Уже существует довольно много существующих реализаций кэша, которые обрабатывают это для вас (это не тривиально, чтобы понять это правильно), например, в библиотеке Guava (ср. CacheBuilder).

2 голосов
/ 22 февраля 2012

В Java вы должны просто позволить GC обрабатывать память для вас.

Если вы хотите, чтобы кэш очищался при нагрузке на память, то вы должны использовать кэш на основе Soft References (это вариант более общей категории Слабые ссылки ).Если на объект ссылаются только программные ссылки, GC очистит его до того, как ему не хватит памяти.

Простой способ создания мягких ссылочных кешей - использовать Guava с CacheBuilder .

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

Помимо уже упомянутой SoftReference, вы можете просто зарегистрировать уведомление, которое запускает, например, при использовании памяти около 95%:

MemoryMXBean mbean = ManagementFactory.getMemoryMXBean();
NotificationBroadcaster emitter = (NotificationBroadcaster) mbean;
emitter.addNotificationListener(new NotificationListener() {
  public void handleNotification(Notification notification, Object handback) {
    System.out.println("Low memory notification");
}
}, null, null);
for (MemoryPoolMXBean memPool : ManagementFactory.getMemoryPoolMXBeans()) {
  if (memPool.isUsageThresholdSupported()) {
    MemoryUsage memUsage = memPool.getUsage();
    memPool.setUsageThreshold((long) (memUsage.getMax() * 0.95));
  }
}
0 голосов
/ 22 февраля 2012

Java VM управляет памятью самостоятельно. Все, что вы можете сделать, это сделать нулевую ссылку на ваш объект кеша и вызвать System.gc()

Затем Java очистит пространство кучи. Насколько я знаю, больше ничего не поделаешь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...