Ниже приведен сценарий, который мне нужно решить. Я нашел два решения.
Мне нужно поддерживать кеш данных, извлеченных из базы данных, для отображения в графическом интерфейсе Swing. Всякий раз, когда моя память JVM превышает 70% выделенной памяти, мне нужно предупредить пользователя о чрезмерном использовании. И как только использование памяти JVM превысит 80%, я должен остановить все запросы к базе данных и очистить существующий кеш, полученный как часть пользовательских операций, и уведомить пользователя. В процессе очистки я вручную удаляю некоторые данные на основе некоторых правил и инструктирую JVM для сборщика мусора. Всякий раз, когда происходит GC, если память очищается и достигает 60% выделенной памяти, мне нужно перезапустить всю обработку базы данных и вернуть контроль пользователю.
Для проверки статистики памяти JVM я нашел следующие два решения. Не мог решить, как лучше и почему.
Runtime.freeMemory () — поток, созданный для запуска каждые 10 секунд и проверки свободной памяти, и если память превышает указанные ограничения, необходимые всплывающие окна сообщат пользователю и вызовут методы для остановки операций и освобождения памяти.
MemoryPoolMXBean.getUsage() — в Java 5 появился JMX для получения моментального снимка памяти во время выполнения. В JMX я не могу использовать уведомление о пороге, поскольку оно будет уведомлять только тогда, когда память достигает/превышает заданный порог. Единственный способ использовать это опрос в MemoryMXBean и проверить статистику памяти за период.
В случае использования опроса мне кажется, что обе реализации будут одинаковыми.
Пожалуйста, предложите преимущества методов и есть ли другие альтернативы / какие-либо исправления в использовании методов.