7186737: Unable to allocate bit maps or card tables for parallel gc for the requested heap

Print helpful error message when VM aborts due to inability of allocating bit maps or card tables

Reviewed-by: jmasa, stefank
This commit is contained in:
Tao Mao 2013-05-20 10:44:33 -07:00 committed by Tao Mao
parent ed64a49836
commit 47c64fb0c3
4 changed files with 24 additions and 14 deletions

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -54,18 +54,18 @@ ParMarkBitMap::initialize(MemRegion covered_region)
const size_t raw_bytes = words * sizeof(idx_t);
const size_t page_sz = os::page_size_for_region(raw_bytes, raw_bytes, 10);
const size_t granularity = os::vm_allocation_granularity();
const size_t bytes = align_size_up(raw_bytes, MAX2(page_sz, granularity));
_reserved_byte_size = align_size_up(raw_bytes, MAX2(page_sz, granularity));
const size_t rs_align = page_sz == (size_t) os::vm_page_size() ? 0 :
MAX2(page_sz, granularity);
ReservedSpace rs(bytes, rs_align, rs_align > 0);
ReservedSpace rs(_reserved_byte_size, rs_align, rs_align > 0);
os::trace_page_sizes("par bitmap", raw_bytes, raw_bytes, page_sz,
rs.base(), rs.size());
MemTracker::record_virtual_memory_type((address)rs.base(), mtGC);
_virtual_space = new PSVirtualSpace(rs, page_sz);
if (_virtual_space != NULL && _virtual_space->expand_by(bytes)) {
if (_virtual_space != NULL && _virtual_space->expand_by(_reserved_byte_size)) {
_region_start = covered_region.start();
_region_size = covered_region.word_size();
idx_t* map = (idx_t*)_virtual_space->reserved_low_addr();

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -131,6 +131,8 @@ public:
inline size_t region_size() const;
inline size_t size() const;
size_t reserved_byte_size() const { return _reserved_byte_size; }
// Convert a heap address to/from a bit index.
inline idx_t addr_to_bit(HeapWord* addr) const;
inline HeapWord* bit_to_addr(idx_t bit) const;
@ -176,10 +178,11 @@ private:
BitMap _beg_bits;
BitMap _end_bits;
PSVirtualSpace* _virtual_space;
size_t _reserved_byte_size;
};
inline ParMarkBitMap::ParMarkBitMap():
_beg_bits(), _end_bits(), _region_start(NULL), _region_size(0), _virtual_space(NULL)
_beg_bits(), _end_bits(), _region_start(NULL), _region_size(0), _virtual_space(NULL), _reserved_byte_size(0)
{ }
inline void ParMarkBitMap::clear_range(idx_t beg, idx_t end)

View File

@ -356,6 +356,7 @@ ParallelCompactData::ParallelCompactData()
_region_start = 0;
_region_vspace = 0;
_reserved_byte_size = 0;
_region_data = 0;
_region_count = 0;
}
@ -382,11 +383,11 @@ ParallelCompactData::create_vspace(size_t count, size_t element_size)
const size_t raw_bytes = count * element_size;
const size_t page_sz = os::page_size_for_region(raw_bytes, raw_bytes, 10);
const size_t granularity = os::vm_allocation_granularity();
const size_t bytes = align_size_up(raw_bytes, MAX2(page_sz, granularity));
_reserved_byte_size = align_size_up(raw_bytes, MAX2(page_sz, granularity));
const size_t rs_align = page_sz == (size_t) os::vm_page_size() ? 0 :
MAX2(page_sz, granularity);
ReservedSpace rs(bytes, rs_align, rs_align > 0);
ReservedSpace rs(_reserved_byte_size, rs_align, rs_align > 0);
os::trace_page_sizes("par compact", raw_bytes, raw_bytes, page_sz, rs.base(),
rs.size());
@ -394,7 +395,7 @@ ParallelCompactData::create_vspace(size_t count, size_t element_size)
PSVirtualSpace* vspace = new PSVirtualSpace(rs, page_sz);
if (vspace != 0) {
if (vspace->expand_by(bytes)) {
if (vspace->expand_by(_reserved_byte_size)) {
return vspace;
}
delete vspace;
@ -840,14 +841,18 @@ bool PSParallelCompact::initialize() {
initialize_dead_wood_limiter();
if (!_mark_bitmap.initialize(mr)) {
vm_shutdown_during_initialization("Unable to allocate bit map for "
"parallel garbage collection for the requested heap size.");
vm_shutdown_during_initialization(
err_msg("Unable to allocate " SIZE_FORMAT "KB bitmaps for parallel "
"garbage collection for the requested " SIZE_FORMAT "KB heap.",
_mark_bitmap.reserved_byte_size()/K, mr.byte_size()/K));
return false;
}
if (!_summary_data.initialize(mr)) {
vm_shutdown_during_initialization("Unable to allocate tables for "
"parallel garbage collection for the requested heap size.");
vm_shutdown_during_initialization(
err_msg("Unable to allocate " SIZE_FORMAT "KB card tables for parallel "
"garbage collection for the requested " SIZE_FORMAT "KB heap.",
_summary_data.reserved_byte_size()/K, mr.byte_size()/K));
return false;
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -347,6 +347,7 @@ public:
bool initialize(MemRegion covered_region);
size_t region_count() const { return _region_count; }
size_t reserved_byte_size() const { return _reserved_byte_size; }
// Convert region indices to/from RegionData pointers.
inline RegionData* region(size_t region_idx) const;
@ -420,6 +421,7 @@ private:
#endif // #ifdef ASSERT
PSVirtualSpace* _region_vspace;
size_t _reserved_byte_size;
RegionData* _region_data;
size_t _region_count;
};