src/share/vm/oops/klassKlass.cpp

Wed, 02 Feb 2011 11:35:26 -0500

author
bobv
date
Wed, 02 Feb 2011 11:35:26 -0500
changeset 2508
b92c45f2bc75
parent 2497
3582bf76420e
child 2534
e5383553fd4e
permissions
-rw-r--r--

7016023: Enable building ARM and PPC from src/closed repository
Reviewed-by: dholmes, bdelsart

     1 /*
     2  * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.
     8  *
     9  * This code is distributed in the hope that it will be useful, but WITHOUT
    10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    12  * version 2 for more details (a copy is included in the LICENSE file that
    13  * accompanied this code).
    14  *
    15  * You should have received a copy of the GNU General Public License version
    16  * 2 along with this work; if not, write to the Free Software Foundation,
    17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    18  *
    19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    20  * or visit www.oracle.com if you need additional information or have any
    21  * questions.
    22  *
    23  */
    25 #include "precompiled.hpp"
    26 #include "gc_implementation/shared/markSweep.inline.hpp"
    27 #include "gc_interface/collectedHeap.hpp"
    28 #include "gc_interface/collectedHeap.inline.hpp"
    29 #include "memory/oopFactory.hpp"
    30 #include "memory/permGen.hpp"
    31 #include "oops/constantPoolKlass.hpp"
    32 #include "oops/instanceKlass.hpp"
    33 #include "oops/instanceOop.hpp"
    34 #include "oops/klassKlass.hpp"
    35 #include "oops/klassOop.hpp"
    36 #include "oops/methodKlass.hpp"
    37 #include "oops/objArrayKlass.hpp"
    38 #include "oops/oop.inline.hpp"
    39 #include "oops/oop.inline2.hpp"
    40 #include "oops/symbol.hpp"
    41 #include "oops/typeArrayKlass.hpp"
    42 #include "runtime/handles.inline.hpp"
    43 #ifndef SERIALGC
    44 #include "oops/oop.pcgc.inline.hpp"
    45 #endif
    47 int klassKlass::oop_size(oop obj) const {
    48   assert (obj->is_klass(), "must be a klassOop");
    49   return klassOop(obj)->klass_part()->klass_oop_size();
    50 }
    52 klassOop klassKlass::create_klass(TRAPS) {
    53   KlassHandle h_this_klass;
    54   klassKlass o;
    55   // for bootstrapping, handles may not be available yet.
    56   klassOop k = base_create_klass_oop(h_this_klass, header_size(), o.vtbl_value(), CHECK_NULL);
    57   k->set_klass(k); // point to thyself
    58   // Do not try to allocate mirror, java.lang.Class not loaded at this point.
    59   // See Universe::fixup_mirrors()
    60   return k;
    61 }
    63 void klassKlass::oop_follow_contents(oop obj) {
    64   Klass* k = Klass::cast(klassOop(obj));
    65   // If we are alive it is valid to keep our superclass and subtype caches alive
    66   MarkSweep::mark_and_push(k->adr_super());
    67   for (juint i = 0; i < Klass::primary_super_limit(); i++)
    68     MarkSweep::mark_and_push(k->adr_primary_supers()+i);
    69   MarkSweep::mark_and_push(k->adr_secondary_super_cache());
    70   MarkSweep::mark_and_push(k->adr_secondary_supers());
    71   MarkSweep::mark_and_push(k->adr_java_mirror());
    72   // We follow the subklass and sibling links at the end of the
    73   // marking phase, since otherwise following them will prevent
    74   // class unloading (all classes are transitively linked from
    75   // java.lang.Object).
    76   MarkSweep::revisit_weak_klass_link(k);
    77   obj->follow_header();
    78 }
    80 #ifndef SERIALGC
    81 void klassKlass::oop_follow_contents(ParCompactionManager* cm,
    82                                      oop obj) {
    83   Klass* k = Klass::cast(klassOop(obj));
    84   // If we are alive it is valid to keep our superclass and subtype caches alive
    85   PSParallelCompact::mark_and_push(cm, k->adr_super());
    86   for (juint i = 0; i < Klass::primary_super_limit(); i++)
    87     PSParallelCompact::mark_and_push(cm, k->adr_primary_supers()+i);
    88   PSParallelCompact::mark_and_push(cm, k->adr_secondary_super_cache());
    89   PSParallelCompact::mark_and_push(cm, k->adr_secondary_supers());
    90   PSParallelCompact::mark_and_push(cm, k->adr_java_mirror());
    91   // We follow the subklass and sibling links at the end of the
    92   // marking phase, since otherwise following them will prevent
    93   // class unloading (all classes are transitively linked from
    94   // java.lang.Object).
    95   PSParallelCompact::revisit_weak_klass_link(cm, k);
    96   obj->follow_header(cm);
    97 }
    98 #endif // SERIALGC
   100 int klassKlass::oop_oop_iterate(oop obj, OopClosure* blk) {
   101   // Get size before changing pointers
   102   int size = oop_size(obj);
   103   Klass* k = Klass::cast(klassOop(obj));
   104   blk->do_oop(k->adr_super());
   105   for (juint i = 0; i < Klass::primary_super_limit(); i++)
   106     blk->do_oop(k->adr_primary_supers()+i);
   107   blk->do_oop(k->adr_secondary_super_cache());
   108   blk->do_oop(k->adr_secondary_supers());
   109   blk->do_oop(k->adr_java_mirror());
   110   // The following are in the perm gen and are treated
   111   // specially in a later phase of a perm gen collection; ...
   112   assert(oop(k)->is_perm(), "should be in perm");
   113   assert(oop(k->subklass())->is_perm_or_null(), "should be in perm");
   114   assert(oop(k->next_sibling())->is_perm_or_null(), "should be in perm");
   115   // ... don't scan them normally, but remember this klassKlass
   116   // for later (see, for instance, oop_follow_contents above
   117   // for what MarkSweep does with it.
   118   if (blk->should_remember_klasses()) {
   119     blk->remember_klass(k);
   120   }
   121   obj->oop_iterate_header(blk);
   122   return size;
   123 }
   126 int klassKlass::oop_oop_iterate_m(oop obj, OopClosure* blk, MemRegion mr) {
   127   // Get size before changing pointers
   128   int size = oop_size(obj);
   129   Klass* k = Klass::cast(klassOop(obj));
   130   oop* adr;
   131   adr = k->adr_super();
   132   if (mr.contains(adr)) blk->do_oop(adr);
   133   for (juint i = 0; i < Klass::primary_super_limit(); i++) {
   134     adr = k->adr_primary_supers()+i;
   135     if (mr.contains(adr)) blk->do_oop(adr);
   136   }
   137   adr = k->adr_secondary_super_cache();
   138   if (mr.contains(adr)) blk->do_oop(adr);
   139   adr = k->adr_secondary_supers();
   140   if (mr.contains(adr)) blk->do_oop(adr);
   141   adr = k->adr_java_mirror();
   142   if (mr.contains(adr)) blk->do_oop(adr);
   143   // The following are "weak links" in the perm gen and are
   144   // treated specially in a later phase of a perm gen collection.
   145   assert(oop(k)->is_perm(), "should be in perm");
   146   assert(oop(k->adr_subklass())->is_perm(), "should be in perm");
   147   assert(oop(k->adr_next_sibling())->is_perm(), "should be in perm");
   148   if (blk->should_remember_klasses()
   149       && (mr.contains(k->adr_subklass())
   150           || mr.contains(k->adr_next_sibling()))) {
   151     blk->remember_klass(k);
   152   }
   153   obj->oop_iterate_header(blk, mr);
   154   return size;
   155 }
   158 int klassKlass::oop_adjust_pointers(oop obj) {
   159   // Get size before changing pointers
   160   int size = oop_size(obj);
   161   obj->adjust_header();
   163   Klass* k = Klass::cast(klassOop(obj));
   165   MarkSweep::adjust_pointer(k->adr_super());
   166   for (juint i = 0; i < Klass::primary_super_limit(); i++)
   167     MarkSweep::adjust_pointer(k->adr_primary_supers()+i);
   168   MarkSweep::adjust_pointer(k->adr_secondary_super_cache());
   169   MarkSweep::adjust_pointer(k->adr_secondary_supers());
   170   MarkSweep::adjust_pointer(k->adr_java_mirror());
   171   MarkSweep::adjust_pointer(k->adr_subklass());
   172   MarkSweep::adjust_pointer(k->adr_next_sibling());
   173   return size;
   174 }
   176 #ifndef SERIALGC
   177 void klassKlass::oop_push_contents(PSPromotionManager* pm, oop obj) {
   178 }
   180 int klassKlass::oop_update_pointers(ParCompactionManager* cm, oop obj) {
   181   Klass* k = Klass::cast(klassOop(obj));
   183   oop* const beg_oop = k->oop_block_beg();
   184   oop* const end_oop = k->oop_block_end();
   185   for (oop* cur_oop = beg_oop; cur_oop < end_oop; ++cur_oop) {
   186     PSParallelCompact::adjust_pointer(cur_oop);
   187   }
   189   return oop_size(obj);
   190 }
   192 int klassKlass::oop_update_pointers(ParCompactionManager* cm, oop obj,
   193                                     HeapWord* beg_addr, HeapWord* end_addr) {
   194   Klass* k = Klass::cast(klassOop(obj));
   196   oop* const beg_oop = MAX2((oop*)beg_addr, k->oop_block_beg());
   197   oop* const end_oop = MIN2((oop*)end_addr, k->oop_block_end());
   198   for (oop* cur_oop = beg_oop; cur_oop < end_oop; ++cur_oop) {
   199     PSParallelCompact::adjust_pointer(cur_oop);
   200   }
   202   return oop_size(obj);
   203 }
   204 #endif // SERIALGC
   207 // Printing
   209 void klassKlass::oop_print_on(oop obj, outputStream* st) {
   210   Klass::oop_print_on(obj, st);
   211 }
   213 void klassKlass::oop_print_value_on(oop obj, outputStream* st) {
   214   Klass::oop_print_value_on(obj, st);
   215 }
   217 const char* klassKlass::internal_name() const {
   218   return "{other class}";
   219 }
   222 // Verification
   224 void klassKlass::oop_verify_on(oop obj, outputStream* st) {
   225   Klass::oop_verify_on(obj, st);
   226   guarantee(obj->is_perm(),                      "should be in permspace");
   227   guarantee(obj->is_klass(),                     "should be klass");
   229   Klass* k = Klass::cast(klassOop(obj));
   230   if (k->super() != NULL) {
   231     guarantee(k->super()->is_perm(),             "should be in permspace");
   232     guarantee(k->super()->is_klass(),            "should be klass");
   233   }
   234   klassOop ko = k->secondary_super_cache();
   235   if( ko != NULL ) {
   236     guarantee(ko->is_perm(),                     "should be in permspace");
   237     guarantee(ko->is_klass(),                    "should be klass");
   238   }
   239   for( uint i = 0; i < primary_super_limit(); i++ ) {
   240     oop ko = k->adr_primary_supers()[i]; // Cannot use normal accessor because it asserts
   241     if( ko != NULL ) {
   242       guarantee(ko->is_perm(),                   "should be in permspace");
   243       guarantee(ko->is_klass(),                  "should be klass");
   244     }
   245   }
   247   if (k->java_mirror() != NULL || (k->oop_is_instance() && instanceKlass::cast(klassOop(obj))->is_loaded())) {
   248     guarantee(k->java_mirror() != NULL,          "should be allocated");
   249     guarantee(k->java_mirror()->is_perm(),       "should be in permspace");
   250     guarantee(k->java_mirror()->is_instance(),   "should be instance");
   251   }
   252 }

mercurial