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
--- a/hotspot/src/share/vm/memory/metaspace.cpp Wed Oct 22 22:37:06 2014 +0000
+++ b/hotspot/src/share/vm/memory/metaspace.cpp Thu Oct 23 10:08:02 2014 -0700
@@ -3157,6 +3157,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.
--- a/hotspot/src/share/vm/memory/metaspaceShared.hpp Wed Oct 22 22:37:06 2014 +0000
+++ b/hotspot/src/share/vm/memory/metaspaceShared.hpp Thu Oct 23 10:08:02 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 {
--- a/hotspot/src/share/vm/utilities/debug.cpp Wed Oct 22 22:37:06 2014 +0000
+++ b/hotspot/src/share/vm/utilities/debug.cpp Thu Oct 23 10:08:02 2014 -0700
@@ -256,16 +256,18 @@
static const char* name[] = {
"shared read only space",
"shared read write space",
- "shared miscellaneous data space"
+ "shared miscellaneous data space",
+ "shared miscellaneous code space"
};
static const char* flag[] = {
"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=<size>\n"
"to increase the initial size of %s.\n",
name[shared_space], flag[shared_space], name[shared_space]);
exit(2);
--- a/hotspot/src/share/vm/utilities/debug.hpp Wed Oct 22 22:37:06 2014 +0000
+++ b/hotspot/src/share/vm/utilities/debug.hpp Thu Oct 23 10:08:02 2014 -0700
@@ -245,7 +245,8 @@
enum SharedSpaceType {
SharedReadOnly,
SharedReadWrite,
- SharedMiscData
+ SharedMiscData,
+ SharedMiscCode
};
void report_out_of_shared_space(SharedSpaceType space_type);
--- a/hotspot/test/runtime/SharedArchiveFile/LimitSharedSizes.java Wed Oct 22 22:37:06 2014 +0000
+++ b/hotspot/test/runtime/SharedArchiveFile/LimitSharedSizes.java Thu Oct 23 10:08:02 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