小编mad*_*lad的帖子

Java垃圾收集碎片整理

我在分配和释放字节数组时遇到OutOfMemoryError java堆异常,即使有足够的可用内存用于分配.下面有一个简短的日志.我知道从不同的JVM上运行,问题是由于内存碎片造成的,最大的空闲块只有大约6MB.我认为java(oracle)JVM应该处理碎片化的内存.

这是我的测试:

  • 使用params -Xms10M -Xmx10M设置java JVM
  • 我分配一个字节数组,比如说JVM内存的90%.
  • 将此字节数组设置为null,然后尝试重新分配90%JVM内存的字节数组.
  • 我们从日志中看到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)

java memory jvm

9
推荐指数
1
解决办法
2492
查看次数

标签 统计

java ×1

jvm ×1

memory ×1