< prev index next >

src/share/vm/oops/method.cpp

Print this page

        

@@ -38,10 +38,11 @@
 #include "memory/heapInspection.hpp"
 #include "memory/metadataFactory.hpp"
 #include "memory/metaspaceShared.hpp"
 #include "memory/oopFactory.hpp"
 #include "memory/resourceArea.hpp"
+#include "memory/vtBuffer.hpp"
 #include "oops/constMethod.hpp"
 #include "oops/method.hpp"
 #include "oops/methodData.hpp"
 #include "oops/objArrayOop.inline.hpp"
 #include "oops/oop.inline.hpp"

@@ -102,10 +103,12 @@
   if (access_flags.is_native()) {
     clear_native_function();
     set_signature_handler(NULL);
   }
 
+  initialize_max_vt_buffer();
+
   NOT_PRODUCT(set_compiled_invocation_count(0);)
 }
 
 // Release Method*.  The nmethod will be gone when we get here because
 // we've walked the code cache.

@@ -1863,10 +1866,18 @@
   } else {
     return (mcs == NULL) ? 0 : mcs->backedge_counter()->count();
   }
 }
 
+void Method::initialize_max_vt_buffer() {
+  long long max_entries = constMethod()->max_locals() + constMethod()->max_stack();
+  max_entries *= 2; // Add margin for loops
+  long long max_size = max_entries * (BigValueTypeThreshold + 8); // 8 -> header size
+  int max_chunks = (int)(max_size / VTBufferChunk::max_alloc_size()) + 1;
+  set_max_vt_buffer(MAX2(MinimumVTBufferChunkPerFrame, max_chunks));
+}
+
 int Method::highest_comp_level() const {
   const MethodCounters* mcs = method_counters();
   if (mcs != NULL) {
     return mcs->highest_comp_level();
   } else {
< prev index next >