Если я специально создаю приложение, которое обрабатывает данные при утечке памяти, я могу заметить, что память, о которой сообщают, скажем:
Runtime.getRuntime().freeMemory()
начинает колебаться от 1 до 2 МБсвободной памяти.
Затем приложение входит в цикл, который выглядит следующим образом: сборщик мусора, обработка некоторых данных, сборщик мусора и т. д., но поскольку сборщик мусора происходит так часто, приложение в основном больше ничего не делает.Даже GUI требует времени, чтобы ответить (и, нет, я не говорю о проблемах EDT здесь, это - действительно VM, в основном застрявшая в некотором бесконечном режиме GC'ing).
И мне было интересно: есть лиспособ программно определить, что JVM больше не имеет достаточно памяти?
Обратите внимание, что я не говорю об ошибках памяти или об обнаружении утечки памяти.
Я говорю об обнаружении того, что у приложения настолько мало памяти, что оно в основном все время вызывает GC, почти не оставляя времени для выполнения чего-либо еще (в моем гипотетическом примере: обработка данных).
Будет ли работать, например, многократно читать, сколько памяти доступно, скажем, в течение одной минуты, и видеть, что, если число «колеблется» между различными значениями все ниже, скажем, 4 МБ, сделать вывод, что произошла утечкаи что приложение стало непригодным для использования?