Недавно я наткнулся на это в какой-то код - в основном кто-то пытается создать большой объект, справляясь, когда там не хватает кучи, чтобы создать его:Java: достаточно свободной кучи для создания объекта?
try {
// try to perform an operation using a huge in-memory array
byte[] massiveArray = new byte[BIG_NUMBER];
}
catch (OutOfMemoryError oome) {
// perform the operation in some slower but less
// memory intensive way...
}
Это не кажется правильным, так как Sun сами рекомендуем вам не следует пытаться поймать Error
или его подклассы. Мы обсуждали это, и еще одна идея, которая пришла явным образом проверить для свободного кучи:
if (Runtime.getRuntime().freeMemory() > SOME_MEMORY) {
// quick memory-intensive approach
}
else {
// slower, less demanding approach
}
Опять же, это кажется неудовлетворительным - особенно в том, что выбирая значение для SOME_MEMORY
трудно легко относиться к работе в вопрос: для какой-нибудь произвольный большой объект, как я могу оценить, сколько памяти может потребоваться для его создания?
Есть ли лучший способ сделать это? Возможно ли это на Java или есть идея управлять памятью ниже уровня абстракции самого языка?
Edit 1: в первом примере, это может быть на самом деле представляется возможным оценить количество памяти byte[]
заданной длины может занимать, но есть более универсальный способ, который распространяется и на сколь угодно больших объектов?
Edit 2:, как @erickson указывает, есть способы, чтобы оценить размер объекта после его создания, но (не обращая внимания на статистический подход, основанный на предыдущих размеров объекта) есть способ сделать это для еще -установленные объекты?
Есть также некоторые споры относительно того, разумно ли поймать OutOfMemoryError
- кто-нибудь знает что-нибудь убедительное?
Вы столкнулись с проблемой реальной жизни на голове - фактическое исправление заключалось в том, чтобы переписать метод так, чтобы ему не потребовалось много памяти для начала. Вопрос был более академичным, но все же интересным ... – 2008-12-01 20:09:30
@jsight на тему «Почему существуют случаи, когда ..» Как насчет вас (и я не говорю, что это должно быть сделано в памяти), зашифровавшего файл файловой системы. Когда-то весь файл равен 1 мб, другие - 12 ГБ. ? Когда это произойдет, нет возможности выпускать достаточное количество ОЗУ! – OscarRyz 2008-12-01 21:05:08
@ Оскар: Я не думаю, что попытаюсь выяснить свободную память, чтобы определить, как бороться с этими двумя случаями.Я с большей вероятностью буду основывать свое решение на размере файла с размером блока, определяемым на основе памяти sys при запуске, а не телеметрией в реальном времени. – jsight 2008-12-01 22:58:59