< prev index next >

src/hotspot/share/memory/metaspaceShared.cpp

Print this page

        

@@ -22,10 +22,11 @@
  *
  */
 
 #include "precompiled.hpp"
 #include "jvm.h"
+#include "classfile/classFileStream.hpp"
 #include "classfile/classLoaderDataGraph.hpp"
 #include "classfile/classListParser.hpp"
 #include "classfile/classLoaderExt.hpp"
 #include "classfile/dictionary.hpp"
 #include "classfile/loaderConstraints.hpp"

@@ -42,10 +43,11 @@
 #include "logging/log.hpp"
 #include "logging/logMessage.hpp"
 #include "memory/archiveUtils.inline.hpp"
 #include "memory/dynamicArchive.hpp"
 #include "memory/filemap.hpp"
+#include "memory/lambdaFormInvokers.hpp"
 #include "memory/heapShared.inline.hpp"
 #include "memory/metaspace.hpp"
 #include "memory/metaspaceClosure.hpp"
 #include "memory/metaspaceShared.hpp"
 #include "memory/resourceArea.hpp"

@@ -659,10 +661,19 @@
       if (h != NULL) {
         h->array_klasses_do(collect_array_classes);
       }
     }
   }
+ public:
+  void add_extra_classes(GrowableArray<Klass*>* klass_list) {
+    if (klass_list != NULL && klass_list->length() > 0) {
+      for (int i = 0; i < klass_list->length(); i++) {
+        Klass* k = klass_list->at(i);
+        _global_klass_objects->append_if_missing(k);
+      }
+    }
+  }
 };
 
 // Global object for holding symbols that created during class loading. See SymbolTable::new_symbol
 static GrowableArray<Symbol*>* _global_symbol_objects = NULL;
 

@@ -1641,10 +1652,11 @@
   // that so we don't have to walk the SystemDictionary again.
   SystemDictionaryShared::check_excluded_classes();
   _global_klass_objects = new GrowableArray<Klass*>(1000);
   CollectClassesClosure collect_classes;
   ClassLoaderDataGraph::loaded_classes_do(&collect_classes);
+  collect_classes.add_extra_classes(LambdaFormInvokers::replacement_holder_classes());
   _global_klass_objects->sort(global_klass_compare);
 
   print_class_stats();
 
   // Ensure the ConstMethods won't be modified at run-time

@@ -1911,12 +1923,18 @@
     log_info(cds)("Shared spaces: preloaded %d classes", class_count);
 
     if (SharedArchiveConfigFile) {
       log_info(cds)("Reading extra data from %s ...", SharedArchiveConfigFile);
       read_extra_data(SharedArchiveConfigFile, THREAD);
-    }
     log_info(cds)("Reading extra data: done.");
+    }
+
+    if (LambdaFormInvokers::lambdaform_lines() != NULL) {
+      log_info(cds)("Regenerate MethodHandle Holder classes...");
+      LambdaFormInvokers::regenerate_holder_classes(THREAD);
+      log_info(cds)("Regenerate MethodHandle Holder classes done.");
+    }
 
     HeapShared::init_subgraph_entry_fields(THREAD);
 
     // Rewrite and link classes
     log_info(cds)("Rewriting and linking classes ...");

@@ -1933,11 +1951,10 @@
                    Heap_lock : NULL);     // needed by HeapShared::run_gc()
     VMThread::execute(&op);
   }
 }
 
-
 int MetaspaceShared::preload_classes(const char* class_list_path, TRAPS) {
   ClassListParser parser(class_list_path);
   int class_count = 0;
 
   while (parser.parse_one_line()) {

@@ -2690,10 +2707,5 @@
   } else {
     st->print("CDS disabled.");
   }
   st->cr();
 }
-
-
-
-
-
< prev index next >