8141341: CDS should be disabled if JvmtiExport::should_post_class_file_load_hook() is true.
Summary: Disable loading shared class if JvmtiExport::should_post_class_file_load_hook is true.
Reviewed-by: iklam, acorn, sspitsyn
--- a/hotspot/src/share/vm/classfile/systemDictionary.cpp Tue Jul 19 09:30:30 2016 +0200
+++ b/hotspot/src/share/vm/classfile/systemDictionary.cpp Tue Jul 19 13:52:14 2016 -0400
@@ -1246,12 +1246,16 @@
instanceKlassHandle SystemDictionary::load_shared_class(
Symbol* class_name, Handle class_loader, TRAPS) {
- instanceKlassHandle ik (THREAD, find_shared_class(class_name));
- // Make sure we only return the boot class for the NULL classloader.
- if (ik.not_null() &&
- ik->is_shared_boot_class() && class_loader.is_null()) {
- Handle protection_domain;
- return load_shared_class(ik, class_loader, protection_domain, THREAD);
+ // Don't load shared class when JvmtiExport::should_post_class_file_load_hook()
+ // is enabled since posting CFLH is not supported when loading shared class.
+ if (!JvmtiExport::should_post_class_file_load_hook()) {
+ instanceKlassHandle ik (THREAD, find_shared_class(class_name));
+ // Make sure we only return the boot class for the NULL classloader.
+ if (ik.not_null() &&
+ ik->is_shared_boot_class() && class_loader.is_null()) {
+ Handle protection_domain;
+ return load_shared_class(ik, class_loader, protection_domain, THREAD);
+ }
}
return instanceKlassHandle();
}
@@ -1334,8 +1338,14 @@
instanceKlassHandle SystemDictionary::load_shared_class(instanceKlassHandle ik,
Handle class_loader,
Handle protection_domain, TRAPS) {
+ instanceKlassHandle nh = instanceKlassHandle(); // null Handle
+ if (JvmtiExport::should_post_class_file_load_hook()) {
+ // Don't load shared class when JvmtiExport::should_post_class_file_load_hook()
+ // is enabled since posting CFLH is not supported when loading shared class.
+ return nh;
+ }
+
if (ik.not_null()) {
- instanceKlassHandle nh = instanceKlassHandle(); // null Handle
Symbol* class_name = ik->name();
bool visible = is_shared_class_visible(
--- a/hotspot/src/share/vm/memory/metaspace.cpp Tue Jul 19 09:30:30 2016 +0200
+++ b/hotspot/src/share/vm/memory/metaspace.cpp Tue Jul 19 13:52:14 2016 -0400
@@ -3164,39 +3164,47 @@
#endif // _LP64
#endif // INCLUDE_CDS
} else {
- // If using shared space, open the file that contains the shared space
- // and map in the memory before initializing the rest of metaspace (so
- // the addresses don't conflict)
- address cds_address = NULL;
+#if INCLUDE_CDS
if (UseSharedSpaces) {
-#if INCLUDE_CDS
+ // If using shared space, open the file that contains the shared space
+ // and map in the memory before initializing the rest of metaspace (so
+ // the addresses don't conflict)
+ address cds_address = NULL;
FileMapInfo* mapinfo = new FileMapInfo();
- // Open the shared archive file, read and validate the header. If
- // initialization fails, shared spaces [UseSharedSpaces] are
- // disabled and the file is closed.
- // Map in spaces now also
- if (mapinfo->initialize() && MetaspaceShared::map_shared_spaces(mapinfo)) {
- cds_total = FileMapInfo::shared_spaces_size();
- cds_address = (address)mapinfo->header()->region_addr(0);
+ if (JvmtiExport::should_post_class_file_load_hook()) {
+ // Currently CDS does not support JVMTI CFLH when loading shared class.
+ // If JvmtiExport::should_post_class_file_load_hook is already enabled,
+ // just disable UseSharedSpaces.
+ FileMapInfo::fail_continue("Tool agent requires sharing to be disabled.");
+ delete mapinfo;
+ } else {
+ // Open the shared archive file, read and validate the header. If
+ // initialization fails, shared spaces [UseSharedSpaces] are
+ // disabled and the file is closed.
+ // Map in spaces now also
+ if (mapinfo->initialize() && MetaspaceShared::map_shared_spaces(mapinfo)) {
+ cds_total = FileMapInfo::shared_spaces_size();
+ cds_address = (address)mapinfo->header()->region_addr(0);
#ifdef _LP64
- if (using_class_space()) {
- char* cds_end = (char*)(cds_address + cds_total);
- cds_end = (char *)align_ptr_up(cds_end, _reserve_alignment);
- // If UseCompressedClassPointers is set then allocate the metaspace area
- // above the heap and above the CDS area (if it exists).
- allocate_metaspace_compressed_klass_ptrs(cds_end, cds_address);
- // Map the shared string space after compressed pointers
- // because it relies on compressed class pointers setting to work
- mapinfo->map_string_regions();
+ if (using_class_space()) {
+ char* cds_end = (char*)(cds_address + cds_total);
+ cds_end = (char *)align_ptr_up(cds_end, _reserve_alignment);
+ // If UseCompressedClassPointers is set then allocate the metaspace area
+ // above the heap and above the CDS area (if it exists).
+ allocate_metaspace_compressed_klass_ptrs(cds_end, cds_address);
+ // Map the shared string space after compressed pointers
+ // because it relies on compressed class pointers setting to work
+ mapinfo->map_string_regions();
+ }
+#endif // _LP64
+ } else {
+ assert(!mapinfo->is_open() && !UseSharedSpaces,
+ "archive file not closed or shared spaces not disabled.");
}
-#endif // _LP64
- } else {
- assert(!mapinfo->is_open() && !UseSharedSpaces,
- "archive file not closed or shared spaces not disabled.");
}
+ }
#endif // INCLUDE_CDS
- }
#ifdef _LP64
if (!UseSharedSpaces && using_class_space()) {