src/hotspot/share/code/codeHeapState.hpp
author lucy
Wed, 18 Apr 2018 21:10:09 -0700
changeset 49825 f909f09569ca
parent 49611 973c9504178e
child 51124 40ef1bb91ee8
permissions -rw-r--r--
8200450: Root cause analysis for JDK-8200366 Summary: add safeguard checks to make sure CodeBlob if fully initialized Reviewed-by: kvn
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
49611
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
     1
/*
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
     2
 * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
     3
 * Copyright (c) 2018 SAP SE. All rights reserved.
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
     4
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
     5
 *
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
     6
 * This code is free software; you can redistribute it and/or modify it
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
     7
 * under the terms of the GNU General Public License version 2 only, as
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
     8
 * published by the Free Software Foundation.
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
     9
 *
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    10
 * This code is distributed in the hope that it will be useful, but WITHOUT
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    11
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    12
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    13
 * version 2 for more details (a copy is included in the LICENSE file that
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    14
 * accompanied this code).
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    15
 *
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    16
 * You should have received a copy of the GNU General Public License version
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    17
 * 2 along with this work; if not, write to the Free Software Foundation,
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    18
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    19
 *
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    20
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    21
 * or visit www.oracle.com if you need additional information or have any
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    22
 * questions.
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    23
 *
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    24
 */
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    25
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    26
#ifndef SHARE_CODE_CODEHEAPSTATE_HPP
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    27
#define SHARE_CODE_CODEHEAPSTATE_HPP
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    28
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    29
#include "memory/heap.hpp"
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    30
#include "utilities/debug.hpp"
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    31
#include "utilities/globalDefinitions.hpp"
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    32
#include "utilities/ostream.hpp"
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    33
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    34
class CodeHeapState : public CHeapObj<mtCode> {
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    35
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    36
 public:
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    37
  enum compType {
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    38
    noComp = 0,     // must be! due to initialization by memset to zero
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    39
    c1,
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    40
    c2,
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    41
    jvmci,
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    42
    lastComp
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    43
  };
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    44
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    45
  enum blobType {
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    46
     noType = 0,         // must be! due to initialization by memset to zero
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    47
     // The nMethod_* values correspond 1:1 to the CompiledMethod enum values.
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    48
     nMethod_inuse,       // executable. This is the "normal" state for a nmethod.
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    49
     nMethod_notused,     // assumed inactive, marked not entrant. Could be revived if necessary.
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    50
     nMethod_notentrant,  // no new activations allowed, marked for deoptimization. Old activations may still exist.
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    51
                         // Will transition to "zombie" after all activations are gone.
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    52
     nMethod_zombie,      // No more activations exist, ready for purge (remove from code cache).
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    53
     nMethod_unloaded,    // No activations exist, should not be called. Transient state on the way to "zombie".
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    54
     nMethod_alive = nMethod_notentrant, // Combined state: nmethod may have activations, thus can't be purged.
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    55
     nMethod_dead  = nMethod_zombie,     // Combined state: nmethod does not have any activations.
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    56
     runtimeStub   = nMethod_unloaded + 1,
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    57
     ricochetStub,
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    58
     deoptimizationStub,
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    59
     uncommonTrapStub,
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    60
     exceptionStub,
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    61
     safepointStub,
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    62
     adapterBlob,
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    63
     mh_adapterBlob,
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    64
     bufferBlob,
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    65
     lastType
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    66
  };
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    67
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    68
 private:
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    69
  static void prepare_StatArray(outputStream* out, size_t nElem, size_t granularity, const char* heapName);
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    70
  static void prepare_FreeArray(outputStream* out, unsigned int nElem, const char* heapName);
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    71
  static void prepare_TopSizeArray(outputStream* out, unsigned int nElem, const char* heapName);
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    72
  static void prepare_SizeDistArray(outputStream* out, unsigned int nElem, const char* heapName);
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    73
  static void discard_StatArray(outputStream* out);
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    74
  static void discard_FreeArray(outputStream* out);
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    75
  static void discard_TopSizeArray(outputStream* out);
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    76
  static void discard_SizeDistArray(outputStream* out);
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    77
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    78
  static void update_SizeDistArray(outputStream* out, unsigned int len);
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    79
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    80
  static const char* get_heapName(CodeHeap* heap);
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    81
  static unsigned int findHeapIndex(outputStream* out, const char* heapName);
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    82
  static void get_HeapStatGlobals(outputStream* out, const char* heapName);
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    83
  static void set_HeapStatGlobals(outputStream* out, const char* heapName);
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    84
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    85
  static void printBox(outputStream* out, const char border, const char* text1, const char* text2);
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    86
  static void print_blobType_legend(outputStream* out);
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    87
  static void print_space_legend(outputStream* out);
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    88
  static void print_age_legend(outputStream* out);
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    89
  static void print_blobType_single(outputStream *ast, u2 /* blobType */ type);
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    90
  static void print_count_single(outputStream *ast, unsigned short count);
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    91
  static void print_space_single(outputStream *ast, unsigned short space);
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    92
  static void print_age_single(outputStream *ast, unsigned int age);
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    93
  static void print_line_delim(outputStream* out, bufferedStream *sst, char* low_bound, unsigned int ix, unsigned int gpl);
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    94
  static void print_line_delim(outputStream* out, outputStream *sst, char* low_bound, unsigned int ix, unsigned int gpl);
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    95
  static blobType get_cbType(CodeBlob* cb);
49825
f909f09569ca 8200450: Root cause analysis for JDK-8200366
lucy
parents: 49611
diff changeset
    96
  static bool is_readable_pointer(const void* p);
49611
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    97
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    98
 public:
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
    99
  static void discard(outputStream* out, CodeHeap* heap);
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   100
  static void aggregate(outputStream* out, CodeHeap* heap, const char* granularity);
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   101
  static void print_usedSpace(outputStream* out, CodeHeap* heap);
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   102
  static void print_freeSpace(outputStream* out, CodeHeap* heap);
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   103
  static void print_count(outputStream* out, CodeHeap* heap);
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   104
  static void print_space(outputStream* out, CodeHeap* heap);
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   105
  static void print_age(outputStream* out, CodeHeap* heap);
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   106
  static void print_names(outputStream* out, CodeHeap* heap);
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   107
};
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   108
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   109
//----------------
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   110
//  StatElement
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   111
//----------------
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   112
//  Each analysis granule is represented by an instance of
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   113
//  this StatElement struct. It collects and aggregates all
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   114
//  information describing the allocated contents of the granule.
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   115
//  Free (unallocated) contents is not considered (see FreeBlk for that).
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   116
//  All StatElements of a heap segment are stored in the related StatArray.
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   117
//  Current size: 40 bytes + 8 bytes class header.
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   118
class StatElement : public CHeapObj<mtCode> {
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   119
  public:
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   120
    // A note on ages: The compilation_id easily overflows unsigned short in large systems
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   121
    unsigned int       t1_age;      // oldest compilation_id of tier1 nMethods.
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   122
    unsigned int       t2_age;      // oldest compilation_id of tier2 nMethods.
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   123
    unsigned int       tx_age;      // oldest compilation_id of inactive/not entrant nMethods.
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   124
    unsigned short     t1_space;    // in units of _segment_size to "prevent" overflow
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   125
    unsigned short     t2_space;    // in units of _segment_size to "prevent" overflow
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   126
    unsigned short     tx_space;    // in units of _segment_size to "prevent" overflow
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   127
    unsigned short     dead_space;  // in units of _segment_size to "prevent" overflow
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   128
    unsigned short     stub_space;  // in units of _segment_size to "prevent" overflow
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   129
    unsigned short     t1_count;
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   130
    unsigned short     t2_count;
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   131
    unsigned short     tx_count;
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   132
    unsigned short     dead_count;
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   133
    unsigned short     stub_count;
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   134
    CompLevel          level;       // optimization level (see globalDefinitions.hpp)
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   135
    //---<  replaced the correct enum typing with u2 to save space.
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   136
    u2                 compiler;    // compiler which generated this blob. Type is CodeHeapState::compType
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   137
    u2                 type;        // used only if granularity == segment_size. Type is CodeHeapState::blobType
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   138
};
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   139
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   140
//-----------
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   141
//  FreeBlk
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   142
//-----------
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   143
//  Each free block in the code heap is represented by an instance
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   144
//  of this FreeBlk struct. It collects all information we need to
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   145
//  know about each free block.
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   146
//  All FreeBlks of a heap segment are stored in the related FreeArray.
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   147
struct FreeBlk : public CHeapObj<mtCode> {
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   148
  HeapBlock*     start;       // address of free block
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   149
  unsigned int   len;          // length of free block
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   150
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   151
  unsigned int   gap;          // gap to next free block
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   152
  unsigned int   index;        // sequential number of free block
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   153
  unsigned short n_gapBlocks;  // # used blocks in gap
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   154
  bool           stubs_in_gap; // The occupied space between this and the next free block contains (unmovable) stubs or blobs.
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   155
};
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   156
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   157
//--------------
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   158
//  TopSizeBlk
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   159
//--------------
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   160
//  The n largest blocks in the code heap are represented in an instance
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   161
//  of this TopSizeBlk struct. It collects all information we need to
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   162
//  know about those largest blocks.
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   163
//  All TopSizeBlks of a heap segment are stored in the related TopSizeArray.
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   164
struct TopSizeBlk : public CHeapObj<mtCode> {
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   165
  HeapBlock*     start;       // address of block
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   166
  unsigned int   len;          // length of block, in _segment_size units. Will never overflow int.
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   167
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   168
  unsigned int   index;        // ordering index, 0 is largest block
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   169
                               // contains array index of next smaller block
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   170
                               // -1 indicates end of list
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   171
  CompLevel      level;        // optimization level (see globalDefinitions.hpp)
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   172
  u2             compiler;     // compiler which generated this blob
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   173
  u2             type;         // blob type
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   174
};
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   175
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   176
//---------------------------
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   177
//  SizeDistributionElement
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   178
//---------------------------
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   179
//  During CodeHeap analysis, each allocated code block is associated with a
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   180
//  SizeDistributionElement according to its size. Later on, the array of
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   181
//  SizeDistributionElements is used to print a size distribution bar graph.
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   182
//  All SizeDistributionElements of a heap segment are stored in the related SizeDistributionArray.
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   183
struct SizeDistributionElement : public CHeapObj<mtCode> {
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   184
                               // Range is [rangeStart..rangeEnd).
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   185
  unsigned int   rangeStart;   // start of length range, in _segment_size units.
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   186
  unsigned int   rangeEnd;     // end   of length range, in _segment_size units.
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   187
  unsigned int   lenSum;       // length of block, in _segment_size units. Will never overflow int.
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   188
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   189
  unsigned int   count;        // number of blocks assigned to this range.
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   190
};
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   191
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   192
//----------------
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   193
//  CodeHeapStat
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   194
//----------------
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   195
//  Because we have to deal with multiple CodeHeaps, we need to
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   196
//  collect "global" information in a segment-specific way as well.
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   197
//  Thats what the CodeHeapStat and CodeHeapStatArray are used for.
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   198
//  Before a heap segment is processed, the contents of the CodeHeapStat
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   199
//  element is copied to the global variables (get_HeapStatGlobals).
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   200
//  When processing is done, the possibly modified global variables are
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   201
//  copied back (set_HeapStatGlobals) to the CodeHeapStat element.
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   202
struct CodeHeapStat {
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   203
    StatElement*                     StatArray;
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   204
    struct FreeBlk*                  FreeArray;
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   205
    struct TopSizeBlk*               TopSizeArray;
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   206
    struct SizeDistributionElement*  SizeDistributionArray;
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   207
    const char*                      heapName;
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   208
    size_t                           segment_size;
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   209
    // StatElement data
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   210
    size_t        alloc_granules;
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   211
    size_t        granule_size;
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   212
    bool          segment_granules;
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   213
    unsigned int  nBlocks_t1;
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   214
    unsigned int  nBlocks_t2;
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   215
    unsigned int  nBlocks_alive;
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   216
    unsigned int  nBlocks_dead;
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   217
    unsigned int  nBlocks_unloaded;
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   218
    unsigned int  nBlocks_stub;
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   219
    // FreeBlk data
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   220
    unsigned int  alloc_freeBlocks;
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   221
    // UsedBlk data
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   222
    unsigned int  alloc_topSizeBlocks;
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   223
    unsigned int  used_topSizeBlocks;
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   224
    // method hotness data. Temperature range is [-reset_val..+reset_val]
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   225
    int           avgTemp;
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   226
    int           maxTemp;
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   227
    int           minTemp;
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   228
};
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   229
973c9504178e 8198691: CodeHeap State Analytics
lucy
parents:
diff changeset
   230
#endif // SHARE_CODE_CODEHEAPSTATE_HPP