Как мне предсказать, когда у меня закончится память - PullRequest
5 голосов
/ 01 марта 2011

У нас есть свинг-приложение, которое выполняет сложную обработку данных. Одной из предпосылок для нашего программного обеспечения является то, что в каждом столбце не может быть слишком много уникальных значений. Если число является числовым, пользователю необходимо будет дискретизировать данные, прежде чем они смогут использовать наш инструмент.

К сожалению, используемые нами алгоритмы комбинаторно дороги в памяти в зависимости от количества уникальных значений в столбце. Прямо сейчас с неправильным набором данных приложение очень быстро исчерпает память. Перед выполнением одной из этих операций, для которой не хватило бы памяти, мы должны примерно рассчитать, сколько памяти потребуется для этой операции. Было бы неплохо, если бы мы могли проверить, сколько памяти использует приложение в данный момент, оценить, не исчерпается ли у приложения память, и показать сообщение об ошибке, а не исчерпать память. Используя java.lang.Runtime, мы можем найти свободную память, общую память и максимальную память, но действительно ли это полезно? Даже если кажется, что у нас недостаточно места в куче, может случиться так, что если мы подождем 30 миллисекунд, сборщик мусора запустится, и вдруг у нас будет более чем достаточно места для запуска нашей операции. Есть ли способ действительно предсказать, если у нас не хватит памяти?

Ответы [ 3 ]

2 голосов
/ 01 марта 2011

Я сделал нечто подобное для приложения базы данных, где количество загруженных строк не может быть оценено.Поэтому в цикле, который обрабатывает набор результатов, я вызываю метод «MemorWatcher», который проверяет свободную память.

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

0 голосов
/ 01 марта 2011

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

Рассматривали ли вы использование Soft / WeakReferences и позволили сборщику мусора собирать объекты, которые вы могли бы пересчитать / восстановить на лету?

0 голосов
/ 01 марта 2011

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

...