我编写了以下测试来检查最大可用堆内存:
import java.util.*;
public class Memory {
public static void main(String[] args) {
long maxMB = Runtime.getRuntime().maxMemory() / 1048576L;
System.out.println("Maximum memory is " + maxMB + " MB.");
ArrayList<byte[]> allocated = new ArrayList<>();
try {
while (true)
allocated.add(new byte[1024*1024]);
} catch (OutOfMemoryError e) {
System.out.println("allocated " + allocated.size() + " MB before running out of memory.");
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当我对此进行测试时,似乎实际上只能分配一半的“可用”内存:
$ java -Xmx512m Memory
Maximum memory is 512 MB.
allocated 255 MB before running out of memory.
$ java -Xmx1024m Memory
Maximum memory is 1024 MB.
allocated 511 MB before running out of memory.
Run Code Online (Sandbox Code Playgroud)
有谁知道为什么会出现这种情况?
我相信内存管理器会尝试将块对齐到下一个可用的 1MB 边界。但由于 1MB 数组实际上占用略多于 1MB 的空间(用于存储长度和其他内容),因此它们之间的间隙几乎为 1MB。当将块大小减少 16 个字节时,它们突然再次耗尽整个内存。
| 归档时间: |
|
| 查看次数: |
547 次 |
| 最近记录: |