我在分配和释放字节数组时遇到OutOfMemoryError java堆异常,即使有足够的可用内存用于分配.下面有一个简短的日志.我知道从不同的JVM上运行,问题是由于内存碎片造成的,最大的空闲块只有大约6MB.我认为java(oracle)JVM应该处理碎片化的内存.
这是我的测试:
这是我的详细信息:
Total Free Memory: 9881728
Attempting to Allocate Array of size: 6917209
Freeing Allocated Array of size: 6917209
Total Free Memory: 9881728
Attempting to Allocate Array of size: 6917209
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
Run Code Online (Sandbox Code Playgroud)
我正在运行的另一个JVM是Skelmir的CEE-J,我在低内存设备上运行,所以我无法设置MaxPermSize.有趣的是,java堆被拆分成不同的区域,这些区域可以在垃圾收集后改变大小吗?我已经运行了另外的测试我在哪里,首先为大约95%的内存创建一个字节数组,然后再次释放数组,然后我创建了一个包含散列图的对象数组,每个散列图都有一个条目,我清除了数组和映射,然后再次重新分配相同的数组.
我每次分配和释放时检查内存.这样做了10次之后,我最后一次释放内存,然后我检查内存,看到我有完整的JVM分配,然后我尝试再次分配95%的JVM分配并获得相同的JVM内存异常,即使它说我有足够的内存来分配?
public static void main(String[] args) throws InterruptedException {
Runtime s_runtime = Runtime.getRuntime ();
long used_memory = s_runtime.totalMemory () - s_runtime.freeMemory ();
long start_memory = used_memory;
long freeMemory = s_runtime.freeMemory();
Integer …Run Code Online (Sandbox Code Playgroud)