diff src/share/vm/memory/generationSpec.cpp @ 0:a61af66fc99e jdk7-b24

Initial load
author duke
date Sat, 01 Dec 2007 00:00:00 +0000
parents
children c18cbe5936b8
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/vm/memory/generationSpec.cpp	Sat Dec 01 00:00:00 2007 +0000
@@ -0,0 +1,188 @@
+/*
+ * Copyright 2001-2005 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+# include "incls/_precompiled.incl"
+# include "incls/_generationSpec.cpp.incl"
+
+Generation* GenerationSpec::init(ReservedSpace rs, int level,
+                                 GenRemSet* remset) {
+  switch (name()) {
+    case Generation::DefNew:
+      return new DefNewGeneration(rs, init_size(), level);
+
+    case Generation::MarkSweepCompact:
+      return new TenuredGeneration(rs, init_size(), level, remset);
+
+#ifndef SERIALGC
+    case Generation::ParNew:
+      return new ParNewGeneration(rs, init_size(), level);
+
+    case Generation::ASParNew:
+      return new ASParNewGeneration(rs,
+                                    init_size(),
+                                    init_size() /* min size */,
+                                    level);
+
+    case Generation::ConcurrentMarkSweep: {
+      assert(UseConcMarkSweepGC, "UseConcMarkSweepGC should be set");
+      CardTableRS* ctrs = remset->as_CardTableRS();
+      if (ctrs == NULL) {
+        vm_exit_during_initialization("Rem set incompatibility.");
+      }
+      // Otherwise
+      // The constructor creates the CMSCollector if needed,
+      // else registers with an existing CMSCollector
+
+      ConcurrentMarkSweepGeneration* g = NULL;
+      g = new ConcurrentMarkSweepGeneration(rs,
+                 init_size(), level, ctrs, UseCMSAdaptiveFreeLists,
+                 (FreeBlockDictionary::DictionaryChoice)CMSDictionaryChoice);
+
+      g->initialize_performance_counters();
+
+      return g;
+    }
+
+    case Generation::ASConcurrentMarkSweep: {
+      assert(UseConcMarkSweepGC, "UseConcMarkSweepGC should be set");
+      CardTableRS* ctrs = remset->as_CardTableRS();
+      if (ctrs == NULL) {
+        vm_exit_during_initialization("Rem set incompatibility.");
+      }
+      // Otherwise
+      // The constructor creates the CMSCollector if needed,
+      // else registers with an existing CMSCollector
+
+      ASConcurrentMarkSweepGeneration* g = NULL;
+      g = new ASConcurrentMarkSweepGeneration(rs,
+                 init_size(), level, ctrs, UseCMSAdaptiveFreeLists,
+                 (FreeBlockDictionary::DictionaryChoice)CMSDictionaryChoice);
+
+      g->initialize_performance_counters();
+
+      return g;
+    }
+#endif // SERIALGC
+
+    default:
+      guarantee(false, "unrecognized GenerationName");
+      return NULL;
+  }
+}
+
+
+PermanentGenerationSpec::PermanentGenerationSpec(PermGen::Name name,
+                      size_t init_size, size_t max_size,
+                      size_t read_only_size, size_t read_write_size,
+                      size_t misc_data_size, size_t misc_code_size) {
+  _name = name;
+  _init_size = init_size;
+
+  if (UseSharedSpaces || DumpSharedSpaces) {
+    _enable_shared_spaces = true;
+    if (UseSharedSpaces) {
+      // Override shared space sizes from those in the file.
+      FileMapInfo* mapinfo = FileMapInfo::current_info();
+      _read_only_size = mapinfo->space_capacity(CompactingPermGenGen::ro);
+      _read_write_size = mapinfo->space_capacity(CompactingPermGenGen::rw);
+      _misc_data_size = mapinfo->space_capacity(CompactingPermGenGen::md);
+      _misc_code_size = mapinfo->space_capacity(CompactingPermGenGen::mc);
+    } else {
+      _read_only_size = read_only_size;
+      _read_write_size = read_write_size;
+      _misc_data_size = misc_data_size;
+      _misc_code_size = misc_code_size;
+    }
+  } else {
+    _enable_shared_spaces = false;
+    _read_only_size = 0;
+    _read_write_size = 0;
+    _misc_data_size = 0;
+    _misc_code_size = 0;
+  }
+
+  _max_size = max_size;
+}
+
+
+PermGen* PermanentGenerationSpec::init(ReservedSpace rs,
+                                       size_t init_size,
+                                       GenRemSet *remset) {
+
+  // Break the reserved spaces into pieces for the permanent space
+  // and the shared spaces.
+  ReservedSpace perm_rs = rs.first_part(_max_size, UseSharedSpaces,
+                                        UseSharedSpaces);
+  ReservedSpace shared_rs = rs.last_part(_max_size);
+
+  if (enable_shared_spaces()) {
+    if (!perm_rs.is_reserved() ||
+        perm_rs.base() + perm_rs.size() != shared_rs.base()) {
+      FileMapInfo* mapinfo = FileMapInfo::current_info();
+      mapinfo->fail_continue("Sharing disabled - unable to "
+                                 "reserve address space.");
+      shared_rs.release();
+      disable_sharing();
+    }
+  }
+
+  switch (name()) {
+    case PermGen::MarkSweepCompact:
+      return new CompactingPermGen(perm_rs, shared_rs, init_size, remset, this);
+
+#ifndef SERIALGC
+    case PermGen::MarkSweep:
+      guarantee(false, "NYI");
+      return NULL;
+
+    case PermGen::ConcurrentMarkSweep: {
+      assert(UseConcMarkSweepGC, "UseConcMarkSweepGC should be set");
+      CardTableRS* ctrs = remset->as_CardTableRS();
+      if (ctrs == NULL) {
+        vm_exit_during_initialization("RemSet/generation incompatibility.");
+      }
+      // XXXPERM
+      return new CMSPermGen(perm_rs, init_size, ctrs,
+                   (FreeBlockDictionary::DictionaryChoice)CMSDictionaryChoice);
+    }
+#endif // SERIALGC
+    default:
+      guarantee(false, "unrecognized GenerationName");
+      return NULL;
+  }
+}
+
+
+// Alignment
+void PermanentGenerationSpec::align(size_t alignment) {
+  _init_size       = align_size_up(_init_size,       alignment);
+  _max_size        = align_size_up(_max_size,        alignment);
+  _read_only_size  = align_size_up(_read_only_size,  alignment);
+  _read_write_size = align_size_up(_read_write_size, alignment);
+  _misc_data_size  = align_size_up(_misc_data_size,  alignment);
+  _misc_code_size  = align_size_up(_misc_code_size,  alignment);
+
+  assert(enable_shared_spaces() || (_read_only_size + _read_write_size == 0),
+         "Shared space when disabled?");
+}