Я написал довольно простой отчет для клиента в Java/JSF, который в основном возвращает строки из таблицы в базе данных mysql на основе некоторых простых критериев поиска (дата начала и окончания и т. Д.). Эта база данных содержит огромное количество строк, но в прошлом было ограничение, что возвращаются только строки определенного типа, и эти строки составляют около 1% от таблицы.Как обращаться с java.lang.OutOfMemoryError: верхний предел GC превышен изящно?
Недавно клиент попросил меня добавить к критериям поиска флажок, позволяющий им обойти ограничение на возвращаемые строки. Если вы установите этот флажок и оставьте широкий диапазон дат, можно попробовать получить массив ResultSet, после чего пользователь перенаправляется на страницу с ошибкой Glassfish с приятным сообщением: java.lang.OutOfMemoryError: верхний предел GC.
Каждый ответ на сообщения, которые я нашел о том, что касается этой ошибки, в основном говорит «Не поймайте ошибки памяти», и я понимаю, почему: вы не можете предсказать, где будет отображаться ошибка OOM, даже если вы знаете, где это происходит.
Я хотел бы знать, как обращаться с этим более изящно, чем с страницей с ошибкой Glassfish. В идеале я хотел бы просто вернуть пользователя на страницу поиска с сообщением о том, чтобы сузить критерии, если критерии были слишком широкими. Есть ли хороший способ сделать это до того, как я исчерпаю память? Или это лучшее решение, чтобы поставить произвольный лимит на результаты поиска (возможно, сначала запустите запрос с count(), и если он вернется больше, чем X, вернитесь на страницу поиска с сообщением об ошибке?)
Да, это не сделано по уважительной причине. Это указывает на реальную ошибку, а не только на исключение. Ваши параметры состоят в том, чтобы разбивать страницы на данные, получать результаты, не сохраняя их в памяти или увеличивая кучу. – jiggy
для получения результатов неограниченного размера, вы должны использовать их вместо них. например с помощью подхода на основе курсора и потоковой передачи вывода http – the8472