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