2013-09-26 4 views
0

Я работаю над программой, которая загружает файлы и использует их информацию для заполнения класса Model. Эти файлы могут иметь размер от нескольких килобайт до почти ГБ. Когда их размеры колеблются, так же и память, используемая классом Model.Как предотвратить появление OutOfMemoryError от Java при загрузке файла?

Когда я загружаю файл, достаточно большой, я получаю OutOfMemoryError.

Я могу отклонить запрос пользователя на загрузку файла (в зависимости от размера файла). Как просмотреть файл, определить его размер и определить, может ли приложение обрабатывать его?

Есть ли способ сделать это адаптированным к объему ОЗУ на компьютере пользователя?

+0

Просто как будто. На основе 'RAM' вы можете разбить файл и загрузить его в память в куски и заполнить класс' model'. – Prateek

+0

Попробуйте посмотреть на этот вопрос: [Использование Java, чтобы получить информацию о системе уровень ОС] [1] [1]: http://stackoverflow.com/questions/25552/using-java-to- get-os-level-system-information – BobbyD17

+0

@Prateek Насколько мне нравится идея этого, я не думаю, что это файл, который перегружает кучу. Я думаю, что «Модель» становится слишком большой, поэтому ее разделение не будет иметь особого значения. – sdasdadas

ответ

2
You can query the JVM to see how much free and used memory there is : 

/* Total amount of free memory available to the JVM */ 
System.out.println("Free memory (bytes): " + 
Runtime.getRuntime().freeMemory()); 

/* This will return Long.MAX_VALUE if there is no preset limit */ 
long maxMemory = Runtime.getRuntime().maxMemory(); 
/* Maximum amount of memory the JVM will attempt to use */ 
System.out.println("Maximum memory (bytes): " + 
(maxMemory == Long.MAX_VALUE ? "no limit" : maxMemory)); 

/* Total memory currently in use by the JVM */ 
System.out.println("Total memory (bytes): " + 
Runtime.getRuntime().totalMemory()); 
+0

Спасибо, команда 'freeMemory()' - это то, что я ищу, и вы избиваете лидера с этим ударом. Я соглашусь, когда придет время. – sdasdadas

2

Используйте File.length(), чтобы определить размер файла и отклоните его, если он слишком большой.

Откуда вы знаете, если он слишком велик? Используйте Runtime.freeMemory(), чтобы узнать, сколько осталось кучи. Конечно, загрузка файла и заполнение его в ваш класс Model потребует дополнительной памяти, и вы можете не хранить весь контент файла. Вы должны оставить достаточно места для загрузки всех данных в классах на основе того, что вы знаете о том, как вы будете использовать данные.

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

+0

Да, но откуда я знаю, слишком ли он большой? Что может быть слишком большим для компьютера одного пользователя, отличается для другого компьютера пользователя. – sdasdadas

+0

Определите и установите верхний предел, который, как вы знаете, будет поддерживаться на старых компьютерах, поэтому вы никогда не исчерпаете память. Новые машины никогда не будут использовать всю память, но старые машины все еще могут использовать ваш сайт. –

Смежные вопросы