diff src/share/vm/memory/allocation.cpp @ 6725:da91efe96a93

6964458: Reimplement class meta-data storage to use native memory Summary: Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland Contributed-by: jmasa <jon.masamitsu@oracle.com>, stefank <stefan.karlsson@oracle.com>, mgerdin <mikael.gerdin@oracle.com>, never <tom.rodriguez@oracle.com>
author coleenp
date Sat, 01 Sep 2012 13:25:18 -0400
parents d2a62e0f25eb
children 7b5885dadbdc
line wrap: on
line diff
--- a/src/share/vm/memory/allocation.cpp	Fri Aug 31 16:39:35 2012 -0700
+++ b/src/share/vm/memory/allocation.cpp	Sat Sep 01 13:25:18 2012 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, Oracle and/or its affiliates. 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
@@ -25,7 +25,10 @@
 #include "precompiled.hpp"
 #include "memory/allocation.hpp"
 #include "memory/allocation.inline.hpp"
+#include "memory/genCollectedHeap.hpp"
+#include "memory/metaspaceShared.hpp"
 #include "memory/resourceArea.hpp"
+#include "memory/universe.hpp"
 #include "runtime/atomic.hpp"
 #include "runtime/os.hpp"
 #include "runtime/task.hpp"
@@ -51,6 +54,27 @@
 void* _ValueObj::operator new(size_t size)  { ShouldNotCallThis(); return 0; };
 void  _ValueObj::operator delete(void* p)   { ShouldNotCallThis(); };
 
+void* MetaspaceObj::operator new(size_t size, ClassLoaderData* loader_data,
+                                size_t word_size, bool read_only, TRAPS) {
+  // Klass has it's own operator new
+  return Metaspace::allocate(loader_data, word_size, read_only,
+                             Metaspace::NonClassType, CHECK_NULL);
+}
+
+bool MetaspaceObj::is_shared() const {
+  return MetaspaceShared::is_in_shared_space(this);
+}
+
+bool MetaspaceObj::is_metadata() const {
+  // ClassLoaderDataGraph::contains((address)this); has lock inversion problems
+  return !Universe::heap()->is_in_reserved(this);
+}
+
+void MetaspaceObj::print_address_on(outputStream* st) const {
+  st->print(" {"INTPTR_FORMAT"}", this);
+}
+
+
 void* ResourceObj::operator new(size_t size, allocation_type type, MEMFLAGS flags) {
   address res;
   switch (type) {