Java堆内存解析

本文深入探讨Java堆内存的管理,包括释放和占用标记的原理,以及内存如何进行有效分配。
堆内存标记
释放标记
/*
    堆中内存块空闲标记
    @beg  起始地址
    @end  结束地址
 */
void CodeHeap::mark_segmap_as_free(size_t beg, size_t end) {
  assert(0   <= beg && beg <  _number_of_committed_segments, "interval begin out of bounds");
  assert(beg <  end && end <= _number_of_committed_segments, "interval end   out of bounds");
  // 使用内存段@_segmap 指针,用于快速索引
  address p = (address)_segmap.low() + beg;
  address q = (address)_segmap.low() + end;
  // 初始化间隔,低位(起始地址)每次向上移动0xFF个空间大小
  while (p < q) *p++ = 0xFF;
}
占用标记
**
 * 将指定的堆内存标记为使用
 * @beg 内存块起始地址
 * @end 内存块结束地址
 */
void CodeHeap::mark_segmap_as_used(size_t beg, size_t end) {
  assert(0   <= beg && beg <  _number_of_committed_segments, "interval begin out of bounds");
  assert(beg <  end && end <= _number_of_committed_segments, "interval end   out of bounds");
  address p = (address)_segmap.low() + beg;
  address q = (address)_segmap.low() + end;
  int i = 0;
  while (p < q) {
    *p++ = i++;
    // 块状标记
    if (i == 0xFF) i = 1;
  }
}
内存分配
void* CodeHeap::allocate(size_t instance_size, bool is_critical) {
      size_t number_of_segments = size_to_segments(instance_size + sizeof(HeapBlock));
      assert(segments_to_size(number_of_segments) >= sizeof(FreeBlock), "not enough room for FreeList");

      // First check if we can satify request from freelist
      debug_only(verify());
      HeapBlock* block = search_freelist(number_of_segments, is_critical);
      debug_only(if (VerifyCodeCacheOften) verify());
      if (block != NULL) {
        assert(block->length() >= number_of_segments && block->length() < number_of_segments + CodeCacheMinBlockLength, "sanity check");
        assert(!block->free(), "must be marked free");
    #ifdef ASSERT
        memset((void *)block->allocated_space(), badCodeHeapNewVal, instance_size);
    #endif
        return block->allocated_space();
      }

      // Ensure minimum size for allocation to the heap.
      if (number_of_segments < CodeCacheMinBlockLength) {
        number_of_segments = CodeCacheMinBlockLength;
      }

      if (!is_critical) {
        // Make sure the allocation fits in the unallocated heap without using
        // the CodeCacheMimimumFreeSpace that is reserved for critical allocations.
        if (segments_to_size(number_of_segments) > (heap_unallocated_capacity() - CodeCacheMinimumFreeSpace)) {
          // Fail allocation
          return NULL;
        }
      }

      if (_next_segment + number_of_segments <= _number_of_committed_segments) {
        mark_segmap_as_used(_next_segment, _next_segment + number_of_segments);
        HeapBlock* b =  block_at(_next_segment);
        b->initialize(number_of_segments);
        _next_segment += number_of_segments;
    #ifdef ASSERT
        memset((void *)b->allocated_space(), badCodeHeapNewVal, instance_size);
    #endif
        return b->allocated_space();
      } else {
        return NULL;
      }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值