src/share/vm/services/memReporter.hpp

Wed, 27 Aug 2014 08:19:12 -0400

author
zgu
date
Wed, 27 Aug 2014 08:19:12 -0400
changeset 7074
833b0f92429a
parent 6198
55fb97c4c58d
child 7267
417e3b8d04c5
permissions
-rw-r--r--

8046598: Scalable Native memory tracking development
Summary: Enhance scalability of native memory tracking
Reviewed-by: coleenp, ctornqvi, gtriantafill

     1 /*
     2  * Copyright (c) 2012, 2014, 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 #ifndef SHARE_VM_SERVICES_MEM_REPORTER_HPP
    26 #define SHARE_VM_SERVICES_MEM_REPORTER_HPP
    28 #if INCLUDE_NMT
    30 #include "oops/instanceKlass.hpp"
    31 #include "services/memBaseline.hpp"
    32 #include "services/nmtCommon.hpp"
    33 #include "services/mallocTracker.hpp"
    34 #include "services/virtualMemoryTracker.hpp"
    36 /*
    37  * Base class that provides helpers
    38 */
    39 class MemReporterBase : public StackObj {
    40  private:
    41   size_t        _scale;  // report in this scale
    42   outputStream* _output; // destination
    44  public:
    45   MemReporterBase(outputStream* out = NULL, size_t scale = K)
    46     : _scale(scale) {
    47     _output = (out == NULL) ? tty : out;
    48   }
    50  protected:
    51   inline outputStream* output() const {
    52     return _output;
    53   }
    54   // Current reporting scale
    55   inline const char* current_scale() const {
    56     return NMTUtil::scale_name(_scale);
    57   }
    58   // Convert memory amount in bytes to current reporting scale
    59   inline size_t amount_in_current_scale(size_t amount) const {
    60     return NMTUtil::amount_in_scale(amount, _scale);
    61   }
    63   // Convert diff amount in bytes to current reporting scale
    64   inline long diff_in_current_scale(size_t s1, size_t s2) const {
    65     long amount = (long)(s1 - s2);
    66     long scale = (long)_scale;
    67     amount = (amount > 0) ? (amount + scale / 2) : (amount - scale / 2);
    68     return amount / scale;
    69   }
    71   // Helper functions
    72   // Calculate total reserved and committed amount
    73   size_t reserved_total(const MallocMemory* malloc, const VirtualMemory* vm) const;
    74   size_t committed_total(const MallocMemory* malloc, const VirtualMemory* vm) const;
    77   // Print summary total, malloc and virtual memory
    78   void print_total(size_t reserved, size_t committed) const;
    79   void print_malloc(size_t amount, size_t count) const;
    80   void print_virtual_memory(size_t reserved, size_t committed) const;
    82   void print_malloc_line(size_t amount, size_t count) const;
    83   void print_virtual_memory_line(size_t reserved, size_t committed) const;
    84   void print_arena_line(size_t amount, size_t count) const;
    86   void print_virtual_memory_region(const char* type, address base, size_t size) const;
    87 };
    89 /*
    90  * The class is for generating summary tracking report.
    91  */
    92 class MemSummaryReporter : public MemReporterBase {
    93  private:
    94   MallocMemorySnapshot*   _malloc_snapshot;
    95   VirtualMemorySnapshot*  _vm_snapshot;
    96   size_t                  _class_count;
    98  public:
    99   // Report summary tracking data from global snapshots directly.
   100   // This constructor is used for final reporting and hs_err reporting.
   101   MemSummaryReporter(MallocMemorySnapshot* malloc_snapshot,
   102     VirtualMemorySnapshot* vm_snapshot, outputStream* output,
   103     size_t class_count = 0, size_t scale = K) :
   104     MemReporterBase(output, scale),
   105     _malloc_snapshot(malloc_snapshot),
   106     _vm_snapshot(vm_snapshot) {
   107     if (class_count == 0) {
   108       _class_count = InstanceKlass::number_of_instance_classes();
   109     } else {
   110       _class_count = class_count;
   111     }
   112   }
   113   // This constructor is for normal reporting from a recent baseline.
   114   MemSummaryReporter(MemBaseline& baseline, outputStream* output,
   115     size_t scale = K) : MemReporterBase(output, scale),
   116     _malloc_snapshot(baseline.malloc_memory_snapshot()),
   117     _vm_snapshot(baseline.virtual_memory_snapshot()),
   118     _class_count(baseline.class_count()) { }
   121   // Generate summary report
   122   virtual void report();
   123  private:
   124   // Report summary for each memory type
   125   void report_summary_of_type(MEMFLAGS type, MallocMemory* malloc_memory,
   126     VirtualMemory* virtual_memory);
   127 };
   129 /*
   130  * The class is for generating detail tracking report.
   131  */
   132 class MemDetailReporter : public MemSummaryReporter {
   133  private:
   134   MemBaseline&   _baseline;
   136  public:
   137   MemDetailReporter(MemBaseline& baseline, outputStream* output, size_t scale = K) :
   138     MemSummaryReporter(baseline, output, scale),
   139      _baseline(baseline) { }
   141   // Generate detail report.
   142   // The report contains summary and detail sections.
   143   virtual void report() {
   144     MemSummaryReporter::report();
   145     report_virtual_memory_map();
   146     report_detail();
   147   }
   149  private:
   150   // Report detail tracking data.
   151   void report_detail();
   152   // Report virtual memory map
   153   void report_virtual_memory_map();
   154   // Report malloc allocation sites
   155   void report_malloc_sites();
   156   // Report virtual memory reservation sites
   157   void report_virtual_memory_allocation_sites();
   159   // Report a virtual memory region
   160   void report_virtual_memory_region(const ReservedMemoryRegion* rgn);
   161 };
   163 /*
   164  * The class is for generating summary comparison report.
   165  * It compares current memory baseline against an early baseline.
   166  */
   167 class MemSummaryDiffReporter : public MemReporterBase {
   168  protected:
   169   MemBaseline&      _early_baseline;
   170   MemBaseline&      _current_baseline;
   172  public:
   173   MemSummaryDiffReporter(MemBaseline& early_baseline, MemBaseline& current_baseline,
   174     outputStream* output, size_t scale = K) : MemReporterBase(output, scale),
   175     _early_baseline(early_baseline), _current_baseline(current_baseline) {
   176     assert(early_baseline.baseline_type()   != MemBaseline::Not_baselined, "Not baselined");
   177     assert(current_baseline.baseline_type() != MemBaseline::Not_baselined, "Not baselined");
   178   }
   180   // Generate summary comparison report
   181   virtual void report_diff();
   183  private:
   184   // report the comparison of each memory type
   185   void diff_summary_of_type(MEMFLAGS type,
   186     const MallocMemory* early_malloc, const VirtualMemory* early_vm,
   187     const MallocMemory* current_malloc, const VirtualMemory* current_vm) const;
   189  protected:
   190   void print_malloc_diff(size_t current_amount, size_t current_count,
   191     size_t early_amount, size_t early_count) const;
   192   void print_virtual_memory_diff(size_t current_reserved, size_t current_committed,
   193     size_t early_reserved, size_t early_committed) const;
   194   void print_arena_diff(size_t current_amount, size_t current_count,
   195     size_t early_amount, size_t early_count) const;
   196 };
   198 /*
   199  * The class is for generating detail comparison report.
   200  * It compares current memory baseline against an early baseline,
   201  * both baselines have to be detail baseline.
   202  */
   203 class MemDetailDiffReporter : public MemSummaryDiffReporter {
   204  public:
   205   MemDetailDiffReporter(MemBaseline& early_baseline, MemBaseline& current_baseline,
   206     outputStream* output, size_t scale = K) :
   207     MemSummaryDiffReporter(early_baseline, current_baseline, output, scale) { }
   209   // Generate detail comparison report
   210   virtual void report_diff();
   212   // Malloc allocation site comparison
   213   void diff_malloc_sites() const;
   214   // Virutal memory reservation site comparison
   215   void diff_virtual_memory_sites() const;
   217   // New malloc allocation site in recent baseline
   218   void new_malloc_site (const MallocSite* site) const;
   219   // The malloc allocation site is not in recent baseline
   220   void old_malloc_site (const MallocSite* site) const;
   221   // Compare malloc allocation site, it is in both baselines
   222   void diff_malloc_site(const MallocSite* early, const MallocSite* current)  const;
   224   // New virtual memory allocation site in recent baseline
   225   void new_virtual_memory_site (const VirtualMemoryAllocationSite* callsite) const;
   226   // The virtual memory allocation site is not in recent baseline
   227   void old_virtual_memory_site (const VirtualMemoryAllocationSite* callsite) const;
   228   // Compare virtual memory allocation site, it is in both baseline
   229   void diff_virtual_memory_site(const VirtualMemoryAllocationSite* early,
   230                                 const VirtualMemoryAllocationSite* current)  const;
   232   void diff_malloc_site(const NativeCallStack* stack, size_t current_size,
   233     size_t currrent_count, size_t early_size, size_t early_count) const;
   234   void diff_virtual_memory_site(const NativeCallStack* stack, size_t current_reserved,
   235     size_t current_committed, size_t early_reserved, size_t early_committed) const;
   236 };
   238 #endif // INCLUDE_NMT
   240 #endif

mercurial