hotspot/src/share/vm/memory/metaspaceCounters.cpp
changeset 19322 e35f9ed4f081
parent 17109 90e6c31bbbe4
child 19979 ebe1dbb6e1aa
equal deleted inserted replaced
19320:fc08f2a0c5af 19322:e35f9ed4f081
    23  */
    23  */
    24 
    24 
    25 #include "precompiled.hpp"
    25 #include "precompiled.hpp"
    26 #include "memory/metaspaceCounters.hpp"
    26 #include "memory/metaspaceCounters.hpp"
    27 #include "memory/resourceArea.hpp"
    27 #include "memory/resourceArea.hpp"
       
    28 #include "runtime/globals.hpp"
       
    29 #include "runtime/perfData.hpp"
    28 #include "utilities/exceptions.hpp"
    30 #include "utilities/exceptions.hpp"
    29 
    31 
    30 MetaspaceCounters* MetaspaceCounters::_metaspace_counters = NULL;
    32 class MetaspacePerfCounters: public CHeapObj<mtInternal> {
       
    33   friend class VMStructs;
       
    34   PerfVariable*      _capacity;
       
    35   PerfVariable*      _used;
       
    36   PerfVariable*      _max_capacity;
    31 
    37 
    32 size_t MetaspaceCounters::calc_total_capacity() {
    38   PerfVariable* create_variable(const char *ns, const char *name, size_t value, TRAPS) {
       
    39     const char *path = PerfDataManager::counter_name(ns, name);
       
    40     return PerfDataManager::create_variable(SUN_GC, path, PerfData::U_Bytes, value, THREAD);
       
    41   }
       
    42 
       
    43   void create_constant(const char *ns, const char *name, size_t value, TRAPS) {
       
    44     const char *path = PerfDataManager::counter_name(ns, name);
       
    45     PerfDataManager::create_constant(SUN_GC, path, PerfData::U_Bytes, value, THREAD);
       
    46   }
       
    47 
       
    48  public:
       
    49   MetaspacePerfCounters(const char* ns, size_t min_capacity, size_t curr_capacity, size_t max_capacity, size_t used) {
       
    50     EXCEPTION_MARK;
       
    51     ResourceMark rm;
       
    52 
       
    53     create_constant(ns, "minCapacity", min_capacity, THREAD);
       
    54     _capacity = create_variable(ns, "capacity", curr_capacity, THREAD);
       
    55     _max_capacity = create_variable(ns, "maxCapacity", max_capacity, THREAD);
       
    56     _used = create_variable(ns, "used", used, THREAD);
       
    57   }
       
    58 
       
    59   void update(size_t capacity, size_t max_capacity, size_t used) {
       
    60     _capacity->set_value(capacity);
       
    61     _max_capacity->set_value(max_capacity);
       
    62     _used->set_value(used);
       
    63   }
       
    64 };
       
    65 
       
    66 MetaspacePerfCounters* MetaspaceCounters::_perf_counters = NULL;
       
    67 
       
    68 size_t MetaspaceCounters::calculate_capacity() {
    33   // The total capacity is the sum of
    69   // The total capacity is the sum of
    34   //   1) capacity of Metachunks in use by all Metaspaces
    70   //   1) capacity of Metachunks in use by all Metaspaces
    35   //   2) unused space at the end of each Metachunk
    71   //   2) unused space at the end of each Metachunk
    36   //   3) space in the freelist
    72   //   3) space in the freelist
    37   size_t total_capacity = MetaspaceAux::allocated_capacity_bytes()
    73   size_t total_capacity = MetaspaceAux::allocated_capacity_bytes()
    38     + MetaspaceAux::free_bytes() + MetaspaceAux::free_chunks_total_in_bytes();
    74     + MetaspaceAux::free_bytes() + MetaspaceAux::free_chunks_total_in_bytes();
    39   return total_capacity;
    75   return total_capacity;
    40 }
    76 }
    41 
    77 
    42 MetaspaceCounters::MetaspaceCounters() :
    78 void MetaspaceCounters::initialize_performance_counters() {
    43     _capacity(NULL),
       
    44     _used(NULL),
       
    45     _max_capacity(NULL) {
       
    46   if (UsePerfData) {
    79   if (UsePerfData) {
       
    80     assert(_perf_counters == NULL, "Should only be initialized once");
       
    81 
    47     size_t min_capacity = MetaspaceAux::min_chunk_size();
    82     size_t min_capacity = MetaspaceAux::min_chunk_size();
       
    83     size_t capacity = calculate_capacity();
    48     size_t max_capacity = MetaspaceAux::reserved_in_bytes();
    84     size_t max_capacity = MetaspaceAux::reserved_in_bytes();
    49     size_t curr_capacity = calc_total_capacity();
       
    50     size_t used = MetaspaceAux::allocated_used_bytes();
    85     size_t used = MetaspaceAux::allocated_used_bytes();
    51 
    86 
    52     initialize(min_capacity, max_capacity, curr_capacity, used);
    87     _perf_counters = new MetaspacePerfCounters("metaspace", min_capacity, capacity, max_capacity, used);
    53   }
       
    54 }
       
    55 
       
    56 static PerfVariable* create_ms_variable(const char *ns,
       
    57                                         const char *name,
       
    58                                         size_t value,
       
    59                                         TRAPS) {
       
    60   const char *path = PerfDataManager::counter_name(ns, name);
       
    61   PerfVariable *result =
       
    62       PerfDataManager::create_variable(SUN_GC, path, PerfData::U_Bytes, value,
       
    63                                        CHECK_NULL);
       
    64   return result;
       
    65 }
       
    66 
       
    67 static void create_ms_constant(const char *ns,
       
    68                                const char *name,
       
    69                                size_t value,
       
    70                                TRAPS) {
       
    71   const char *path = PerfDataManager::counter_name(ns, name);
       
    72   PerfDataManager::create_constant(SUN_GC, path, PerfData::U_Bytes, value, CHECK);
       
    73 }
       
    74 
       
    75 void MetaspaceCounters::initialize(size_t min_capacity,
       
    76                                    size_t max_capacity,
       
    77                                    size_t curr_capacity,
       
    78                                    size_t used) {
       
    79 
       
    80   if (UsePerfData) {
       
    81     EXCEPTION_MARK;
       
    82     ResourceMark rm;
       
    83 
       
    84     const char *ms = "metaspace";
       
    85 
       
    86     create_ms_constant(ms, "minCapacity", min_capacity, CHECK);
       
    87     _max_capacity = create_ms_variable(ms, "maxCapacity", max_capacity, CHECK);
       
    88     _capacity = create_ms_variable(ms, "capacity", curr_capacity, CHECK);
       
    89     _used = create_ms_variable(ms, "used", used, CHECK);
       
    90   }
       
    91 }
       
    92 
       
    93 void MetaspaceCounters::update_capacity() {
       
    94   assert(UsePerfData, "Should not be called unless being used");
       
    95   size_t total_capacity = calc_total_capacity();
       
    96   _capacity->set_value(total_capacity);
       
    97 }
       
    98 
       
    99 void MetaspaceCounters::update_used() {
       
   100   assert(UsePerfData, "Should not be called unless being used");
       
   101   size_t used_in_bytes = MetaspaceAux::allocated_used_bytes();
       
   102   _used->set_value(used_in_bytes);
       
   103 }
       
   104 
       
   105 void MetaspaceCounters::update_max_capacity() {
       
   106   assert(UsePerfData, "Should not be called unless being used");
       
   107   assert(_max_capacity != NULL, "Should be initialized");
       
   108   size_t reserved_in_bytes = MetaspaceAux::reserved_in_bytes();
       
   109   _max_capacity->set_value(reserved_in_bytes);
       
   110 }
       
   111 
       
   112 void MetaspaceCounters::update_all() {
       
   113   if (UsePerfData) {
       
   114     update_used();
       
   115     update_capacity();
       
   116     update_max_capacity();
       
   117   }
       
   118 }
       
   119 
       
   120 void MetaspaceCounters::initialize_performance_counters() {
       
   121   if (UsePerfData) {
       
   122     assert(_metaspace_counters == NULL, "Should only be initialized once");
       
   123     _metaspace_counters = new MetaspaceCounters();
       
   124   }
    88   }
   125 }
    89 }
   126 
    90 
   127 void MetaspaceCounters::update_performance_counters() {
    91 void MetaspaceCounters::update_performance_counters() {
   128   if (UsePerfData) {
    92   if (UsePerfData) {
   129     assert(_metaspace_counters != NULL, "Should be initialized");
    93     assert(_perf_counters != NULL, "Should be initialized");
   130     _metaspace_counters->update_all();
    94 
       
    95     size_t capacity = calculate_capacity();
       
    96     size_t max_capacity = MetaspaceAux::reserved_in_bytes();
       
    97     size_t used = MetaspaceAux::allocated_used_bytes();
       
    98 
       
    99     _perf_counters->update(capacity, max_capacity, used);
   131   }
   100   }
   132 }
   101 }
   133 
   102 
       
   103 MetaspacePerfCounters* CompressedClassSpaceCounters::_perf_counters = NULL;
       
   104 
       
   105 size_t CompressedClassSpaceCounters::calculate_capacity() {
       
   106     return MetaspaceAux::allocated_capacity_bytes(_class_type) +
       
   107            MetaspaceAux::free_bytes(_class_type) +
       
   108            MetaspaceAux::free_chunks_total_in_bytes(_class_type);
       
   109 }
       
   110 
       
   111 void CompressedClassSpaceCounters::update_performance_counters() {
       
   112   if (UsePerfData && UseCompressedKlassPointers) {
       
   113     assert(_perf_counters != NULL, "Should be initialized");
       
   114 
       
   115     size_t capacity = calculate_capacity();
       
   116     size_t max_capacity = MetaspaceAux::reserved_in_bytes(_class_type);
       
   117     size_t used = MetaspaceAux::allocated_used_bytes(_class_type);
       
   118 
       
   119     _perf_counters->update(capacity, max_capacity, used);
       
   120   }
       
   121 }
       
   122 
       
   123 void CompressedClassSpaceCounters::initialize_performance_counters() {
       
   124   if (UsePerfData) {
       
   125     assert(_perf_counters == NULL, "Should only be initialized once");
       
   126     const char* ns = "compressedclassspace";
       
   127 
       
   128     if (UseCompressedKlassPointers) {
       
   129       size_t min_capacity = MetaspaceAux::min_chunk_size();
       
   130       size_t capacity = calculate_capacity();
       
   131       size_t max_capacity = MetaspaceAux::reserved_in_bytes(_class_type);
       
   132       size_t used = MetaspaceAux::allocated_used_bytes(_class_type);
       
   133 
       
   134       _perf_counters = new MetaspacePerfCounters(ns, min_capacity, capacity, max_capacity, used);
       
   135     } else {
       
   136       _perf_counters = new MetaspacePerfCounters(ns, 0, 0, 0, 0);
       
   137     }
       
   138   }
       
   139 }