< prev index next >

src/hotspot/share/gc/parallel/parallelArguments.cpp

Print this page

        

@@ -24,20 +24,62 @@
 
 #include "precompiled.hpp"
 #include "gc/parallel/parallelArguments.hpp"
 #include "gc/parallel/parallelScavengeHeap.hpp"
 #include "gc/shared/adaptiveSizePolicy.hpp"
-#include "gc/shared/collectorPolicy.hpp"
 #include "gc/shared/gcArguments.inline.hpp"
+#include "gc/shared/genArguments.hpp"
 #include "runtime/globals.hpp"
 #include "runtime/globals_extension.hpp"
 #include "runtime/java.hpp"
+#include "runtime/os.hpp"
 #include "runtime/vm_version.hpp"
 #include "utilities/defaultStream.hpp"
 
 size_t ParallelArguments::conservative_max_heap_alignment() {
-  return CollectorPolicy::compute_heap_alignment();
+  return compute_heap_alignment();
+}
+
+void ParallelArguments::initialize_heap_flags_one_pass(PSSettings& s) {
+  // Do basic sizing work
+  GenArguments::initialize_heap_flags(s);
+
+  // The survivor ratio's are calculated "raw", unlike the
+  // default gc, which adds 2 to the ratio value. We need to
+  // make sure the values are valid before using them.
+  if (MinSurvivorRatio < 3) {
+    FLAG_SET_ERGO(uintx, MinSurvivorRatio, 3);
+  }
+
+  if (InitialSurvivorRatio < 3) {
+    FLAG_SET_ERGO(uintx, InitialSurvivorRatio, 3);
+  }
+}
+
+PSSettings ParallelArguments::initialize_heap_flags() {
+  PSSettings s;
+
+  initialize_heap_flags_one_pass(s);
+
+  const size_t max_page_sz = os::page_size_for_region_aligned(s._max_heap_byte_size, 8);
+  const size_t min_pages = 4; // 1 for eden + 1 for each survivor + 1 for old
+  const size_t min_page_sz = os::page_size_for_region_aligned(s._min_heap_byte_size, min_pages);
+  const size_t page_sz = MIN2(max_page_sz, min_page_sz);
+
+  // Can a page size be something else than a power of two?
+  assert(is_power_of_2((intptr_t)page_sz), "must be a power of 2");
+  size_t new_alignment = align_up(page_sz, s._gen_alignment);
+  if (new_alignment != s._gen_alignment) {
+    s._gen_alignment = new_alignment;
+    s._space_alignment = new_alignment;
+    // Redo everything from the start
+    initialize_heap_flags_one_pass(s);
+  }
+
+  GenArguments::initialize_size_info(s);
+
+  return s;
 }
 
 void ParallelArguments::initialize_flags() {
   GCArguments::initialize_flags();
   assert(UseParallelGC || UseParallelOldGC, "Error");

@@ -90,7 +132,7 @@
     }
   }
 }
 
 CollectedHeap* ParallelArguments::create_heap() {
-  return create_heap_with_policy<ParallelScavengeHeap, GenerationSizer>();
+  return new ParallelScavengeHeap(initialize_heap_flags());
 }
< prev index next >