# HG changeset patch # User ccheung # Date 1414701480 25200 # Node ID 03e6d34be1f51c51013627b664aee1551e6ba407 # Parent 90297adbda9db20f9d9c6d22f909d53c4d0fb1c6 8038268: VM Crashes in MetaspaceShared::generate_vtable_methods while creating CDS archive with limiting SharedMiscCodeSize Summary: estimate the minimum required size for the misc code region and check if the specified misc code region size meets the minimum size requirement Reviewed-by: jiangli, dholmes diff -r 90297adbda9d -r 03e6d34be1f5 src/share/vm/memory/metaspace.cpp --- a/src/share/vm/memory/metaspace.cpp Fri Oct 24 10:28:19 2014 -0700 +++ b/src/share/vm/memory/metaspace.cpp Thu Oct 30 13:38:00 2014 -0700 @@ -3155,6 +3155,16 @@ SharedMiscDataSize = align_size_up(SharedMiscDataSize, max_alignment); SharedMiscCodeSize = align_size_up(SharedMiscCodeSize, max_alignment); + // the min_misc_code_size estimate is based on MetaspaceShared::generate_vtable_methods() + uintx min_misc_code_size = align_size_up( + (MetaspaceShared::num_virtuals * MetaspaceShared::vtbl_list_size) * + (sizeof(void*) + MetaspaceShared::vtbl_method_size) + MetaspaceShared::vtbl_common_code_size, + max_alignment); + + if (SharedMiscCodeSize < min_misc_code_size) { + report_out_of_shared_space(SharedMiscCode); + } + // Initialize with the sum of the shared space sizes. The read-only // and read write metaspace chunks will be allocated out of this and the // remainder is the misc code and data chunks. diff -r 90297adbda9d -r 03e6d34be1f5 src/share/vm/memory/metaspaceShared.hpp --- a/src/share/vm/memory/metaspaceShared.hpp Fri Oct 24 10:28:19 2014 -0700 +++ b/src/share/vm/memory/metaspaceShared.hpp Thu Oct 30 13:38:00 2014 -0700 @@ -57,11 +57,16 @@ static bool _archive_loading_failed; public: enum { - vtbl_list_size = 17, // number of entries in the shared space vtable list. - num_virtuals = 200 // maximum number of virtual functions - // If virtual functions are added to Metadata, - // this number needs to be increased. Also, - // SharedMiscCodeSize will need to be increased. + vtbl_list_size = 17, // number of entries in the shared space vtable list. + num_virtuals = 200, // maximum number of virtual functions + // If virtual functions are added to Metadata, + // this number needs to be increased. Also, + // SharedMiscCodeSize will need to be increased. + // The following 2 sizes were based on + // MetaspaceShared::generate_vtable_methods() + vtbl_method_size = 16, // conservative size of the mov1 and jmp instructions + // for the x64 platform + vtbl_common_code_size = (1*K) // conservative size of the "common_code" for the x64 platform }; enum { diff -r 90297adbda9d -r 03e6d34be1f5 src/share/vm/utilities/debug.cpp --- a/src/share/vm/utilities/debug.cpp Fri Oct 24 10:28:19 2014 -0700 +++ b/src/share/vm/utilities/debug.cpp Thu Oct 30 13:38:00 2014 -0700 @@ -266,17 +266,19 @@ "native memory for metadata", "shared read only space", "shared read write space", - "shared miscellaneous data space" + "shared miscellaneous data space", + "shared miscellaneous code space" }; static const char* flag[] = { "Metaspace", "SharedReadOnlySize", "SharedReadWriteSize", - "SharedMiscDataSize" + "SharedMiscDataSize", + "SharedMiscCodeSize" }; warning("\nThe %s is not large enough\n" - "to preload requested classes. Use -XX:%s=\n" + "to preload requested classes. Use -XX:%s=\n" "to increase the initial size of %s.\n", name[shared_space], flag[shared_space], name[shared_space]); exit(2); diff -r 90297adbda9d -r 03e6d34be1f5 src/share/vm/utilities/debug.hpp --- a/src/share/vm/utilities/debug.hpp Fri Oct 24 10:28:19 2014 -0700 +++ b/src/share/vm/utilities/debug.hpp Thu Oct 30 13:38:00 2014 -0700 @@ -246,7 +246,8 @@ SharedPermGen, SharedReadOnly, SharedReadWrite, - SharedMiscData + SharedMiscData, + SharedMiscCode }; void report_out_of_shared_space(SharedSpaceType space_type); diff -r 90297adbda9d -r 03e6d34be1f5 test/runtime/SharedArchiveFile/LimitSharedSizes.java --- a/test/runtime/SharedArchiveFile/LimitSharedSizes.java Fri Oct 24 10:28:19 2014 -0700 +++ b/test/runtime/SharedArchiveFile/LimitSharedSizes.java Thu Oct 30 13:38:00 2014 -0700 @@ -51,9 +51,12 @@ // Known issue, JDK-8038422 (assert() on Windows) // new SharedSizeTestData("-XX:SharedMiscDataSize", "500k", "miscellaneous data"), - // This will cause a VM crash; commenting out for now; see bug JDK-8038268 - // @ignore JDK-8038268 - // new SharedSizeTestData("-XX:SharedMiscCodeSize", "20k", "miscellaneous code"), + // Too small of a misc code size should not cause a vm crash. + // It should result in the following error message: + // The shared miscellaneous code space is not large enough + // to preload requested classes. Use -XX:SharedMiscCodeSize= + // to increase the initial size of shared miscellaneous code space. + new SharedSizeTestData("-XX:SharedMiscCodeSize", "20k", "miscellaneous code"), // these values are larger than default ones, but should // be acceptable and not cause failure