提交 cd76209f 编写于 作者: T tamao

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

Summary: Print helpful error message when VM aborts due to inability of allocating bit maps or card tables
Reviewed-by: jmasa, stefank
Contributed-by: Ntamao <tao.mao@oracle.com>
上级 9be073da
/* /*
* 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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -54,18 +54,18 @@ ParMarkBitMap::initialize(MemRegion covered_region) ...@@ -54,18 +54,18 @@ ParMarkBitMap::initialize(MemRegion covered_region)
const size_t raw_bytes = words * sizeof(idx_t); 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 page_sz = os::page_size_for_region(raw_bytes, raw_bytes, 10);
const size_t granularity = os::vm_allocation_granularity(); 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 : const size_t rs_align = page_sz == (size_t) os::vm_page_size() ? 0 :
MAX2(page_sz, granularity); 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, os::trace_page_sizes("par bitmap", raw_bytes, raw_bytes, page_sz,
rs.base(), rs.size()); rs.base(), rs.size());
MemTracker::record_virtual_memory_type((address)rs.base(), mtGC); MemTracker::record_virtual_memory_type((address)rs.base(), mtGC);
_virtual_space = new PSVirtualSpace(rs, page_sz); _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_start = covered_region.start();
_region_size = covered_region.word_size(); _region_size = covered_region.word_size();
idx_t* map = (idx_t*)_virtual_space->reserved_low_addr(); idx_t* map = (idx_t*)_virtual_space->reserved_low_addr();
......
/* /*
* 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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -131,6 +131,8 @@ public: ...@@ -131,6 +131,8 @@ public:
inline size_t region_size() const; inline size_t region_size() const;
inline size_t 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. // Convert a heap address to/from a bit index.
inline idx_t addr_to_bit(HeapWord* addr) const; inline idx_t addr_to_bit(HeapWord* addr) const;
inline HeapWord* bit_to_addr(idx_t bit) const; inline HeapWord* bit_to_addr(idx_t bit) const;
...@@ -176,10 +178,11 @@ private: ...@@ -176,10 +178,11 @@ private:
BitMap _beg_bits; BitMap _beg_bits;
BitMap _end_bits; BitMap _end_bits;
PSVirtualSpace* _virtual_space; PSVirtualSpace* _virtual_space;
size_t _reserved_byte_size;
}; };
inline ParMarkBitMap::ParMarkBitMap(): 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) inline void ParMarkBitMap::clear_range(idx_t beg, idx_t end)
......
...@@ -356,6 +356,7 @@ ParallelCompactData::ParallelCompactData() ...@@ -356,6 +356,7 @@ ParallelCompactData::ParallelCompactData()
_region_start = 0; _region_start = 0;
_region_vspace = 0; _region_vspace = 0;
_reserved_byte_size = 0;
_region_data = 0; _region_data = 0;
_region_count = 0; _region_count = 0;
} }
...@@ -382,11 +383,11 @@ ParallelCompactData::create_vspace(size_t count, size_t element_size) ...@@ -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 raw_bytes = count * element_size;
const size_t page_sz = os::page_size_for_region(raw_bytes, raw_bytes, 10); 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 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 : const size_t rs_align = page_sz == (size_t) os::vm_page_size() ? 0 :
MAX2(page_sz, granularity); 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(), os::trace_page_sizes("par compact", raw_bytes, raw_bytes, page_sz, rs.base(),
rs.size()); rs.size());
...@@ -394,7 +395,7 @@ ParallelCompactData::create_vspace(size_t count, size_t element_size) ...@@ -394,7 +395,7 @@ ParallelCompactData::create_vspace(size_t count, size_t element_size)
PSVirtualSpace* vspace = new PSVirtualSpace(rs, page_sz); PSVirtualSpace* vspace = new PSVirtualSpace(rs, page_sz);
if (vspace != 0) { if (vspace != 0) {
if (vspace->expand_by(bytes)) { if (vspace->expand_by(_reserved_byte_size)) {
return vspace; return vspace;
} }
delete vspace; delete vspace;
...@@ -840,14 +841,18 @@ bool PSParallelCompact::initialize() { ...@@ -840,14 +841,18 @@ bool PSParallelCompact::initialize() {
initialize_dead_wood_limiter(); initialize_dead_wood_limiter();
if (!_mark_bitmap.initialize(mr)) { if (!_mark_bitmap.initialize(mr)) {
vm_shutdown_during_initialization("Unable to allocate bit map for " vm_shutdown_during_initialization(
"parallel garbage collection for the requested heap size."); 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; return false;
} }
if (!_summary_data.initialize(mr)) { if (!_summary_data.initialize(mr)) {
vm_shutdown_during_initialization("Unable to allocate tables for " vm_shutdown_during_initialization(
"parallel garbage collection for the requested heap size."); 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; return false;
} }
......
/* /*
* 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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -347,6 +347,7 @@ public: ...@@ -347,6 +347,7 @@ public:
bool initialize(MemRegion covered_region); bool initialize(MemRegion covered_region);
size_t region_count() const { return _region_count; } 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. // Convert region indices to/from RegionData pointers.
inline RegionData* region(size_t region_idx) const; inline RegionData* region(size_t region_idx) const;
...@@ -420,6 +421,7 @@ private: ...@@ -420,6 +421,7 @@ private:
#endif // #ifdef ASSERT #endif // #ifdef ASSERT
PSVirtualSpace* _region_vspace; PSVirtualSpace* _region_vspace;
size_t _reserved_byte_size;
RegionData* _region_data; RegionData* _region_data;
size_t _region_count; size_t _region_count;
}; };
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册