7014526: "java -version" crash on sparc with some values of HeapBaseMinAddress
Summary: Make default HeapBaseMinAddress the minimum that can be specified.
Reviewed-by: minqi, kvn, tschatzl, dholmes
--- a/hotspot/src/share/vm/runtime/arguments.cpp Tue Feb 18 09:54:24 2014 -0500
+++ b/hotspot/src/share/vm/runtime/arguments.cpp Wed Feb 19 02:58:13 2014 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2014, 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
@@ -1657,6 +1657,9 @@
return result;
}
+// Use static initialization to get the default before parsing
+static const uintx DefaultHeapBaseMinAddress = HeapBaseMinAddress;
+
void Arguments::set_heap_size() {
if (!FLAG_IS_DEFAULT(DefaultMaxRAMFraction)) {
// Deprecated flag
@@ -1688,6 +1691,23 @@
if (UseCompressedOops) {
// Limit the heap size to the maximum possible when using compressed oops
julong max_coop_heap = (julong)max_heap_for_compressed_oops();
+
+ // HeapBaseMinAddress can be greater than default but not less than.
+ if (!FLAG_IS_DEFAULT(HeapBaseMinAddress)) {
+ if (HeapBaseMinAddress < DefaultHeapBaseMinAddress) {
+ if (PrintMiscellaneous && Verbose) { // matches compressed oops printing flags
+ jio_fprintf(defaultStream::error_stream(),
+ "HeapBaseMinAddress must be at least " UINTX_FORMAT
+ " (" UINTX_FORMAT "G) which is greater than value given "
+ UINTX_FORMAT "\n",
+ DefaultHeapBaseMinAddress,
+ DefaultHeapBaseMinAddress/G,
+ HeapBaseMinAddress);
+ }
+ FLAG_SET_ERGO(uintx, HeapBaseMinAddress, DefaultHeapBaseMinAddress);
+ }
+ }
+
if (HeapBaseMinAddress + MaxHeapSize < max_coop_heap) {
// Heap should be above HeapBaseMinAddress to get zero based compressed oops
// but it should be not less than default MaxHeapSize.
--- a/hotspot/test/runtime/CompressedOops/CompressedClassPointers.java Tue Feb 18 09:54:24 2014 -0500
+++ b/hotspot/test/runtime/CompressedOops/CompressedClassPointers.java Wed Feb 19 02:58:13 2014 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2014, 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
@@ -80,6 +80,18 @@
output.shouldHaveExitValue(0);
}
+ public static void heapBaseMinAddressTest() throws Exception {
+ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
+ "-XX:HeapBaseMinAddress=1m",
+ "-XX:+PrintMiscellaneous",
+ "-XX:+Verbose",
+ "-version");
+ OutputAnalyzer output = new OutputAnalyzer(pb.start());
+ output.shouldContain("HeapBaseMinAddress must be at least");
+ output.shouldContain("HotSpot");
+ output.shouldHaveExitValue(0);
+ }
+
public static void sharingTest() throws Exception {
// Test small heaps
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
@@ -113,24 +125,25 @@
}
}
- public static void main(String[] args) throws Exception {
- if (!Platform.is64bit()) {
- // Can't test this on 32 bit, just pass
- System.out.println("Skipping test on 32bit");
- return;
- }
- // Solaris 10 can't mmap compressed oops space without a base
- if (Platform.isSolaris()) {
- String name = System.getProperty("os.version");
- if (name.equals("5.10")) {
- System.out.println("Skipping test on Solaris 10");
- return;
- }
- }
- smallHeapTest();
- smallHeapTestWith3G();
- largeHeapTest();
- largePagesTest();
- sharingTest();
- }
+ public static void main(String[] args) throws Exception {
+ if (!Platform.is64bit()) {
+ // Can't test this on 32 bit, just pass
+ System.out.println("Skipping test on 32bit");
+ return;
+ }
+ // Solaris 10 can't mmap compressed oops space without a base
+ if (Platform.isSolaris()) {
+ String name = System.getProperty("os.version");
+ if (name.equals("5.10")) {
+ System.out.println("Skipping test on Solaris 10");
+ return;
+ }
+ }
+ smallHeapTest();
+ smallHeapTestWith3G();
+ largeHeapTest();
+ largePagesTest();
+ heapBaseMinAddressTest();
+ sharingTest();
+ }
}