1.1 --- a/src/share/vm/services/memRecorder.hpp Wed Aug 27 09:36:55 2014 +0200 1.2 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 1.3 @@ -1,271 +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 -#ifndef SHARE_VM_SERVICES_MEM_RECORDER_HPP 1.29 -#define SHARE_VM_SERVICES_MEM_RECORDER_HPP 1.30 - 1.31 -#include "memory/allocation.hpp" 1.32 -#include "runtime/os.hpp" 1.33 -#include "services/memPtrArray.hpp" 1.34 - 1.35 -class MemSnapshot; 1.36 -class MemTracker; 1.37 -class MemTrackWorker; 1.38 - 1.39 -// Fixed size memory pointer array implementation 1.40 -template <class E, int SIZE> class FixedSizeMemPointerArray : 1.41 - public MemPointerArray { 1.42 - // This implementation is for memory recorder only 1.43 - friend class MemRecorder; 1.44 - 1.45 - private: 1.46 - E _data[SIZE]; 1.47 - int _size; 1.48 - 1.49 - protected: 1.50 - FixedSizeMemPointerArray(bool init_elements = false): 1.51 - _size(0){ 1.52 - if (init_elements) { 1.53 - for (int index = 0; index < SIZE; index ++) { 1.54 - ::new ((void*)&_data[index]) E(); 1.55 - } 1.56 - } 1.57 - } 1.58 - 1.59 - void* operator new(size_t size, const std::nothrow_t& nothrow_constant) throw() { 1.60 - // the instance is part of memRecorder, needs to be tagged with 'otNMTRecorder' 1.61 - // to avoid recursion 1.62 - return os::malloc(size, (mtNMT | otNMTRecorder)); 1.63 - } 1.64 - 1.65 - void* operator new(size_t size) throw() { 1.66 - assert(false, "use nothrow version"); 1.67 - return NULL; 1.68 - } 1.69 - 1.70 - void operator delete(void* p) { 1.71 - os::free(p, (mtNMT | otNMTRecorder)); 1.72 - } 1.73 - 1.74 - // instance size 1.75 - inline size_t instance_size() const { 1.76 - return sizeof(FixedSizeMemPointerArray<E, SIZE>); 1.77 - } 1.78 - 1.79 - NOT_PRODUCT(int capacity() const { return SIZE; }) 1.80 - 1.81 - public: 1.82 - // implementation of public interface 1.83 - bool out_of_memory() const { return false; } 1.84 - bool is_empty() const { return _size == 0; } 1.85 - bool is_full() { return length() >= SIZE; } 1.86 - int length() const { return _size; } 1.87 - 1.88 - void clear() { 1.89 - _size = 0; 1.90 - } 1.91 - 1.92 - bool append(MemPointer* ptr) { 1.93 - if (is_full()) return false; 1.94 - _data[_size ++] = *(E*)ptr; 1.95 - return true; 1.96 - } 1.97 - 1.98 - virtual bool insert_at(MemPointer* p, int pos) { 1.99 - assert(false, "append only"); 1.100 - return false; 1.101 - } 1.102 - 1.103 - virtual bool remove_at(int pos) { 1.104 - assert(false, "not supported"); 1.105 - return false; 1.106 - } 1.107 - 1.108 - MemPointer* at(int index) const { 1.109 - assert(index >= 0 && index < length(), 1.110 - "parameter check"); 1.111 - return ((E*)&_data[index]); 1.112 - } 1.113 - 1.114 - void sort(FN_SORT fn) { 1.115 - qsort((void*)_data, _size, sizeof(E), fn); 1.116 - } 1.117 - 1.118 - bool shrink() { 1.119 - return false; 1.120 - } 1.121 -}; 1.122 - 1.123 - 1.124 -// This iterator requires pre-sorted MemPointerArray, which is sorted by: 1.125 -// 1. address 1.126 -// 2. allocation type 1.127 -// 3. sequence number 1.128 -// During the array walking, iterator collapses pointers with the same 1.129 -// address and allocation type, and only returns the one with highest 1.130 -// sequence number. 1.131 -// 1.132 -// This is read-only iterator, update methods are asserted. 1.133 -class SequencedRecordIterator : public MemPointerArrayIterator { 1.134 - private: 1.135 - MemPointerArrayIteratorImpl _itr; 1.136 - MemPointer* _cur; 1.137 - 1.138 - public: 1.139 - SequencedRecordIterator(const MemPointerArray* arr): 1.140 - _itr(const_cast<MemPointerArray*>(arr)) { 1.141 - _cur = next_record(); 1.142 - } 1.143 - 1.144 - SequencedRecordIterator(const SequencedRecordIterator& itr): 1.145 - _itr(itr._itr) { 1.146 - _cur = next_record(); 1.147 - } 1.148 - 1.149 - // return the pointer at current position 1.150 - virtual MemPointer* current() const { 1.151 - return _cur; 1.152 - }; 1.153 - 1.154 - // return the next pointer and advance current position 1.155 - virtual MemPointer* next() { 1.156 - _cur = next_record(); 1.157 - return _cur; 1.158 - } 1.159 - 1.160 - // return the next pointer without advancing current position 1.161 - virtual MemPointer* peek_next() const { 1.162 - assert(false, "not implemented"); 1.163 - return NULL; 1.164 - 1.165 - } 1.166 - // return the previous pointer without changing current position 1.167 - virtual MemPointer* peek_prev() const { 1.168 - assert(false, "not implemented"); 1.169 - return NULL; 1.170 - } 1.171 - 1.172 - // remove the pointer at current position 1.173 - virtual void remove() { 1.174 - assert(false, "read-only iterator"); 1.175 - }; 1.176 - // insert the pointer at current position 1.177 - virtual bool insert(MemPointer* ptr) { 1.178 - assert(false, "read-only iterator"); 1.179 - return false; 1.180 - } 1.181 - 1.182 - virtual bool insert_after(MemPointer* ptr) { 1.183 - assert(false, "read-only iterator"); 1.184 - return false; 1.185 - } 1.186 - private: 1.187 - // collapse the 'same kind' of records, and return this 'kind' of 1.188 - // record with highest sequence number 1.189 - MemPointer* next_record(); 1.190 - 1.191 - // Test if the two records are the same kind: the same memory block and allocation 1.192 - // type. 1.193 - inline bool same_kind(const MemPointerRecord* p1, const MemPointerRecord* p2) const { 1.194 - assert(!p1->is_vm_pointer() && !p2->is_vm_pointer(), "malloc pointer only"); 1.195 - return (p1->addr() == p2->addr() && 1.196 - (p1->flags() &MemPointerRecord::tag_masks) == 1.197 - (p2->flags() & MemPointerRecord::tag_masks)); 1.198 - } 1.199 -}; 1.200 - 1.201 - 1.202 - 1.203 -#define DEFAULT_RECORDER_PTR_ARRAY_SIZE 512 1.204 - 1.205 -class MemRecorder : public CHeapObj<mtNMT|otNMTRecorder> { 1.206 - friend class MemSnapshot; 1.207 - friend class MemTracker; 1.208 - friend class MemTrackWorker; 1.209 - friend class GenerationData; 1.210 - 1.211 - protected: 1.212 - // the array that holds memory records 1.213 - MemPointerArray* _pointer_records; 1.214 - 1.215 - private: 1.216 - // used for linked list 1.217 - MemRecorder* _next; 1.218 - // active recorder can only record a certain generation data 1.219 - unsigned long _generation; 1.220 - 1.221 - protected: 1.222 - _NOINLINE_ MemRecorder(); 1.223 - ~MemRecorder(); 1.224 - 1.225 - // record a memory operation 1.226 - bool record(address addr, MEMFLAGS flags, size_t size, jint seq, address caller_pc = 0); 1.227 - 1.228 - // linked list support 1.229 - inline void set_next(MemRecorder* rec) { 1.230 - _next = rec; 1.231 - } 1.232 - 1.233 - inline MemRecorder* next() const { 1.234 - return _next; 1.235 - } 1.236 - 1.237 - // if the recorder is full 1.238 - inline bool is_full() const { 1.239 - assert(_pointer_records != NULL, "just check"); 1.240 - return _pointer_records->is_full(); 1.241 - } 1.242 - 1.243 - // if running out of memory when initializing recorder's internal 1.244 - // data 1.245 - inline bool out_of_memory() const { 1.246 - return (_pointer_records == NULL || 1.247 - _pointer_records->out_of_memory()); 1.248 - } 1.249 - 1.250 - inline void clear() { 1.251 - assert(_pointer_records != NULL, "Just check"); 1.252 - _pointer_records->clear(); 1.253 - } 1.254 - 1.255 - SequencedRecordIterator pointer_itr(); 1.256 - 1.257 - // return the generation of this recorder which it belongs to 1.258 - unsigned long get_generation() const { return _generation; } 1.259 - protected: 1.260 - // number of MemRecorder instance 1.261 - static volatile jint _instance_count; 1.262 - 1.263 - private: 1.264 - // sorting function, sort records into following order 1.265 - // 1. memory address 1.266 - // 2. allocation type 1.267 - // 3. sequence number 1.268 - static int sort_record_fn(const void* e1, const void* e2); 1.269 - 1.270 - debug_only(void check_dup_seq(jint seq) const;) 1.271 - void set_generation(); 1.272 -}; 1.273 - 1.274 -#endif // SHARE_VM_SERVICES_MEM_RECORDER_HPP