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: tamao <tao.mao@oracle.com>
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/parMarkBitMap.cpp Sun May 19 20:31:30 2013 +0200
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/parMarkBitMap.cpp Mon May 20 10:44:33 2013 -0700
@@ -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 @@
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();
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/parMarkBitMap.hpp Sun May 19 20:31:30 2013 +0200
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/parMarkBitMap.hpp Mon May 20 10:44:33 2013 -0700
@@ -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 @@
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 @@
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)
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp Sun May 19 20:31:30 2013 +0200
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp Mon May 20 10:44:33 2013 -0700
@@ -356,6 +356,7 @@
_region_start = 0;
_region_vspace = 0;
+ _reserved_byte_size = 0;
_region_data = 0;
_region_count = 0;
}
@@ -382,11 +383,11 @@
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 @@
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 @@
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;
}
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.hpp Sun May 19 20:31:30 2013 +0200
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.hpp Mon May 20 10:44:33 2013 -0700
@@ -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 @@
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 @@
#endif // #ifdef ASSERT
PSVirtualSpace* _region_vspace;
+ size_t _reserved_byte_size;
RegionData* _region_data;
size_t _region_count;
};