595 lines
27 KiB
Diff
595 lines
27 KiB
Diff
|
|
From bf7e5b40eab65acf8988a30c1530654db1f8cf07 Mon Sep 17 00:00:00 2001
|
||
|
|
From: eapen <zhangyipeng7@huawei.com>
|
||
|
|
Date: Fri, 30 Sep 2022 17:18:50 +0800
|
||
|
|
Subject: [PATCH 27/33] I68TO2: 8232069: enable shutdown UseCompressedClassPointers &&
|
||
|
|
UseCompressedOops when CDS
|
||
|
|
---
|
||
|
|
common/bin/compare.sh | 2 +-
|
||
|
|
hotspot/src/share/vm/memory/filemap.cpp | 12 ++
|
||
|
|
hotspot/src/share/vm/memory/filemap.hpp | 4 +
|
||
|
|
hotspot/src/share/vm/memory/metaspace.cpp | 42 +++--
|
||
|
|
hotspot/src/share/vm/runtime/arguments.cpp | 47 ++---
|
||
|
|
hotspot/src/share/vm/runtime/arguments.hpp | 2 +-
|
||
|
|
.../CDSCompressedKPtrsError.java | 93 ----------
|
||
|
|
.../appcds/CommandLineFlagComboNegative.java | 5 +-
|
||
|
|
.../appcds/TestCombinedCompressedFlags.java | 192 +++++++++++++++++++++
|
||
|
|
jdk/make/BuildJdk.gmk | 2 +
|
||
|
|
10 files changed, 253 insertions(+), 148 deletions(-)
|
||
|
|
delete mode 100644 hotspot/test/runtime/CDSCompressedKPtrs/CDSCompressedKPtrsError.java
|
||
|
|
create mode 100644 hotspot/test/runtime/appcds/TestCombinedCompressedFlags.java
|
||
|
|
|
||
|
|
diff --git a/common/bin/compare.sh b/common/bin/compare.sh
|
||
|
|
index a36464a..e6a3f67 100644
|
||
|
|
--- a/common/bin/compare.sh
|
||
|
|
+++ b/common/bin/compare.sh
|
||
|
|
@@ -290,7 +290,7 @@ compare_general_files() {
|
||
|
|
! -name "ct.sym" ! -name "*.diz" ! -name "*.dll" \
|
||
|
|
! -name "*.pdb" ! -name "*.exp" ! -name "*.ilk" \
|
||
|
|
! -name "*.lib" ! -name "*.war" ! -name "JavaControlPanel" \
|
||
|
|
- ! -name "classes.jsa" \
|
||
|
|
+ ! -name "classes.jsa" | -name "classes_nocoops.jsa" \
|
||
|
|
| $GREP -v "./bin/" | $SORT | $FILTER)
|
||
|
|
|
||
|
|
echo General files...
|
||
|
|
diff --git a/hotspot/src/share/vm/memory/filemap.cpp b/hotspot/src/share/vm/memory/filemap.cpp
|
||
|
|
index 0682cd6..0d21707 100644
|
||
|
|
--- a/hotspot/src/share/vm/memory/filemap.cpp
|
||
|
|
+++ b/hotspot/src/share/vm/memory/filemap.cpp
|
||
|
|
@@ -241,6 +241,8 @@ void FileMapInfo::FileMapHeader::populate(FileMapInfo* mapinfo, size_t alignment
|
||
|
|
_alignment = alignment;
|
||
|
|
_obj_alignment = ObjectAlignmentInBytes;
|
||
|
|
|
||
|
|
+ _compressed_oops = UseCompressedOops;
|
||
|
|
+ _compressed_class_ptrs = UseCompressedClassPointers;
|
||
|
|
if (!DynamicDumpSharedSpaces) {
|
||
|
|
_classpath_entry_table_size = mapinfo->_classpath_entry_table_size;
|
||
|
|
_classpath_entry_table = mapinfo->_classpath_entry_table;
|
||
|
|
@@ -987,6 +989,16 @@ bool FileMapInfo::FileMapHeader::validate() {
|
||
|
|
_obj_alignment, ObjectAlignmentInBytes);
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
+ if (PrintSharedSpaces) {
|
||
|
|
+ tty->print_cr("Archive was created with UseCompressedOops = %d, UseCompressedClassPointers = %d",
|
||
|
|
+ compressed_oops(), compressed_class_pointers());
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
+ if (compressed_oops() != UseCompressedOops || compressed_class_pointers() != UseCompressedClassPointers) {
|
||
|
|
+ FileMapInfo::fail_continue("Unable to use shared archive.\nThe saved state of UseCompressedOops and UseCompressedClassPointers is "
|
||
|
|
+ "different from runtime, CDS will be disabled.");
|
||
|
|
+ return false;
|
||
|
|
+ }
|
||
|
|
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
diff --git a/hotspot/src/share/vm/memory/filemap.hpp b/hotspot/src/share/vm/memory/filemap.hpp
|
||
|
|
index 27fff35..debfb50 100644
|
||
|
|
--- a/hotspot/src/share/vm/memory/filemap.hpp
|
||
|
|
+++ b/hotspot/src/share/vm/memory/filemap.hpp
|
||
|
|
@@ -105,6 +105,8 @@ public:
|
||
|
|
size_t _alignment; // how shared archive should be aligned
|
||
|
|
int _obj_alignment; // value of ObjectAlignmentInBytes
|
||
|
|
bool _is_default_jsa; // indicates whether is the default jsa file
|
||
|
|
+ bool _compressed_oops; // save the flag UseCompressedOops
|
||
|
|
+ bool _compressed_class_ptrs; // save the flag UseCompressedClassPointers
|
||
|
|
|
||
|
|
struct space_info {
|
||
|
|
int _crc; // crc checksum of the current space
|
||
|
|
@@ -156,6 +158,8 @@ public:
|
||
|
|
int compute_crc();
|
||
|
|
unsigned int magic() const { return _magic; }
|
||
|
|
const char* jvm_ident() const { return _jvm_ident; }
|
||
|
|
+ bool compressed_oops() const { return _compressed_oops; }
|
||
|
|
+ bool compressed_class_pointers() const { return _compressed_class_ptrs; }
|
||
|
|
};
|
||
|
|
|
||
|
|
// Fixme
|
||
|
|
diff --git a/hotspot/src/share/vm/memory/metaspace.cpp b/hotspot/src/share/vm/memory/metaspace.cpp
|
||
|
|
index cf4a112..07bc47a 100644
|
||
|
|
--- a/hotspot/src/share/vm/memory/metaspace.cpp
|
||
|
|
+++ b/hotspot/src/share/vm/memory/metaspace.cpp
|
||
|
|
@@ -3634,25 +3634,33 @@ void Metaspace::global_initialize() {
|
||
|
|
}
|
||
|
|
|
||
|
|
#ifdef _LP64
|
||
|
|
- if (cds_total + compressed_class_space_size() > UnscaledClassSpaceMax) {
|
||
|
|
- vm_exit_during_initialization("Unable to dump shared archive.",
|
||
|
|
- err_msg("Size of archive (" SIZE_FORMAT ") + compressed class space ("
|
||
|
|
- SIZE_FORMAT ") == total (" SIZE_FORMAT ") is larger than compressed "
|
||
|
|
- "klass limit: " SIZE_FORMAT, cds_total, compressed_class_space_size(),
|
||
|
|
- cds_total + compressed_class_space_size(), UnscaledClassSpaceMax));
|
||
|
|
- }
|
||
|
|
+ if (UseCompressedClassPointers) {
|
||
|
|
+ if (cds_total + compressed_class_space_size() > UnscaledClassSpaceMax) {
|
||
|
|
+ vm_exit_during_initialization("Unable to dump shared archive.",
|
||
|
|
+ err_msg("Size of archive (" SIZE_FORMAT ") + compressed class space ("
|
||
|
|
+ SIZE_FORMAT ") == total (" SIZE_FORMAT ") is larger than compressed "
|
||
|
|
+ "klass limit: " SIZE_FORMAT, cds_total, compressed_class_space_size(),
|
||
|
|
+ cds_total + compressed_class_space_size(), UnscaledClassSpaceMax));
|
||
|
|
+ }
|
||
|
|
|
||
|
|
- // Set the compressed klass pointer base so that decoding of these pointers works
|
||
|
|
- // properly when creating the shared archive.
|
||
|
|
- assert(UseCompressedOops && UseCompressedClassPointers,
|
||
|
|
- "UseCompressedOops and UseCompressedClassPointers must be set");
|
||
|
|
- Universe::set_narrow_klass_base((address)_space_list->current_virtual_space()->bottom());
|
||
|
|
- if (TraceMetavirtualspaceAllocation && Verbose) {
|
||
|
|
- gclog_or_tty->print_cr("Setting_narrow_klass_base to Address: " PTR_FORMAT,
|
||
|
|
- _space_list->current_virtual_space()->bottom());
|
||
|
|
- }
|
||
|
|
+ // Set the compressed klass pointer base so that decoding of these pointers works
|
||
|
|
+ // properly when creating the shared archive.
|
||
|
|
+ assert(UseCompressedOops && UseCompressedClassPointers,
|
||
|
|
+ "UseCompressedOops and UseCompressedClassPointers must be set");
|
||
|
|
+ Universe::set_narrow_klass_base((address)_space_list->current_virtual_space()->bottom());
|
||
|
|
+ if (TraceMetavirtualspaceAllocation && Verbose) {
|
||
|
|
+ gclog_or_tty->print_cr("Setting_narrow_klass_base to Address: " PTR_FORMAT,
|
||
|
|
+ _space_list->current_virtual_space()->bottom());
|
||
|
|
+ }
|
||
|
|
|
||
|
|
- Universe::set_narrow_klass_shift(0);
|
||
|
|
+ Universe::set_narrow_klass_shift(0);
|
||
|
|
+ } else {
|
||
|
|
+ if (cds_total > UnscaledClassSpaceMax) {
|
||
|
|
+ vm_exit_during_initialization("Unable to dump shared archive.",
|
||
|
|
+ err_msg("Size of archive (" SIZE_FORMAT ") is larger than compressed "
|
||
|
|
+ "klass limit: " SIZE_FORMAT, cds_total, UnscaledClassSpaceMax));
|
||
|
|
+ }
|
||
|
|
+ }
|
||
|
|
#endif // _LP64
|
||
|
|
#endif // INCLUDE_CDS
|
||
|
|
} else {
|
||
|
|
diff --git a/hotspot/src/share/vm/runtime/arguments.cpp b/hotspot/src/share/vm/runtime/arguments.cpp
|
||
|
|
index fba3d4b..b0b5414 100644
|
||
|
|
--- a/hotspot/src/share/vm/runtime/arguments.cpp
|
||
|
|
+++ b/hotspot/src/share/vm/runtime/arguments.cpp
|
||
|
|
@@ -242,7 +242,9 @@ bool Arguments::init_shared_archive_paths() {
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
- if (SharedArchiveFile != NULL) {
|
||
|
|
+ if (SharedArchiveFile == NULL) {
|
||
|
|
+ SharedArchivePath = get_default_shared_archive_path();
|
||
|
|
+ } else {
|
||
|
|
int archives = num_archives(SharedArchiveFile);
|
||
|
|
if (is_dumping_archive()) {
|
||
|
|
if (archives > 1) {
|
||
|
|
@@ -4008,7 +4010,7 @@ jint Arguments::parse_options_environment_variable(const char* name, SysClassPat
|
||
|
|
return JNI_OK;
|
||
|
|
}
|
||
|
|
|
||
|
|
-void Arguments::set_shared_spaces_flags() {
|
||
|
|
+jint Arguments::set_shared_spaces_flags() {
|
||
|
|
if (DumpSharedSpaces) {
|
||
|
|
if (FailOverToOldVerifier) {
|
||
|
|
// Don't fall back to the old verifier on verification failure. If a
|
||
|
|
@@ -4022,22 +4024,16 @@ void Arguments::set_shared_spaces_flags() {
|
||
|
|
warning("cannot dump shared archive while using shared archive");
|
||
|
|
}
|
||
|
|
UseSharedSpaces = false;
|
||
|
|
-#ifdef _LP64
|
||
|
|
- if (!UseCompressedOops || !UseCompressedClassPointers) {
|
||
|
|
- vm_exit_during_initialization(
|
||
|
|
- "Cannot dump shared archive when UseCompressedOops or UseCompressedClassPointers is off.", NULL);
|
||
|
|
- }
|
||
|
|
- } else {
|
||
|
|
- if (!UseCompressedOops || !UseCompressedClassPointers) {
|
||
|
|
- no_shared_spaces("UseCompressedOops and UseCompressedClassPointers must be on for UseSharedSpaces.");
|
||
|
|
- }
|
||
|
|
-#endif
|
||
|
|
}
|
||
|
|
|
||
|
|
#if INCLUDE_CDS
|
||
|
|
// Initialize shared archive paths which could include both base and dynamic archive paths
|
||
|
|
- init_shared_archive_paths();
|
||
|
|
+ // This must be after set_ergonomics_flags() called so flag UseCompressedOops is set properly.
|
||
|
|
+ if(!init_shared_archive_paths()) {
|
||
|
|
+ return JNI_ENOMEM;
|
||
|
|
+ }
|
||
|
|
#endif // INCLUDE_CDS
|
||
|
|
+ return JNI_OK;
|
||
|
|
}
|
||
|
|
|
||
|
|
#if !INCLUDE_ALL_GCS
|
||
|
|
@@ -4065,25 +4061,14 @@ char* Arguments::get_default_shared_archive_path() {
|
||
|
|
const size_t len = jvm_path_len + file_sep_len + 20;
|
||
|
|
default_archive_path = NEW_C_HEAP_ARRAY(char, len, mtInternal);
|
||
|
|
if (default_archive_path != NULL) {
|
||
|
|
- jio_snprintf(default_archive_path, len, "%s%sclasses.jsa",
|
||
|
|
+ jio_snprintf(default_archive_path, len,
|
||
|
|
+ UseCompressedClassPointers ? "%s%sclasses.jsa" : "%s%sclasses_nocoops.jsa",
|
||
|
|
jvm_path, os::file_separator());
|
||
|
|
}
|
||
|
|
Arguments::set_is_default_jsa(true);
|
||
|
|
return default_archive_path;
|
||
|
|
}
|
||
|
|
|
||
|
|
-// Sharing support
|
||
|
|
-// Construct the path to the archive
|
||
|
|
-static char* get_shared_archive_path() {
|
||
|
|
- char *shared_archive_path;
|
||
|
|
- if (SharedArchiveFile == NULL) {
|
||
|
|
- shared_archive_path = Arguments::get_default_shared_archive_path();
|
||
|
|
- } else {
|
||
|
|
- shared_archive_path = os::strdup(SharedArchiveFile, mtInternal);
|
||
|
|
- }
|
||
|
|
- return shared_archive_path;
|
||
|
|
-}
|
||
|
|
-
|
||
|
|
|
||
|
|
#ifndef PRODUCT
|
||
|
|
// Determine whether LogVMOutput should be implicitly turned on.
|
||
|
|
@@ -4221,13 +4206,6 @@ jint Arguments::parse(const JavaVMInitArgs* args) {
|
||
|
|
return result;
|
||
|
|
}
|
||
|
|
|
||
|
|
- // Call get_shared_archive_path() here, after possible SharedArchiveFile option got parsed.
|
||
|
|
- SharedArchivePath = get_shared_archive_path();
|
||
|
|
- if (SharedArchivePath == NULL) {
|
||
|
|
- return JNI_ENOMEM;
|
||
|
|
- }
|
||
|
|
-
|
||
|
|
-
|
||
|
|
// Set up VerifySharedSpaces
|
||
|
|
if (FLAG_IS_DEFAULT(VerifySharedSpaces) && SharedArchiveFile != NULL) {
|
||
|
|
VerifySharedSpaces = true;
|
||
|
|
@@ -4321,7 +4299,8 @@ jint Arguments::apply_ergo() {
|
||
|
|
// Set flags based on ergonomics.
|
||
|
|
set_ergonomics_flags();
|
||
|
|
|
||
|
|
- set_shared_spaces_flags();
|
||
|
|
+ jint result = set_shared_spaces_flags();
|
||
|
|
+ if (result != JNI_OK) return result;
|
||
|
|
|
||
|
|
#if defined(SPARC)
|
||
|
|
// BIS instructions require 'membar' instruction regardless of the number
|
||
|
|
diff --git a/hotspot/src/share/vm/runtime/arguments.hpp b/hotspot/src/share/vm/runtime/arguments.hpp
|
||
|
|
index 65907eb..88741e8 100644
|
||
|
|
--- a/hotspot/src/share/vm/runtime/arguments.hpp
|
||
|
|
+++ b/hotspot/src/share/vm/runtime/arguments.hpp
|
||
|
|
@@ -343,7 +343,7 @@ class Arguments : AllStatic {
|
||
|
|
static void set_use_compressed_klass_ptrs();
|
||
|
|
static void select_gc();
|
||
|
|
static void set_ergonomics_flags();
|
||
|
|
- static void set_shared_spaces_flags();
|
||
|
|
+ static jint set_shared_spaces_flags();
|
||
|
|
// limits the given memory size by the maximum amount of memory this process is
|
||
|
|
// currently allowed to allocate or reserve.
|
||
|
|
static julong limit_by_allocatable_memory(julong size);
|
||
|
|
diff --git a/hotspot/test/runtime/CDSCompressedKPtrs/CDSCompressedKPtrsError.java b/hotspot/test/runtime/CDSCompressedKPtrs/CDSCompressedKPtrsError.java
|
||
|
|
deleted file mode 100644
|
||
|
|
index 05b4ac9..0000000
|
||
|
|
--- a/hotspot/test/runtime/CDSCompressedKPtrs/CDSCompressedKPtrsError.java
|
||
|
|
+++ /dev/null
|
||
|
|
@@ -1,93 +0,0 @@
|
||
|
|
-/*
|
||
|
|
- * 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
|
||
|
|
- * @bug 8003424
|
||
|
|
- * @summary Test that cannot use CDS if UseCompressedClassPointers is turned off.
|
||
|
|
- * @library /testlibrary
|
||
|
|
- * @run main CDSCompressedKPtrsError
|
||
|
|
- */
|
||
|
|
-
|
||
|
|
-import com.oracle.java.testlibrary.*;
|
||
|
|
-
|
||
|
|
-public class CDSCompressedKPtrsError {
|
||
|
|
- public static void main(String[] args) throws Exception {
|
||
|
|
- ProcessBuilder pb;
|
||
|
|
- if (Platform.is64bit()) {
|
||
|
|
- pb = ProcessTools.createJavaProcessBuilder(
|
||
|
|
- "-XX:+UseCompressedOops", "-XX:+UseCompressedClassPointers", "-XX:+UnlockDiagnosticVMOptions",
|
||
|
|
- "-XX:SharedArchiveFile=./sample.jsa", "-Xshare:dump");
|
||
|
|
- OutputAnalyzer output = new OutputAnalyzer(pb.start());
|
||
|
|
- try {
|
||
|
|
- output.shouldContain("Loading classes to share");
|
||
|
|
- output.shouldHaveExitValue(0);
|
||
|
|
-
|
||
|
|
- pb = ProcessTools.createJavaProcessBuilder(
|
||
|
|
- "-XX:-UseCompressedClassPointers", "-XX:-UseCompressedOops",
|
||
|
|
- "-XX:+UnlockDiagnosticVMOptions", "-XX:SharedArchiveFile=./sample.jsa", "-Xshare:on", "-version");
|
||
|
|
- output = new OutputAnalyzer(pb.start());
|
||
|
|
- output.shouldContain("Unable to use shared archive");
|
||
|
|
- output.shouldHaveExitValue(0);
|
||
|
|
-
|
||
|
|
- pb = ProcessTools.createJavaProcessBuilder(
|
||
|
|
- "-XX:-UseCompressedClassPointers", "-XX:+UseCompressedOops",
|
||
|
|
- "-XX:+UnlockDiagnosticVMOptions", "-XX:SharedArchiveFile=./sample.jsa", "-Xshare:on", "-version");
|
||
|
|
- output = new OutputAnalyzer(pb.start());
|
||
|
|
- output.shouldContain("Unable to use shared archive");
|
||
|
|
- output.shouldHaveExitValue(0);
|
||
|
|
-
|
||
|
|
- pb = ProcessTools.createJavaProcessBuilder(
|
||
|
|
- "-XX:+UseCompressedClassPointers", "-XX:-UseCompressedOops",
|
||
|
|
- "-XX:+UnlockDiagnosticVMOptions", "-XX:SharedArchiveFile=./sample.jsa", "-Xshare:on", "-version");
|
||
|
|
- output = new OutputAnalyzer(pb.start());
|
||
|
|
- output.shouldContain("Unable to use shared archive");
|
||
|
|
- output.shouldHaveExitValue(0);
|
||
|
|
-
|
||
|
|
- } catch (RuntimeException e) {
|
||
|
|
- output.shouldContain("Unable to use shared archive");
|
||
|
|
- output.shouldHaveExitValue(1);
|
||
|
|
- }
|
||
|
|
-
|
||
|
|
- // Test bad options with -Xshare:dump.
|
||
|
|
- pb = ProcessTools.createJavaProcessBuilder(
|
||
|
|
- "-XX:-UseCompressedOops", "-XX:+UseCompressedClassPointers", "-XX:+UnlockDiagnosticVMOptions",
|
||
|
|
- "-XX:SharedArchiveFile=./sample.jsa", "-Xshare:dump");
|
||
|
|
- output = new OutputAnalyzer(pb.start());
|
||
|
|
- output.shouldContain("Cannot dump shared archive");
|
||
|
|
-
|
||
|
|
- pb = ProcessTools.createJavaProcessBuilder(
|
||
|
|
- "-XX:+UseCompressedOops", "-XX:-UseCompressedClassPointers", "-XX:+UnlockDiagnosticVMOptions",
|
||
|
|
- "-XX:SharedArchiveFile=./sample.jsa", "-Xshare:dump");
|
||
|
|
- output = new OutputAnalyzer(pb.start());
|
||
|
|
- output.shouldContain("Cannot dump shared archive");
|
||
|
|
-
|
||
|
|
- pb = ProcessTools.createJavaProcessBuilder(
|
||
|
|
- "-XX:-UseCompressedOops", "-XX:-UseCompressedClassPointers", "-XX:+UnlockDiagnosticVMOptions",
|
||
|
|
- "-XX:SharedArchiveFile=./sample.jsa", "-Xshare:dump");
|
||
|
|
- output = new OutputAnalyzer(pb.start());
|
||
|
|
- output.shouldContain("Cannot dump shared archive");
|
||
|
|
-
|
||
|
|
- }
|
||
|
|
- }
|
||
|
|
-}
|
||
|
|
diff --git a/hotspot/test/runtime/appcds/CommandLineFlagComboNegative.java b/hotspot/test/runtime/appcds/CommandLineFlagComboNegative.java
|
||
|
|
index 4fb965a..286893e 100644
|
||
|
|
--- a/hotspot/test/runtime/appcds/CommandLineFlagComboNegative.java
|
||
|
|
+++ b/hotspot/test/runtime/appcds/CommandLineFlagComboNegative.java
|
||
|
|
@@ -1,5 +1,6 @@
|
||
|
|
/*
|
||
|
|
* Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved.
|
||
|
|
+ * Copyright (c) 2022, Huawei Technologies Co., Ltd. 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
|
||
|
|
@@ -64,9 +65,9 @@ public class CommandLineFlagComboNegative {
|
||
|
|
testTable.add( new TestVector("-XX:ObjectAlignmentInBytes=64", "-XX:ObjectAlignmentInBytes=32",
|
||
|
|
"An error has occurred while processing the shared archive file", 1) );
|
||
|
|
testTable.add( new TestVector("-XX:+UseCompressedOops", "-XX:-UseCompressedOops",
|
||
|
|
- "Class data sharing is inconsistent with other specified options", 1) );
|
||
|
|
+ "The saved state of UseCompressedOops and UseCompressedClassPointers is different from runtime, CDS will be disabled", 1) );
|
||
|
|
testTable.add( new TestVector("-XX:+UseCompressedClassPointers", "-XX:-UseCompressedClassPointers",
|
||
|
|
- "Class data sharing is inconsistent with other specified options", 1) );
|
||
|
|
+ "The saved state of UseCompressedOops and UseCompressedClassPointers is different from runtime, CDS will be disabled", 1) );
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
diff --git a/hotspot/test/runtime/appcds/TestCombinedCompressedFlags.java b/hotspot/test/runtime/appcds/TestCombinedCompressedFlags.java
|
||
|
|
new file mode 100644
|
||
|
|
index 0000000..6f0a3be
|
||
|
|
--- /dev/null
|
||
|
|
+++ b/hotspot/test/runtime/appcds/TestCombinedCompressedFlags.java
|
||
|
|
@@ -0,0 +1,192 @@
|
||
|
|
+/*
|
||
|
|
+ * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
|
||
|
|
+ * Copyright (c) 2022, Huawei Technologies Co., Ltd. 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
|
||
|
|
+ * @bug 8232069
|
||
|
|
+ * @summary Testing different combination of CompressedOops and CompressedClassPointers
|
||
|
|
+ * @requires (vm.gc=="null")
|
||
|
|
+ * @library /testlibrary
|
||
|
|
+ * @compile test-classes/Hello.java
|
||
|
|
+ * @run main/othervm TestCombinedCompressedFlags
|
||
|
|
+ */
|
||
|
|
+
|
||
|
|
+import com.oracle.java.testlibrary.Platform;
|
||
|
|
+import com.oracle.java.testlibrary.OutputAnalyzer;
|
||
|
|
+import java.util.List;
|
||
|
|
+import java.util.ArrayList;
|
||
|
|
+
|
||
|
|
+public class TestCombinedCompressedFlags {
|
||
|
|
+ public static String HELLO_STRING = "Hello World";
|
||
|
|
+ public static String EXEC_ABNORMAL_MSG = "Unable to use shared archive.";
|
||
|
|
+ public static final int PASS = 0;
|
||
|
|
+ public static final int FAIL = 1;
|
||
|
|
+
|
||
|
|
+ static class ConfArg {
|
||
|
|
+ public boolean useCompressedOops; // UseCompressedOops
|
||
|
|
+ public boolean useCompressedClassPointers; // UseCompressedClassPointers
|
||
|
|
+ public String msg;
|
||
|
|
+ public int code;
|
||
|
|
+ public ConfArg(boolean useCompressedOops, boolean useCompressedClassPointers, String msg, int code) {
|
||
|
|
+ this.useCompressedOops = useCompressedOops;
|
||
|
|
+ this.useCompressedClassPointers = useCompressedClassPointers;
|
||
|
|
+ this.msg = msg;
|
||
|
|
+ this.code = code;
|
||
|
|
+ }
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
+ static class RunArg {
|
||
|
|
+ public ConfArg dumpArg;
|
||
|
|
+ public List<ConfArg> execArgs;
|
||
|
|
+ public RunArg(ConfArg arg) {
|
||
|
|
+ dumpArg = arg;
|
||
|
|
+ initExecArgs();
|
||
|
|
+ }
|
||
|
|
+ private void initExecArgs() {
|
||
|
|
+ /* The combinations have four cases. Note COOP off, CCPTR must be off
|
||
|
|
+ * UseCompressedOops UseCompressedClassPointers Result
|
||
|
|
+ * 1.
|
||
|
|
+ * dump: on on
|
||
|
|
+ * test: on on Pass
|
||
|
|
+ * on off Fail
|
||
|
|
+ * off on Fail
|
||
|
|
+ * off off Fail
|
||
|
|
+ * 2.
|
||
|
|
+ * dump: on off
|
||
|
|
+ * test: on off Pass
|
||
|
|
+ * on on Fail
|
||
|
|
+ * off on Pass
|
||
|
|
+ * off off Fail
|
||
|
|
+ * 3.
|
||
|
|
+ * dump: off on
|
||
|
|
+ * test: off on Pass
|
||
|
|
+ * off off Pass
|
||
|
|
+ * on on Fail
|
||
|
|
+ * on off Fail
|
||
|
|
+ * 4.
|
||
|
|
+ * dump: off off
|
||
|
|
+ * test: off off Pass
|
||
|
|
+ * off on Pass
|
||
|
|
+ * on on Fail
|
||
|
|
+ * on off Fail
|
||
|
|
+ **/
|
||
|
|
+ execArgs = new ArrayList<ConfArg>();
|
||
|
|
+ if (dumpArg.useCompressedOops && dumpArg.useCompressedClassPointers) {
|
||
|
|
+ execArgs
|
||
|
|
+ .add(new ConfArg(true, true, HELLO_STRING, PASS));
|
||
|
|
+ execArgs
|
||
|
|
+ .add(new ConfArg(true, false, EXEC_ABNORMAL_MSG, FAIL));
|
||
|
|
+ execArgs
|
||
|
|
+ .add(new ConfArg(false, true, EXEC_ABNORMAL_MSG, FAIL));
|
||
|
|
+ execArgs
|
||
|
|
+ .add(new ConfArg(false, false, EXEC_ABNORMAL_MSG, FAIL));
|
||
|
|
+
|
||
|
|
+ } else if(dumpArg.useCompressedOops && !dumpArg.useCompressedClassPointers) {
|
||
|
|
+ execArgs
|
||
|
|
+ .add(new ConfArg(true, false, HELLO_STRING, PASS));
|
||
|
|
+ execArgs
|
||
|
|
+ .add(new ConfArg(true, true, EXEC_ABNORMAL_MSG, FAIL));
|
||
|
|
+ execArgs
|
||
|
|
+ .add(new ConfArg(false, true, EXEC_ABNORMAL_MSG, FAIL));
|
||
|
|
+ execArgs
|
||
|
|
+ .add(new ConfArg(false, false, EXEC_ABNORMAL_MSG, FAIL));
|
||
|
|
+
|
||
|
|
+ } else if (!dumpArg.useCompressedOops && dumpArg.useCompressedClassPointers) {
|
||
|
|
+ execArgs
|
||
|
|
+ .add(new ConfArg(false, false, HELLO_STRING, PASS));
|
||
|
|
+ execArgs
|
||
|
|
+ .add(new ConfArg(false, true, HELLO_STRING, PASS));
|
||
|
|
+ execArgs
|
||
|
|
+ .add(new ConfArg(true, true, EXEC_ABNORMAL_MSG, FAIL));
|
||
|
|
+ execArgs
|
||
|
|
+ .add(new ConfArg(true, false, EXEC_ABNORMAL_MSG, FAIL));
|
||
|
|
+ } else if (!dumpArg.useCompressedOops && !dumpArg.useCompressedClassPointers) {
|
||
|
|
+ execArgs
|
||
|
|
+ .add(new ConfArg(false, false, HELLO_STRING, PASS));
|
||
|
|
+ execArgs
|
||
|
|
+ .add(new ConfArg(false, true, HELLO_STRING, PASS));
|
||
|
|
+ execArgs
|
||
|
|
+ .add(new ConfArg(true, true, EXEC_ABNORMAL_MSG, FAIL));
|
||
|
|
+ execArgs
|
||
|
|
+ .add(new ConfArg(true, false, EXEC_ABNORMAL_MSG, FAIL));
|
||
|
|
+ }
|
||
|
|
+ }
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
+ public static String getCompressedOopsArg(boolean on) {
|
||
|
|
+ if (on) return "-XX:+UseCompressedOops";
|
||
|
|
+ else return "-XX:-UseCompressedOops";
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
+ public static String getCompressedClassPointersArg(boolean on) {
|
||
|
|
+ if (on) return "-XX:+UseCompressedClassPointers";
|
||
|
|
+ else return "-XX:-UseCompressedClassPointers";
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
+ public static List<RunArg> runList;
|
||
|
|
+
|
||
|
|
+ public static void configureRunArgs() {
|
||
|
|
+ runList = new ArrayList<RunArg>();
|
||
|
|
+ runList
|
||
|
|
+ .add(new RunArg(new ConfArg(true, true, null, PASS)));
|
||
|
|
+ runList
|
||
|
|
+ .add(new RunArg(new ConfArg(true, false, null, PASS)));
|
||
|
|
+ runList
|
||
|
|
+ .add(new RunArg(new ConfArg(false, true, null, PASS)));
|
||
|
|
+ runList
|
||
|
|
+ .add(new RunArg(new ConfArg(false, false, null, PASS)));
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
+ public static void main(String[] args) throws Exception {
|
||
|
|
+ if (!Platform.is64bit()) {
|
||
|
|
+ System.out.println("Test case not applicable on 32-bit platforms");
|
||
|
|
+ return;
|
||
|
|
+
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
+ String helloJar = JarBuilder.build("hello", "Hello");
|
||
|
|
+ configureRunArgs();
|
||
|
|
+ OutputAnalyzer out;
|
||
|
|
+ for (RunArg t: runList) {
|
||
|
|
+ out = TestCommon
|
||
|
|
+ .dump(helloJar,
|
||
|
|
+ new String[] {"Hello"},
|
||
|
|
+ getCompressedOopsArg(t.dumpArg.useCompressedOops),
|
||
|
|
+ getCompressedClassPointersArg(t.dumpArg.useCompressedClassPointers));
|
||
|
|
+ out.shouldContain("total : ");
|
||
|
|
+ out.shouldHaveExitValue(0);
|
||
|
|
+
|
||
|
|
+ for (ConfArg c : t.execArgs) {
|
||
|
|
+ out = TestCommon.exec(helloJar,
|
||
|
|
+ "-cp",
|
||
|
|
+ helloJar,
|
||
|
|
+ getCompressedOopsArg(c.useCompressedOops),
|
||
|
|
+ getCompressedClassPointersArg(c.useCompressedClassPointers),
|
||
|
|
+ "Hello");
|
||
|
|
+ out.shouldContain(c.msg);
|
||
|
|
+ out.shouldHaveExitValue(c.code);
|
||
|
|
+ }
|
||
|
|
+ }
|
||
|
|
+ }
|
||
|
|
+}
|
||
|
|
diff --git a/jdk/make/BuildJdk.gmk b/jdk/make/BuildJdk.gmk
|
||
|
|
index bb8ea8a..6707456 100644
|
||
|
|
--- a/jdk/make/BuildJdk.gmk
|
||
|
|
+++ b/jdk/make/BuildJdk.gmk
|
||
|
|
@@ -106,8 +106,10 @@ images:
|
||
|
|
ifeq ($(BUILD_CDS_ARCHIVE), true)
|
||
|
|
echo Creating CDS archive for jdk image
|
||
|
|
$(JDK_IMAGE_DIR)/bin/java -Xshare:dump -Xmx128M -Xms128M -XX:ParallelGCThreads=1 -Xint $(LOG_INFO)
|
||
|
|
+ $(JDK_IMAGE_DIR)/bin/java -Xshare:dump -Xmx128M -Xms128M -XX:ParallelGCThreads=1 -Xint -XX:-UseCompressedOops $(LOG_INFO)
|
||
|
|
echo Creating CDS archive for jre image
|
||
|
|
$(JRE_IMAGE_DIR)/bin/java -Xshare:dump -Xmx128M -Xms128M -XX:ParallelGCThreads=1 -Xint $(LOG_INFO)
|
||
|
|
+ $(JDK_IMAGE_DIR)/bin/java -Xshare:dump -Xmx128M -Xms128M -XX:ParallelGCThreads=1 -Xint -XX:-UseCompressedOops $(LOG_INFO)
|
||
|
|
endif
|
||
|
|
|
||
|
|
|
||
|
|
--
|
||
|
|
1.8.3.1
|