mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-27 14:54:52 +02:00
8005076: Creating a CDS archive with one alignment and running another causes a crash
Save the alignment when writing the CDS and compare it when reading the CDS. Reviewed-by: kvn, coleenp
This commit is contained in:
parent
89e575df23
commit
cfea76669a
4 changed files with 19 additions and 16 deletions
|
@ -119,6 +119,7 @@ void FileMapInfo::populate_header(size_t alignment) {
|
||||||
_header._magic = 0xf00baba2;
|
_header._magic = 0xf00baba2;
|
||||||
_header._version = _current_version;
|
_header._version = _current_version;
|
||||||
_header._alignment = alignment;
|
_header._alignment = alignment;
|
||||||
|
_header._obj_alignment = ObjectAlignmentInBytes;
|
||||||
|
|
||||||
// The following fields are for sanity checks for whether this archive
|
// The following fields are for sanity checks for whether this archive
|
||||||
// will function correctly with this JVM and the bootclasspath it's
|
// will function correctly with this JVM and the bootclasspath it's
|
||||||
|
@ -473,6 +474,12 @@ bool FileMapInfo::validate() {
|
||||||
" version or build of HotSpot.");
|
" version or build of HotSpot.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
if (_header._obj_alignment != ObjectAlignmentInBytes) {
|
||||||
|
fail_continue("The shared archive file's ObjectAlignmentInBytes of %d"
|
||||||
|
" does not equal the current ObjectAlignmentInBytes of %d.",
|
||||||
|
_header._obj_alignment, ObjectAlignmentInBytes);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// Cannot verify interpreter yet, as it can only be created after the GC
|
// Cannot verify interpreter yet, as it can only be created after the GC
|
||||||
// heap has been initialized.
|
// heap has been initialized.
|
||||||
|
|
|
@ -63,6 +63,7 @@ private:
|
||||||
int _magic; // identify file type.
|
int _magic; // identify file type.
|
||||||
int _version; // (from enum, above.)
|
int _version; // (from enum, above.)
|
||||||
size_t _alignment; // how shared archive should be aligned
|
size_t _alignment; // how shared archive should be aligned
|
||||||
|
int _obj_alignment; // value of ObjectAlignmentInBytes
|
||||||
|
|
||||||
struct space_info {
|
struct space_info {
|
||||||
int _file_offset; // sizeof(this) rounded to vm page size
|
int _file_offset; // sizeof(this) rounded to vm page size
|
||||||
|
|
|
@ -1331,14 +1331,14 @@ bool verify_object_alignment() {
|
||||||
// then a saved space from compressed oops.
|
// then a saved space from compressed oops.
|
||||||
if ((int)ObjectAlignmentInBytes > 256) {
|
if ((int)ObjectAlignmentInBytes > 256) {
|
||||||
jio_fprintf(defaultStream::error_stream(),
|
jio_fprintf(defaultStream::error_stream(),
|
||||||
"error: ObjectAlignmentInBytes=%d must not be greater then 256\n",
|
"error: ObjectAlignmentInBytes=%d must not be greater than 256\n",
|
||||||
(int)ObjectAlignmentInBytes);
|
(int)ObjectAlignmentInBytes);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// In case page size is very small.
|
// In case page size is very small.
|
||||||
if ((int)ObjectAlignmentInBytes >= os::vm_page_size()) {
|
if ((int)ObjectAlignmentInBytes >= os::vm_page_size()) {
|
||||||
jio_fprintf(defaultStream::error_stream(),
|
jio_fprintf(defaultStream::error_stream(),
|
||||||
"error: ObjectAlignmentInBytes=%d must be less then page size %d\n",
|
"error: ObjectAlignmentInBytes=%d must be less than page size %d\n",
|
||||||
(int)ObjectAlignmentInBytes, os::vm_page_size());
|
(int)ObjectAlignmentInBytes, os::vm_page_size());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -2997,11 +2997,6 @@ void Arguments::set_shared_spaces_flags() {
|
||||||
FLAG_SET_DEFAULT(UseLargePages, false);
|
FLAG_SET_DEFAULT(UseLargePages, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add 2M to any size for SharedReadOnlySize to get around the JPRT setting
|
|
||||||
if (DumpSharedSpaces && !FLAG_IS_DEFAULT(SharedReadOnlySize)) {
|
|
||||||
SharedReadOnlySize = 14*M;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (DumpSharedSpaces) {
|
if (DumpSharedSpaces) {
|
||||||
if (RequireSharedSpaces) {
|
if (RequireSharedSpaces) {
|
||||||
warning("cannot dump shared archive while using shared archive");
|
warning("cannot dump shared archive while using shared archive");
|
||||||
|
|
|
@ -1830,7 +1830,7 @@ class CommandLineFlags {
|
||||||
\
|
\
|
||||||
product(intx, CMSIsTooFullPercentage, 98, \
|
product(intx, CMSIsTooFullPercentage, 98, \
|
||||||
"An absolute ceiling above which CMS will always consider the " \
|
"An absolute ceiling above which CMS will always consider the " \
|
||||||
"perm gen ripe for collection") \
|
"unloading of classes when class unloading is enabled") \
|
||||||
\
|
\
|
||||||
develop(bool, CMSTestInFreeList, false, \
|
develop(bool, CMSTestInFreeList, false, \
|
||||||
"Check if the coalesced range is already in the " \
|
"Check if the coalesced range is already in the " \
|
||||||
|
@ -1899,13 +1899,13 @@ class CommandLineFlags {
|
||||||
"Metadata deallocation alot interval") \
|
"Metadata deallocation alot interval") \
|
||||||
\
|
\
|
||||||
develop(bool, TraceMetadataChunkAllocation, false, \
|
develop(bool, TraceMetadataChunkAllocation, false, \
|
||||||
"Trace humongous metadata allocations") \
|
"Trace chunk metadata allocations") \
|
||||||
\
|
\
|
||||||
product(bool, TraceMetadataHumongousAllocation, false, \
|
product(bool, TraceMetadataHumongousAllocation, false, \
|
||||||
"Trace humongous metadata allocations") \
|
"Trace humongous metadata allocations") \
|
||||||
\
|
\
|
||||||
develop(bool, TraceMetavirtualspaceAllocation, false, \
|
develop(bool, TraceMetavirtualspaceAllocation, false, \
|
||||||
"Trace humongous metadata allocations") \
|
"Trace virtual space metadata allocations") \
|
||||||
\
|
\
|
||||||
notproduct(bool, ExecuteInternalVMTests, false, \
|
notproduct(bool, ExecuteInternalVMTests, false, \
|
||||||
"Enable execution of internal VM tests.") \
|
"Enable execution of internal VM tests.") \
|
||||||
|
@ -3537,10 +3537,10 @@ class CommandLineFlags {
|
||||||
/* Shared spaces */ \
|
/* Shared spaces */ \
|
||||||
\
|
\
|
||||||
product(bool, UseSharedSpaces, true, \
|
product(bool, UseSharedSpaces, true, \
|
||||||
"Use shared spaces in the permanent generation") \
|
"Use shared spaces for metadata") \
|
||||||
\
|
\
|
||||||
product(bool, RequireSharedSpaces, false, \
|
product(bool, RequireSharedSpaces, false, \
|
||||||
"Require shared spaces in the permanent generation") \
|
"Require shared spaces for metadata") \
|
||||||
\
|
\
|
||||||
product(bool, DumpSharedSpaces, false, \
|
product(bool, DumpSharedSpaces, false, \
|
||||||
"Special mode: JVM reads a class list, loads classes, builds " \
|
"Special mode: JVM reads a class list, loads classes, builds " \
|
||||||
|
@ -3551,16 +3551,16 @@ class CommandLineFlags {
|
||||||
"Print usage of shared spaces") \
|
"Print usage of shared spaces") \
|
||||||
\
|
\
|
||||||
product(uintx, SharedReadWriteSize, NOT_LP64(12*M) LP64_ONLY(16*M), \
|
product(uintx, SharedReadWriteSize, NOT_LP64(12*M) LP64_ONLY(16*M), \
|
||||||
"Size of read-write space in permanent generation (in bytes)") \
|
"Size of read-write space for metadata (in bytes)") \
|
||||||
\
|
\
|
||||||
product(uintx, SharedReadOnlySize, NOT_LP64(12*M) LP64_ONLY(16*M), \
|
product(uintx, SharedReadOnlySize, NOT_LP64(12*M) LP64_ONLY(16*M), \
|
||||||
"Size of read-only space in permanent generation (in bytes)") \
|
"Size of read-only space for metadata (in bytes)") \
|
||||||
\
|
\
|
||||||
product(uintx, SharedMiscDataSize, NOT_LP64(2*M) LP64_ONLY(4*M), \
|
product(uintx, SharedMiscDataSize, NOT_LP64(2*M) LP64_ONLY(4*M), \
|
||||||
"Size of the shared data area adjacent to the heap (in bytes)") \
|
"Size of the shared miscellaneous data area (in bytes)") \
|
||||||
\
|
\
|
||||||
product(uintx, SharedMiscCodeSize, 120*K, \
|
product(uintx, SharedMiscCodeSize, 120*K, \
|
||||||
"Size of the shared code area adjacent to the heap (in bytes)") \
|
"Size of the shared miscellaneous code area (in bytes)") \
|
||||||
\
|
\
|
||||||
product(uintx, SharedDummyBlockSize, 0, \
|
product(uintx, SharedDummyBlockSize, 0, \
|
||||||
"Size of dummy block used to shift heap addresses (in bytes)") \
|
"Size of dummy block used to shift heap addresses (in bytes)") \
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue