我试图弄清楚为什么我会收到 OOM 错误,即使我正在初始化的字节数组加上当前使用的内存小于最大堆大小(1000MB)。在数组初始化之前,我正在使用 373MB 和 117 个空闲空间。当我尝试初始化占用 371MB 的数组时,出现错误。奇怪的是,错误一直存在,直到我为 JVM 分配 1.2G 或更多。
373 + 371 是 744,我应该还有 256MB 的空闲空间,这让我发疯了。在第二种情况下,使用 920mb 和 117 空闲初始化 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