4

初期化中のバイト配列と現在使用されているメモリが最大ヒープ サイズ (1000MB) 未満であるにもかかわらず、OOM エラーが発生する理由を理解しようとしています。アレイが初期化される直前、私は 373MB を使用し、117 が空いています。371MB を占める配列を初期化しようとすると、エラーが発生します。奇妙なことは、JVM に 1.2G 以上を割り当てるまでエラーが続くことです。

373 + 371 は 744 ですが、まだ 256MB の空き容量があるはずです。2 番目のケースでは、117 フリーで 920mb を使用して、918mb 配列を初期化すると、少なくとも 2800mb が必要になります。

これはどういうわけか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
4

1 に答える 1

4
于 2013-10-01T14:11:05.570 に答える