src/share/vm/services/memRecorder.cpp

changeset 7074
833b0f92429a
parent 7073
4d3a43351904
child 7075
ac12996df59b
     1.1 --- a/src/share/vm/services/memRecorder.cpp	Wed Aug 27 09:36:55 2014 +0200
     1.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.3 @@ -1,171 +0,0 @@
     1.4 -/*
     1.5 - * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
     1.6 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     1.7 - *
     1.8 - * This code is free software; you can redistribute it and/or modify it
     1.9 - * under the terms of the GNU General Public License version 2 only, as
    1.10 - * published by the Free Software Foundation.
    1.11 - *
    1.12 - * This code is distributed in the hope that it will be useful, but WITHOUT
    1.13 - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    1.14 - * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    1.15 - * version 2 for more details (a copy is included in the LICENSE file that
    1.16 - * accompanied this code).
    1.17 - *
    1.18 - * You should have received a copy of the GNU General Public License version
    1.19 - * 2 along with this work; if not, write to the Free Software Foundation,
    1.20 - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    1.21 - *
    1.22 - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    1.23 - * or visit www.oracle.com if you need additional information or have any
    1.24 - * questions.
    1.25 - *
    1.26 - */
    1.27 -
    1.28 -#include "precompiled.hpp"
    1.29 -
    1.30 -#include "runtime/atomic.hpp"
    1.31 -#include "services/memBaseline.hpp"
    1.32 -#include "services/memRecorder.hpp"
    1.33 -#include "services/memPtr.hpp"
    1.34 -#include "services/memTracker.hpp"
    1.35 -
    1.36 -MemPointer* SequencedRecordIterator::next_record() {
    1.37 -  MemPointerRecord* itr_cur = (MemPointerRecord*)_itr.current();
    1.38 -  if (itr_cur == NULL)  {
    1.39 -    return itr_cur;
    1.40 -  }
    1.41 -
    1.42 -  MemPointerRecord* itr_next = (MemPointerRecord*)_itr.next();
    1.43 -
    1.44 -  // don't collapse virtual memory records
    1.45 -  while (itr_next != NULL && !itr_cur->is_vm_pointer() &&
    1.46 -    !itr_next->is_vm_pointer() &&
    1.47 -    same_kind(itr_cur, itr_next)) {
    1.48 -    itr_cur = itr_next;
    1.49 -    itr_next = (MemPointerRecord*)_itr.next();
    1.50 -  }
    1.51 -
    1.52 -  return itr_cur;
    1.53 -}
    1.54 -
    1.55 -
    1.56 -volatile jint MemRecorder::_instance_count = 0;
    1.57 -
    1.58 -MemRecorder::MemRecorder() {
    1.59 -  assert(MemTracker::is_on(), "Native memory tracking is off");
    1.60 -  Atomic::inc(&_instance_count);
    1.61 -  set_generation();
    1.62 -
    1.63 -  if (MemTracker::track_callsite()) {
    1.64 -    _pointer_records = new (std::nothrow)FixedSizeMemPointerArray<SeqMemPointerRecordEx,
    1.65 -        DEFAULT_RECORDER_PTR_ARRAY_SIZE>();
    1.66 -  } else {
    1.67 -    _pointer_records = new (std::nothrow)FixedSizeMemPointerArray<SeqMemPointerRecord,
    1.68 -        DEFAULT_RECORDER_PTR_ARRAY_SIZE>();
    1.69 -  }
    1.70 -  _next = NULL;
    1.71 -
    1.72 -
    1.73 -  if (_pointer_records != NULL) {
    1.74 -    // recode itself
    1.75 -    address pc = CURRENT_PC;
    1.76 -    record((address)this, (MemPointerRecord::malloc_tag()|mtNMT|otNMTRecorder),
    1.77 -        sizeof(MemRecorder), SequenceGenerator::next(), pc);
    1.78 -    record((address)_pointer_records, (MemPointerRecord::malloc_tag()|mtNMT|otNMTRecorder),
    1.79 -        _pointer_records->instance_size(), SequenceGenerator::next(), pc);
    1.80 -  }
    1.81 -}
    1.82 -
    1.83 -MemRecorder::~MemRecorder() {
    1.84 -  if (_pointer_records != NULL) {
    1.85 -    if (MemTracker::is_on()) {
    1.86 -      MemTracker::record_free((address)_pointer_records, mtNMT);
    1.87 -      MemTracker::record_free((address)this, mtNMT);
    1.88 -    }
    1.89 -    delete _pointer_records;
    1.90 -  }
    1.91 -  // delete all linked recorders
    1.92 -  while (_next != NULL) {
    1.93 -    MemRecorder* tmp = _next;
    1.94 -    _next = _next->next();
    1.95 -    tmp->set_next(NULL);
    1.96 -    delete tmp;
    1.97 -  }
    1.98 -  Atomic::dec(&_instance_count);
    1.99 -}
   1.100 -
   1.101 -// Sorting order:
   1.102 -//   1. memory block address
   1.103 -//   2. mem pointer record tags
   1.104 -//   3. sequence number
   1.105 -int MemRecorder::sort_record_fn(const void* e1, const void* e2) {
   1.106 -  const MemPointerRecord* p1 = (const MemPointerRecord*)e1;
   1.107 -  const MemPointerRecord* p2 = (const MemPointerRecord*)e2;
   1.108 -  int delta = UNSIGNED_COMPARE(p1->addr(), p2->addr());
   1.109 -  if (delta == 0) {
   1.110 -    int df = UNSIGNED_COMPARE((p1->flags() & MemPointerRecord::tag_masks),
   1.111 -                              (p2->flags() & MemPointerRecord::tag_masks));
   1.112 -    if (df == 0) {
   1.113 -      assert(p1->seq() != p2->seq(), "dup seq");
   1.114 -      return p1->seq() - p2->seq();
   1.115 -    } else {
   1.116 -      return df;
   1.117 -    }
   1.118 -  } else {
   1.119 -    return delta;
   1.120 -  }
   1.121 -}
   1.122 -
   1.123 -bool MemRecorder::record(address p, MEMFLAGS flags, size_t size, jint seq, address pc) {
   1.124 -  assert(seq > 0, "No sequence number");
   1.125 -#ifdef ASSERT
   1.126 -  if (MemPointerRecord::is_virtual_memory_record(flags)) {
   1.127 -    assert((flags & MemPointerRecord::tag_masks) != 0, "bad virtual memory record");
   1.128 -  } else {
   1.129 -    assert((flags & MemPointerRecord::tag_masks) == MemPointerRecord::malloc_tag() ||
   1.130 -           (flags & MemPointerRecord::tag_masks) == MemPointerRecord::free_tag() ||
   1.131 -           IS_ARENA_OBJ(flags),
   1.132 -           "bad malloc record");
   1.133 -  }
   1.134 -  // a recorder should only hold records within the same generation
   1.135 -  unsigned long cur_generation = SequenceGenerator::current_generation();
   1.136 -  assert(cur_generation == _generation,
   1.137 -         "this thread did not enter sync point");
   1.138 -#endif
   1.139 -
   1.140 -  if (MemTracker::track_callsite()) {
   1.141 -    SeqMemPointerRecordEx ap(p, flags, size, seq, pc);
   1.142 -    debug_only(check_dup_seq(ap.seq());)
   1.143 -    return _pointer_records->append(&ap);
   1.144 -  } else {
   1.145 -    SeqMemPointerRecord ap(p, flags, size, seq);
   1.146 -    debug_only(check_dup_seq(ap.seq());)
   1.147 -    return _pointer_records->append(&ap);
   1.148 -  }
   1.149 -}
   1.150 -
   1.151 -  // iterator for alloc pointers
   1.152 -SequencedRecordIterator MemRecorder::pointer_itr() {
   1.153 -  assert(_pointer_records != NULL, "just check");
   1.154 -  _pointer_records->sort((FN_SORT)sort_record_fn);
   1.155 -  return SequencedRecordIterator(_pointer_records);
   1.156 -}
   1.157 -
   1.158 -
   1.159 -void MemRecorder::set_generation() {
   1.160 -  _generation = SequenceGenerator::current_generation();
   1.161 -}
   1.162 -
   1.163 -#ifdef ASSERT
   1.164 -
   1.165 -void MemRecorder::check_dup_seq(jint seq) const {
   1.166 -  MemPointerArrayIteratorImpl itr(_pointer_records);
   1.167 -  MemPointerRecord* rc = (MemPointerRecord*)itr.current();
   1.168 -  while (rc != NULL) {
   1.169 -    assert(rc->seq() != seq, "dup seq");
   1.170 -    rc = (MemPointerRecord*)itr.next();
   1.171 -  }
   1.172 -}
   1.173 -
   1.174 -#endif

mercurial