Я пытаюсь понять, почему я получаю ошибку OOM, даже если байт-массив, который я инициализирую, плюс используемая в данный момент память меньше, чем максимальный размер кучи (1000 МБ) , Перед инициализацией массива я использую 373 МБ с 117 бесплатными. Когда я пытаюсь инициализировать массив, который занимает 371 МБ, я получаю сообщение об ошибке. Странная вещь заключается в том, что ошибка сохраняется до тех пор, пока я не выделяю 1.2G или более для JVM.Java OutOfMemoryError при распределении байта [] в пределах максимальной кучи
373 + 371 - 744, у меня все еще должно быть 256 МБ бесплатно, это приводит меня в бешенство. Во втором случае с использованием 920mb с 117 бесплатной инициализацией массив 918mb занимает не менее 2800 МБ.
Это как-то часть функции java? Если это так, обходной путь так, что что-то простое, как операция копирования массива, может быть выполнено менее чем в 3n памяти? (номер память имеет от выполнения и максимального размер кучи устанавливается с -Xmx)
test.java:
byte iv[];
iv =new byte[32];
byte key[] = new byte[32];
new SecureRandom().nextBytes(iv);
new SecureRandom().nextBytes(key);
plaintext = FileUtils.readFileToByteArray(new File("sampleFile"));
EncryptionResult out = ExperimentalCrypto.doSHE(plaintext, key, iv);
ExperimentalCrypto.java:
public static byte[] ExperimentalCrypto(byte[] input ,byte[] key, byte[]iv){
if(input.length%32 != 0){
int length = input.length;
byte[] temp = null;
System.out.println((input.length/32+1)*32/(1024*1024));
temp=new byte[(input.length/32+1)*32]; // encounter error here
Вы пытались использовать профилировщик, чтобы узнать, что использует память. –
Как вы упомянули, 117 МБ были бесплатными, и если вы настроите массив из 371 МБ, он даст ошибку. вам нужно проанализировать, почему он показывал 117 бесплатно. Хотя ваш XMX составляет 1 ГБ, он может использоваться в другом месте в вашей программе. Используйте профилировщик, чтобы узнать, куда идет ваша память. –
Одной из возможных причин является фрагментация кучи. См. Также: http://stackoverflow.com/questions/9286934/java-crashing-before-filling-up-heap-space – assylias