# HG changeset patch # User jwilhelm # Date 1367838226 -7200 # Node ID 30860066ae8ffd43933e65fb57af8f01a152f96c # Parent 625ddb0052e1bd995ac2e9bfcb239c16040ace0b# Parent f14063dcd52af9cb3ae2eb09bc26e43fd7adde9e Merge diff -r 625ddb0052e1 -r 30860066ae8f src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp --- a/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp Fri May 03 08:19:38 2013 -0700 +++ b/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp Mon May 06 13:03:46 2013 +0200 @@ -309,7 +309,8 @@ void G1CollectorPolicy::initialize_flags() { set_min_alignment(HeapRegion::GrainBytes); - set_max_alignment(GenRemSet::max_alignment_constraint(rem_set_name())); + size_t card_table_alignment = GenRemSet::max_alignment_constraint(rem_set_name()); + set_max_alignment(MAX2(card_table_alignment, min_alignment())); if (SurvivorRatio < 1) { vm_exit_during_initialization("Invalid survivor ratio specified"); } diff -r 625ddb0052e1 -r 30860066ae8f src/share/vm/memory/collectorPolicy.cpp --- a/src/share/vm/memory/collectorPolicy.cpp Fri May 03 08:19:38 2013 -0700 +++ b/src/share/vm/memory/collectorPolicy.cpp Mon May 06 13:03:46 2013 +0200 @@ -48,6 +48,13 @@ // CollectorPolicy methods. void CollectorPolicy::initialize_flags() { + assert(max_alignment() >= min_alignment(), + err_msg("max_alignment: " SIZE_FORMAT " less than min_alignment: " SIZE_FORMAT, + max_alignment(), min_alignment())); + assert(max_alignment() % min_alignment() == 0, + err_msg("max_alignment: " SIZE_FORMAT " not aligned by min_alignment: " SIZE_FORMAT, + max_alignment(), min_alignment())); + if (MetaspaceSize > MaxMetaspaceSize) { MaxMetaspaceSize = MetaspaceSize; } @@ -201,9 +208,6 @@ // All sizes must be multiples of the generation granularity. set_min_alignment((uintx) Generation::GenGrain); set_max_alignment(compute_max_alignment()); - assert(max_alignment() >= min_alignment() && - max_alignment() % min_alignment() == 0, - "invalid alignment constraints"); CollectorPolicy::initialize_flags(); diff -r 625ddb0052e1 -r 30860066ae8f src/share/vm/runtime/arguments.cpp --- a/src/share/vm/runtime/arguments.cpp Fri May 03 08:19:38 2013 -0700 +++ b/src/share/vm/runtime/arguments.cpp Mon May 06 13:03:46 2013 +0200 @@ -747,16 +747,16 @@ return; } - int index = *count; + int new_count = *count + 1; // expand the array and add arg to the last element - (*count)++; if (*bldarray == NULL) { - *bldarray = NEW_C_HEAP_ARRAY(char*, *count, mtInternal); + *bldarray = NEW_C_HEAP_ARRAY(char*, new_count, mtInternal); } else { - *bldarray = REALLOC_C_HEAP_ARRAY(char*, *bldarray, *count, mtInternal); + *bldarray = REALLOC_C_HEAP_ARRAY(char*, *bldarray, new_count, mtInternal); } - (*bldarray)[index] = strdup(arg); + (*bldarray)[*count] = strdup(arg); + *count = new_count; } void Arguments::build_jvm_args(const char* arg) { diff -r 625ddb0052e1 -r 30860066ae8f test/gc/g1/TestRegionAlignment.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/gc/g1/TestRegionAlignment.java Mon May 06 13:03:46 2013 +0200 @@ -0,0 +1,36 @@ +/* + * Copyright (c) 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test TestRegionAlignment.java + * @bug 8013791 + * @summary Make sure that G1 ergonomics pick a heap size that is aligned with the region size + * @run main/othervm -XX:+UseG1GC -XX:G1HeapRegionSize=32m -XX:MaxRAM=555m TestRegionAlignment + * + * When G1 ergonomically picks a maximum heap size it must be aligned to the region size. + * This test tries to get the VM to pick a small and unaligned heap size (by using MaxRAM=555) and a + * large region size (by using -XX:G1HeapRegionSize=32m). This will fail without the fix for 8013791. + */ +public class TestRegionAlignment { + public static void main(String[] args) { } +}