如何提高合并连续堆空间的性能

时间:2014-10-18 14:36:36

标签: java heap heap-memory

我写了一个堆管理器模拟器。我使用了两个列表来保存已分配和空闲块的地址和大小。 我发现以下函数大大降低了我的代码性能,因为我需要分配百万个对象... 这个函数的目的是在堆中找到连续的空闲块并合并它们,但问题是它中存在线性搜索,因此需要很长时间才能完成(超过1小时) 我怎样才能改进它?有什么想法吗?

public void updateFreeList(tuple freeElement)
{
  int i=0;
  if(freeList.size()> 1)
  {
    while(i<freeList.size())
    {
      try{
        if((freeList.get(i).getAddress()+freeList.get(i).getSize()) == (freeList.get(i+1).getAddress()))
        {
          freeList.get(i).setSize(freeList.get(i).getSize() + freeList.get(i+1).getSize());
          freeList.remove(i+1);
          continue;
        }
        i++;
      }
      catch (Exception e)
      {
       break;
      }
    }
  }
}

1 个答案:

答案 0 :(得分:0)

您可以使用以下观察:只有在刚刚释放其中一个块时才能合并两个块。这就是为什么不需要检查整个列表的原因:当您取消分配块并将其返回到空闲块列表时,您只需要检查上一个和下一个块。