1 /* |
1 /* |
2 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. |
2 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * |
4 * |
5 * This code is free software; you can redistribute it and/or modify it |
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 |
6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. |
7 * published by the Free Software Foundation. |
32 #include "gc_interface/collectedHeap.inline.hpp" |
32 #include "gc_interface/collectedHeap.inline.hpp" |
33 #include "interpreter/oopMapCache.hpp" |
33 #include "interpreter/oopMapCache.hpp" |
34 #include "interpreter/rewriter.hpp" |
34 #include "interpreter/rewriter.hpp" |
35 #include "jvmtifiles/jvmti.h" |
35 #include "jvmtifiles/jvmti.h" |
36 #include "memory/genOopClosures.inline.hpp" |
36 #include "memory/genOopClosures.inline.hpp" |
|
37 #include "memory/heapInspection.hpp" |
37 #include "memory/metadataFactory.hpp" |
38 #include "memory/metadataFactory.hpp" |
38 #include "memory/oopFactory.hpp" |
39 #include "memory/oopFactory.hpp" |
39 #include "oops/fieldStreams.hpp" |
40 #include "oops/fieldStreams.hpp" |
40 #include "oops/instanceClassLoaderKlass.hpp" |
41 #include "oops/instanceClassLoaderKlass.hpp" |
41 #include "oops/instanceKlass.hpp" |
42 #include "oops/instanceKlass.hpp" |
2958 |
2959 |
2959 const char* InstanceKlass::internal_name() const { |
2960 const char* InstanceKlass::internal_name() const { |
2960 return external_name(); |
2961 return external_name(); |
2961 } |
2962 } |
2962 |
2963 |
|
2964 #if INCLUDE_SERVICES |
|
2965 // Size Statistics |
|
2966 void InstanceKlass::collect_statistics(KlassSizeStats *sz) const { |
|
2967 Klass::collect_statistics(sz); |
|
2968 |
|
2969 sz->_inst_size = HeapWordSize * size_helper(); |
|
2970 sz->_vtab_bytes = HeapWordSize * align_object_offset(vtable_length()); |
|
2971 sz->_itab_bytes = HeapWordSize * align_object_offset(itable_length()); |
|
2972 sz->_nonstatic_oopmap_bytes = HeapWordSize * |
|
2973 ((is_interface() || is_anonymous()) ? |
|
2974 align_object_offset(nonstatic_oop_map_size()) : |
|
2975 nonstatic_oop_map_size()); |
|
2976 |
|
2977 int n = 0; |
|
2978 n += (sz->_methods_array_bytes = sz->count_array(methods())); |
|
2979 n += (sz->_method_ordering_bytes = sz->count_array(method_ordering())); |
|
2980 n += (sz->_local_interfaces_bytes = sz->count_array(local_interfaces())); |
|
2981 n += (sz->_transitive_interfaces_bytes = sz->count_array(transitive_interfaces())); |
|
2982 n += (sz->_signers_bytes = sz->count_array(signers())); |
|
2983 n += (sz->_fields_bytes = sz->count_array(fields())); |
|
2984 n += (sz->_inner_classes_bytes = sz->count_array(inner_classes())); |
|
2985 sz->_ro_bytes += n; |
|
2986 |
|
2987 const ConstantPool* cp = constants(); |
|
2988 if (cp) { |
|
2989 cp->collect_statistics(sz); |
|
2990 } |
|
2991 |
|
2992 const Annotations* anno = annotations(); |
|
2993 if (anno) { |
|
2994 anno->collect_statistics(sz); |
|
2995 } |
|
2996 |
|
2997 const Array<Method*>* methods_array = methods(); |
|
2998 if (methods()) { |
|
2999 for (int i = 0; i < methods_array->length(); i++) { |
|
3000 Method* method = methods_array->at(i); |
|
3001 if (method) { |
|
3002 sz->_method_count ++; |
|
3003 method->collect_statistics(sz); |
|
3004 } |
|
3005 } |
|
3006 } |
|
3007 } |
|
3008 #endif // INCLUDE_SERVICES |
|
3009 |
2963 // Verification |
3010 // Verification |
2964 |
3011 |
2965 class VerifyFieldClosure: public OopClosure { |
3012 class VerifyFieldClosure: public OopClosure { |
2966 protected: |
3013 protected: |
2967 template <class T> void do_oop_work(T* p) { |
3014 template <class T> void do_oop_work(T* p) { |