# HG changeset patch # User tamao # Date 1369071873 25200 # Node ID 10f759898d40050be1cc5fca0350bdd1053b11a1 # Parent 2138a2c14831c2999a6737c1ee5d8a0d91a649b8 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 diff -r 2138a2c14831 -r 10f759898d40 src/share/vm/gc_implementation/parallelScavenge/parMarkBitMap.cpp --- a/src/share/vm/gc_implementation/parallelScavenge/parMarkBitMap.cpp Sun May 19 20:31:30 2013 +0200 +++ b/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(); diff -r 2138a2c14831 -r 10f759898d40 src/share/vm/gc_implementation/parallelScavenge/parMarkBitMap.hpp --- a/src/share/vm/gc_implementation/parallelScavenge/parMarkBitMap.hpp Sun May 19 20:31:30 2013 +0200 +++ b/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) diff -r 2138a2c14831 -r 10f759898d40 src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp --- a/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp Sun May 19 20:31:30 2013 +0200 +++ b/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; } diff -r 2138a2c14831 -r 10f759898d40 src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.hpp --- a/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.hpp Sun May 19 20:31:30 2013 +0200 +++ b/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; };