memTracker.cpp revision 6347:dc427574bc7a
1100966Siwasaki/*
2100966Siwasaki * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
3100966Siwasaki * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4100966Siwasaki *
5100966Siwasaki * This code is free software; you can redistribute it and/or modify it
6100966Siwasaki * under the terms of the GNU General Public License version 2 only, as
7100966Siwasaki * published by the Free Software Foundation.
8100966Siwasaki *
9100966Siwasaki * This code is distributed in the hope that it will be useful, but WITHOUT
10100966Siwasaki * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11193267Sjkim * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12100966Siwasaki * version 2 for more details (a copy is included in the LICENSE file that
13100966Siwasaki * accompanied this code).
14100966Siwasaki *
15100966Siwasaki * You should have received a copy of the GNU General Public License version
16100966Siwasaki * 2 along with this work; if not, write to the Free Software Foundation,
17100966Siwasaki * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18100966Siwasaki *
19100966Siwasaki * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20100966Siwasaki * or visit www.oracle.com if you need additional information or have any
21100966Siwasaki * questions.
22100966Siwasaki *
23100966Siwasaki */
24100966Siwasaki#include "precompiled.hpp"
25100966Siwasaki
26100966Siwasaki#include "oops/instanceKlass.hpp"
27100966Siwasaki#include "runtime/atomic.hpp"
28100966Siwasaki#include "runtime/interfaceSupport.hpp"
29100966Siwasaki#include "runtime/mutexLocker.hpp"
30100966Siwasaki#include "runtime/safepoint.hpp"
31100966Siwasaki#include "runtime/threadCritical.hpp"
32100966Siwasaki#include "runtime/vm_operations.hpp"
33100966Siwasaki#include "services/memPtr.hpp"
34100966Siwasaki#include "services/memReporter.hpp"
35100966Siwasaki#include "services/memTracker.hpp"
36100966Siwasaki#include "utilities/decoder.hpp"
37100966Siwasaki#include "utilities/defaultStream.hpp"
38100966Siwasaki#include "utilities/globalDefinitions.hpp"
39100966Siwasaki
40100966Siwasakibool NMT_track_callsite = false;
41100966Siwasaki
42100966Siwasaki// walk all 'known' threads at NMT sync point, and collect their recorders
43100966Siwasakivoid SyncThreadRecorderClosure::do_thread(Thread* thread) {
44100966Siwasaki  assert(SafepointSynchronize::is_at_safepoint(), "Safepoint required");
45100966Siwasaki  if (thread->is_Java_thread()) {
46100966Siwasaki    JavaThread* javaThread = (JavaThread*)thread;
47100966Siwasaki    MemRecorder* recorder = javaThread->get_recorder();
48100966Siwasaki    if (recorder != NULL) {
49100966Siwasaki      MemTracker::enqueue_pending_recorder(recorder);
50100966Siwasaki      javaThread->set_recorder(NULL);
51100966Siwasaki    }
52100966Siwasaki  }
53100966Siwasaki  _thread_count ++;
54100966Siwasaki}
55100966Siwasaki
56100966Siwasaki
57100966SiwasakiMemRecorder* volatile           MemTracker::_global_recorder = NULL;
58100966SiwasakiMemSnapshot*                    MemTracker::_snapshot = NULL;
59100966SiwasakiMemBaseline                     MemTracker::_baseline;
60100966SiwasakiMutex*                          MemTracker::_query_lock = NULL;
61100966SiwasakiMemRecorder* volatile           MemTracker::_merge_pending_queue = NULL;
62100966SiwasakiMemRecorder* volatile           MemTracker::_pooled_recorders = NULL;
63100966SiwasakiMemTrackWorker*                 MemTracker::_worker_thread = NULL;
64100966Siwasakiint                             MemTracker::_sync_point_skip_count = 0;
65100966SiwasakiMemTracker::NMTLevel            MemTracker::_tracking_level = MemTracker::NMT_off;
66100966Siwasakivolatile MemTracker::NMTStates  MemTracker::_state = NMT_uninited;
67100966SiwasakiMemTracker::ShutdownReason      MemTracker::_reason = NMT_shutdown_none;
68100966Siwasakiint                             MemTracker::_thread_count = 255;
69100966Siwasakivolatile jint                   MemTracker::_pooled_recorder_count = 0;
70100966Siwasakivolatile unsigned long          MemTracker::_processing_generation = 0;
71100966Siwasakivolatile bool                   MemTracker::_worker_thread_idle = false;
72100966Siwasakivolatile jint                   MemTracker::_pending_op_count = 0;
73100966Siwasakivolatile bool                   MemTracker::_slowdown_calling_thread = false;
74100966Siwasakidebug_only(intx                 MemTracker::_main_thread_tid = 0;)
75100966SiwasakiNOT_PRODUCT(volatile jint       MemTracker::_pending_recorder_count = 0;)
76100966Siwasaki
77100966Siwasakivoid MemTracker::init_tracking_options(const char* option_line) {
78100966Siwasaki  _tracking_level = NMT_off;
79100966Siwasaki  if (strcmp(option_line, "=summary") == 0) {
80100966Siwasaki    _tracking_level = NMT_summary;
81100966Siwasaki  } else if (strcmp(option_line, "=detail") == 0) {
82100966Siwasaki    // detail relies on a stack-walking ability that may not
83100966Siwasaki    // be available depending on platform and/or compiler flags
84100966Siwasaki#if PLATFORM_NATIVE_STACK_WALKING_SUPPORTED
85100966Siwasaki      _tracking_level = NMT_detail;
86100966Siwasaki#else
87100966Siwasaki      jio_fprintf(defaultStream::error_stream(),
88100966Siwasaki        "NMT detail is not supported on this platform.  Using NMT summary instead.\n");
89100966Siwasaki      _tracking_level = NMT_summary;
90100966Siwasaki#endif
91100966Siwasaki  } else if (strcmp(option_line, "=off") != 0) {
92100966Siwasaki    vm_exit_during_initialization("Syntax error, expecting -XX:NativeMemoryTracking=[off|summary|detail]", NULL);
93100966Siwasaki  }
94100966Siwasaki}
95100966Siwasaki
96100966Siwasaki// first phase of bootstrapping, when VM is still in single-threaded mode.
97100966Siwasakivoid MemTracker::bootstrap_single_thread() {
98100966Siwasaki  if (_tracking_level > NMT_off) {
99100966Siwasaki    assert(_state == NMT_uninited, "wrong state");
100100966Siwasaki
101100966Siwasaki    // NMT is not supported with UseMallocOnly is on. NMT can NOT
102100966Siwasaki    // handle the amount of malloc data without significantly impacting
103100966Siwasaki    // runtime performance when this flag is on.
104100966Siwasaki    if (UseMallocOnly) {
105100966Siwasaki      shutdown(NMT_use_malloc_only);
106100966Siwasaki      return;
107100966Siwasaki    }
108100966Siwasaki
109100966Siwasaki    _query_lock = new (std::nothrow) Mutex(Monitor::max_nonleaf, "NMT_queryLock");
110100966Siwasaki    if (_query_lock == NULL) {
111100966Siwasaki      shutdown(NMT_out_of_memory);
112100966Siwasaki      return;
113100966Siwasaki    }
114100966Siwasaki
115100966Siwasaki    debug_only(_main_thread_tid = os::current_thread_id();)
116100966Siwasaki    _state = NMT_bootstrapping_single_thread;
117100966Siwasaki    NMT_track_callsite = (_tracking_level == NMT_detail && can_walk_stack());
118100966Siwasaki  }
119193341Sjkim}
120100966Siwasaki
121100966Siwasaki// second phase of bootstrapping, when VM is about to or already entered multi-theaded mode.
122100966Siwasakivoid MemTracker::bootstrap_multi_thread() {
123100966Siwasaki  if (_tracking_level > NMT_off && _state == NMT_bootstrapping_single_thread) {
124100966Siwasaki  // create nmt lock for multi-thread execution
125100966Siwasaki    assert(_main_thread_tid == os::current_thread_id(), "wrong thread");
126167802Sjkim    _state = NMT_bootstrapping_multi_thread;
127100966Siwasaki    NMT_track_callsite = (_tracking_level == NMT_detail && can_walk_stack());
128128212Snjl  }
129167802Sjkim}
130167802Sjkim
131167802Sjkim// fully start nmt
132167802Sjkimvoid MemTracker::start() {
133167802Sjkim  // Native memory tracking is off from command line option
134100966Siwasaki  if (_tracking_level == NMT_off || shutdown_in_progress()) return;
135167802Sjkim
136100966Siwasaki  assert(_main_thread_tid == os::current_thread_id(), "wrong thread");
137167802Sjkim  assert(_state == NMT_bootstrapping_multi_thread, "wrong state");
138167802Sjkim
139167802Sjkim  _snapshot = new (std::nothrow)MemSnapshot();
140167802Sjkim  if (_snapshot != NULL) {
141167802Sjkim    if (!_snapshot->out_of_memory() && start_worker(_snapshot)) {
142167802Sjkim      _state = NMT_started;
143167802Sjkim      NMT_track_callsite = (_tracking_level == NMT_detail && can_walk_stack());
144167802Sjkim      return;
145167802Sjkim    }
146167802Sjkim
147167802Sjkim    delete _snapshot;
148167802Sjkim    _snapshot = NULL;
149167802Sjkim  }
150167802Sjkim
151167802Sjkim  // fail to start native memory tracking, shut it down
152167802Sjkim  shutdown(NMT_initialization);
153167802Sjkim}
154167802Sjkim
155167802Sjkim/**
156167802Sjkim * Shutting down native memory tracking.
157167802Sjkim * We can not shutdown native memory tracking immediately, so we just
158167802Sjkim * setup shutdown pending flag, every native memory tracking component
159167802Sjkim * should orderly shut itself down.
160167802Sjkim *
161167802Sjkim * The shutdown sequences:
162167802Sjkim *  1. MemTracker::shutdown() sets MemTracker to shutdown pending state
163167802Sjkim *  2. Worker thread calls MemTracker::final_shutdown(), which transites
164193267Sjkim *     MemTracker to final shutdown state.
165193267Sjkim *  3. At sync point, MemTracker does final cleanup, before sets memory
166193267Sjkim *     tracking level to off to complete shutdown.
167193267Sjkim */
168193267Sjkimvoid MemTracker::shutdown(ShutdownReason reason) {
169193267Sjkim  if (_tracking_level == NMT_off) return;
170193267Sjkim
171193267Sjkim  if (_state <= NMT_bootstrapping_single_thread) {
172193267Sjkim    // we still in single thread mode, there is not contention
173193267Sjkim    _state = NMT_shutdown_pending;
174197104Sjkim    _reason = reason;
175197104Sjkim  } else {
176167802Sjkim    // we want to know who initialized shutdown
177197104Sjkim    if ((jint)NMT_started == Atomic::cmpxchg((jint)NMT_shutdown_pending,
178167802Sjkim                                       (jint*)&_state, (jint)NMT_started)) {
179193267Sjkim        _reason = reason;
180167802Sjkim    }
181167802Sjkim  }
182167802Sjkim}
183167802Sjkim
184167802Sjkim// final phase of shutdown
185193267Sjkimvoid MemTracker::final_shutdown() {
186193267Sjkim  // delete all pending recorders and pooled recorders
187167802Sjkim  delete_all_pending_recorders();
188167802Sjkim  delete_all_pooled_recorders();
189167802Sjkim
190167802Sjkim  {
191167802Sjkim    // shared baseline and snapshot are the only objects needed to
192100966Siwasaki    // create query results
193100966Siwasaki    MutexLockerEx locker(_query_lock, true);
194100966Siwasaki    // cleanup baseline data and snapshot
195167802Sjkim    _baseline.clear();
196167802Sjkim    delete _snapshot;
197100966Siwasaki    _snapshot = NULL;
198167802Sjkim  }
199151937Sjkim
200100966Siwasaki  // shutdown shared decoder instance, since it is only
201100966Siwasaki  // used by native memory tracking so far.
202100966Siwasaki  Decoder::shutdown();
203100966Siwasaki
204100966Siwasaki  MemTrackWorker* worker = NULL;
205100966Siwasaki  {
206100966Siwasaki    ThreadCritical tc;
207100966Siwasaki    // can not delete worker inside the thread critical
208100966Siwasaki    if (_worker_thread != NULL && Thread::current() == _worker_thread) {
209167802Sjkim      worker = _worker_thread;
210167802Sjkim      _worker_thread = NULL;
211167802Sjkim    }
212167802Sjkim  }
213100966Siwasaki  if (worker != NULL) {
214167802Sjkim    delete worker;
215167802Sjkim  }
216167802Sjkim  _state = NMT_final_shutdown;
217167802Sjkim}
218167802Sjkim
219167802Sjkim// delete all pooled recorders
220167802Sjkimvoid MemTracker::delete_all_pooled_recorders() {
221167802Sjkim  // free all pooled recorders
222167802Sjkim  MemRecorder* volatile cur_head = _pooled_recorders;
223167802Sjkim  if (cur_head != NULL) {
224167802Sjkim    MemRecorder* null_ptr = NULL;
225167802Sjkim    while (cur_head != NULL && (void*)cur_head != Atomic::cmpxchg_ptr((void*)null_ptr,
226167802Sjkim      (void*)&_pooled_recorders, (void*)cur_head)) {
227167802Sjkim      cur_head = _pooled_recorders;
228167802Sjkim    }
229167802Sjkim    if (cur_head != NULL) {
230167802Sjkim      delete cur_head;
231167802Sjkim      _pooled_recorder_count = 0;
232167802Sjkim    }
233167802Sjkim  }
234193267Sjkim}
235167802Sjkim
236167802Sjkim// delete all recorders in pending queue
237167802Sjkimvoid MemTracker::delete_all_pending_recorders() {
238167802Sjkim  // free all pending recorders
239167802Sjkim  MemRecorder* pending_head = get_pending_recorders();
240167802Sjkim  if (pending_head != NULL) {
241167802Sjkim    delete pending_head;
242167802Sjkim  }
243193267Sjkim}
244197104Sjkim
245167802Sjkim/*
246193267Sjkim * retrieve per-thread recorder of specified thread.
247193267Sjkim * if thread == NULL, it means global recorder
248193267Sjkim */
249167802SjkimMemRecorder* MemTracker::get_thread_recorder(JavaThread* thread) {
250167802Sjkim  if (shutdown_in_progress()) return NULL;
251167802Sjkim
252193267Sjkim  MemRecorder* rc;
253167802Sjkim  if (thread == NULL) {
254167802Sjkim    rc = _global_recorder;
255193267Sjkim  } else {
256193267Sjkim    rc = thread->get_recorder();
257193267Sjkim  }
258197104Sjkim
259193267Sjkim  if (rc != NULL && rc->is_full()) {
260193267Sjkim    enqueue_pending_recorder(rc);
261193267Sjkim    rc = NULL;
262193267Sjkim  }
263193267Sjkim
264197104Sjkim  if (rc == NULL) {
265167802Sjkim    rc = get_new_or_pooled_instance();
266197104Sjkim    if (thread == NULL) {
267197104Sjkim      _global_recorder = rc;
268197104Sjkim    } else {
269197104Sjkim      thread->set_recorder(rc);
270197104Sjkim    }
271197104Sjkim  }
272197104Sjkim  return rc;
273197104Sjkim}
274167802Sjkim
275167802Sjkim/*
276167802Sjkim * get a per-thread recorder from pool, or create a new one if
277167802Sjkim * there is not one available.
278167802Sjkim */
279167802SjkimMemRecorder* MemTracker::get_new_or_pooled_instance() {
280167802Sjkim   MemRecorder* cur_head = const_cast<MemRecorder*> (_pooled_recorders);
281167802Sjkim   if (cur_head == NULL) {
282167802Sjkim     MemRecorder* rec = new (std::nothrow)MemRecorder();
283167802Sjkim     if (rec == NULL || rec->out_of_memory()) {
284193267Sjkim       shutdown(NMT_out_of_memory);
285193267Sjkim       if (rec != NULL) {
286167802Sjkim         delete rec;
287167802Sjkim         rec = NULL;
288167802Sjkim       }
289197104Sjkim     }
290197104Sjkim     return rec;
291167802Sjkim   } else {
292167802Sjkim     MemRecorder* next_head = cur_head->next();
293167802Sjkim     if ((void*)cur_head != Atomic::cmpxchg_ptr((void*)next_head, (void*)&_pooled_recorders,
294193267Sjkim       (void*)cur_head)) {
295167802Sjkim       return get_new_or_pooled_instance();
296167802Sjkim     }
297167802Sjkim     cur_head->set_next(NULL);
298167802Sjkim     Atomic::dec(&_pooled_recorder_count);
299193267Sjkim     cur_head->set_generation();
300167802Sjkim     return cur_head;
301167802Sjkim  }
302193267Sjkim}
303167802Sjkim
304197104Sjkim/*
305197104Sjkim * retrieve all recorders in pending queue, and empty the queue
306197104Sjkim */
307197104SjkimMemRecorder* MemTracker::get_pending_recorders() {
308167802Sjkim  MemRecorder* cur_head = const_cast<MemRecorder*>(_merge_pending_queue);
309167802Sjkim  MemRecorder* null_ptr = NULL;
310167802Sjkim  while ((void*)cur_head != Atomic::cmpxchg_ptr((void*)null_ptr, (void*)&_merge_pending_queue,
311100966Siwasaki    (void*)cur_head)) {
312167802Sjkim    cur_head = const_cast<MemRecorder*>(_merge_pending_queue);
313167802Sjkim  }
314167802Sjkim  NOT_PRODUCT(Atomic::store(0, &_pending_recorder_count));
315167802Sjkim  return cur_head;
316167802Sjkim}
317167802Sjkim
318193267Sjkim/*
319167802Sjkim * release a recorder to recorder pool.
320167802Sjkim */
321167802Sjkimvoid MemTracker::release_thread_recorder(MemRecorder* rec) {
322167802Sjkim  assert(rec != NULL, "null recorder");
323167802Sjkim  // we don't want to pool too many recorders
324167802Sjkim  rec->set_next(NULL);
325167802Sjkim  if (shutdown_in_progress() || _pooled_recorder_count > _thread_count * 2) {
326167802Sjkim    delete rec;
327167802Sjkim    return;
328167802Sjkim  }
329167802Sjkim
330167802Sjkim  rec->clear();
331167802Sjkim  MemRecorder* cur_head = const_cast<MemRecorder*>(_pooled_recorders);
332167802Sjkim  rec->set_next(cur_head);
333167802Sjkim  while ((void*)cur_head != Atomic::cmpxchg_ptr((void*)rec, (void*)&_pooled_recorders,
334167802Sjkim    (void*)cur_head)) {
335167802Sjkim    cur_head = const_cast<MemRecorder*>(_pooled_recorders);
336167802Sjkim    rec->set_next(cur_head);
337167802Sjkim  }
338167802Sjkim  Atomic::inc(&_pooled_recorder_count);
339167802Sjkim}
340167802Sjkim
341167802Sjkim// write a record to proper recorder. No lock can be taken from this method
342167802Sjkim// down.
343167802Sjkimvoid MemTracker::write_tracking_record(address addr, MEMFLAGS flags,
344167802Sjkim    size_t size, jint seq, address pc, JavaThread* thread) {
345167802Sjkim
346167802Sjkim    MemRecorder* rc = get_thread_recorder(thread);
347167802Sjkim    if (rc != NULL) {
348167802Sjkim      rc->record(addr, flags, size, seq, pc);
349167802Sjkim    }
350167802Sjkim}
351167802Sjkim
352167802Sjkim/**
353167802Sjkim * enqueue a recorder to pending queue
354167802Sjkim */
355167802Sjkimvoid MemTracker::enqueue_pending_recorder(MemRecorder* rec) {
356193267Sjkim  assert(rec != NULL, "null recorder");
357193267Sjkim
358193267Sjkim  // we are shutting down, so just delete it
359193267Sjkim  if (shutdown_in_progress()) {
360193267Sjkim    rec->set_next(NULL);
361193267Sjkim    delete rec;
362193267Sjkim    return;
363193267Sjkim  }
364167802Sjkim
365167802Sjkim  MemRecorder* cur_head = const_cast<MemRecorder*>(_merge_pending_queue);
366167802Sjkim  rec->set_next(cur_head);
367167802Sjkim  while ((void*)cur_head != Atomic::cmpxchg_ptr((void*)rec, (void*)&_merge_pending_queue,
368193267Sjkim    (void*)cur_head)) {
369167802Sjkim    cur_head = const_cast<MemRecorder*>(_merge_pending_queue);
370167802Sjkim    rec->set_next(cur_head);
371167802Sjkim  }
372197104Sjkim  NOT_PRODUCT(Atomic::inc(&_pending_recorder_count);)
373197104Sjkim}
374197104Sjkim
375197104Sjkim/*
376167802Sjkim * The method is called at global safepoint
377167802Sjkim * during it synchronization process.
378167802Sjkim *   1. enqueue all JavaThreads' per-thread recorders
379167802Sjkim *   2. enqueue global recorder
380167802Sjkim *   3. retrieve all pending recorders
381167802Sjkim *   4. reset global sequence number generator
382167802Sjkim *   5. call worker's sync
383197104Sjkim */
384197104Sjkim#define MAX_SAFEPOINTS_TO_SKIP     128
385197104Sjkim#define SAFE_SEQUENCE_THRESHOLD    30
386197104Sjkim#define HIGH_GENERATION_THRESHOLD  60
387167802Sjkim#define MAX_RECORDER_THREAD_RATIO  30
388167802Sjkim#define MAX_RECORDER_PER_THREAD    100
389167802Sjkim
390167802Sjkimvoid MemTracker::sync() {
391167802Sjkim  assert(_tracking_level > NMT_off, "NMT is not enabled");
392167802Sjkim  assert(SafepointSynchronize::is_at_safepoint(), "Safepoint required");
393167802Sjkim
394167802Sjkim  // Some GC tests hit large number of safepoints in short period of time
395167802Sjkim  // without meaningful activities. We should prevent going to
396167802Sjkim  // sync point in these cases, which can potentially exhaust generation buffer.
397167802Sjkim  // Here is the factots to determine if we should go into sync point:
398167802Sjkim  // 1. not to overflow sequence number
399167802Sjkim  // 2. if we are in danger to overflow generation buffer
400193267Sjkim  // 3. how many safepoints we already skipped sync point
401193267Sjkim  if (_state == NMT_started) {
402193267Sjkim    // worker thread is not ready, no one can manage generation
403193267Sjkim    // buffer, so skip this safepoint
404197104Sjkim    if (_worker_thread == NULL) return;
405197104Sjkim
406197104Sjkim    if (_sync_point_skip_count < MAX_SAFEPOINTS_TO_SKIP) {
407197104Sjkim      int per_seq_in_use = SequenceGenerator::peek() * 100 / max_jint;
408167802Sjkim      int per_gen_in_use = _worker_thread->generations_in_use() * 100 / MAX_GENERATIONS;
409167802Sjkim      if (per_seq_in_use < SAFE_SEQUENCE_THRESHOLD && per_gen_in_use >= HIGH_GENERATION_THRESHOLD) {
410167802Sjkim        _sync_point_skip_count ++;
411167802Sjkim        return;
412167802Sjkim      }
413100966Siwasaki    }
414100966Siwasaki    {
415100966Siwasaki      // This method is running at safepoint, with ThreadCritical lock,
416100966Siwasaki      // it should guarantee that NMT is fully sync-ed.
417100966Siwasaki      ThreadCritical tc;
418100966Siwasaki
419100966Siwasaki      // We can NOT execute NMT sync-point if there are pending tracking ops.
420100966Siwasaki      if (_pending_op_count == 0) {
421167802Sjkim        SequenceGenerator::reset();
422167802Sjkim        _sync_point_skip_count = 0;
423167802Sjkim
424167802Sjkim        // walk all JavaThreads to collect recorders
425167802Sjkim        SyncThreadRecorderClosure stc;
426167802Sjkim        Threads::threads_do(&stc);
427100966Siwasaki
428167802Sjkim        _thread_count = stc.get_thread_count();
429151937Sjkim        MemRecorder* pending_recorders = get_pending_recorders();
430151937Sjkim
431151937Sjkim        if (_global_recorder != NULL) {
432100966Siwasaki          _global_recorder->set_next(pending_recorders);
433100966Siwasaki          pending_recorders = _global_recorder;
434100966Siwasaki          _global_recorder = NULL;
435102550Siwasaki        }
436100966Siwasaki
437100966Siwasaki        // see if NMT has too many outstanding recorder instances, it usually
438100966Siwasaki        // means that worker thread is lagging behind in processing them.
439100966Siwasaki        if (!AutoShutdownNMT) {
440100966Siwasaki          _slowdown_calling_thread = (MemRecorder::_instance_count > MAX_RECORDER_THREAD_RATIO * _thread_count);
441100966Siwasaki        } else {
442100966Siwasaki          // If auto shutdown is on, enforce MAX_RECORDER_PER_THREAD threshold to prevent OOM
443100966Siwasaki          if (MemRecorder::_instance_count >= _thread_count * MAX_RECORDER_PER_THREAD) {
444100966Siwasaki            shutdown(NMT_out_of_memory);
445100966Siwasaki          }
446100966Siwasaki        }
447100966Siwasaki
448100966Siwasaki        // check _worker_thread with lock to avoid racing condition
449100966Siwasaki        if (_worker_thread != NULL) {
450100966Siwasaki          _worker_thread->at_sync_point(pending_recorders, InstanceKlass::number_of_instance_classes());
451100966Siwasaki        }
452100966Siwasaki        assert(SequenceGenerator::peek() == 1, "Should not have memory activities during sync-point");
453100966Siwasaki      } else {
454100966Siwasaki        _sync_point_skip_count ++;
455100966Siwasaki      }
456100966Siwasaki    }
457100966Siwasaki  }
458100966Siwasaki
459100966Siwasaki  // now, it is the time to shut whole things off
460100966Siwasaki  if (_state == NMT_final_shutdown) {
461100966Siwasaki    // walk all JavaThreads to delete all recorders
462100966Siwasaki    SyncThreadRecorderClosure stc;
463100966Siwasaki    Threads::threads_do(&stc);
464100966Siwasaki    // delete global recorder
465100966Siwasaki    {
466100966Siwasaki      ThreadCritical tc;
467102550Siwasaki      if (_global_recorder != NULL) {
468151937Sjkim        delete _global_recorder;
469117521Snjl        _global_recorder = NULL;
470151937Sjkim      }
471151937Sjkim    }
472193267Sjkim    MemRecorder* pending_recorders = get_pending_recorders();
473117521Snjl    if (pending_recorders != NULL) {
474151937Sjkim      delete pending_recorders;
475151937Sjkim    }
476151937Sjkim    // try at a later sync point to ensure MemRecorder instance drops to zero to
477151937Sjkim    // completely shutdown NMT
478151937Sjkim    if (MemRecorder::_instance_count == 0) {
479117521Snjl      _state = NMT_shutdown;
480151937Sjkim      _tracking_level = NMT_off;
481151937Sjkim    }
482117521Snjl  }
483151937Sjkim}
484151937Sjkim
485151937Sjkim/*
486151937Sjkim * Start worker thread.
487117521Snjl */
488117521Snjlbool MemTracker::start_worker(MemSnapshot* snapshot) {
489117521Snjl  assert(_worker_thread == NULL && _snapshot != NULL, "Just Check");
490117521Snjl  _worker_thread = new (std::nothrow) MemTrackWorker(snapshot);
491117521Snjl  if (_worker_thread == NULL) {
492117521Snjl    return false;
493117521Snjl  } else if (_worker_thread->has_error()) {
494117521Snjl    delete _worker_thread;
495117521Snjl    _worker_thread = NULL;
496117521Snjl    return false;
497117521Snjl  }
498117521Snjl  _worker_thread->start();
499117521Snjl  return true;
500117521Snjl}
501117521Snjl
502117521Snjl/*
503117521Snjl * We need to collect a JavaThread's per-thread recorder
504117521Snjl * before it exits.
505117521Snjl */
506117521Snjlvoid MemTracker::thread_exiting(JavaThread* thread) {
507117521Snjl  if (is_on()) {
508100966Siwasaki    MemRecorder* rec = thread->get_recorder();
509100966Siwasaki    if (rec != NULL) {
510151937Sjkim      enqueue_pending_recorder(rec);
511151937Sjkim      thread->set_recorder(NULL);
512151937Sjkim    }
513151937Sjkim  }
514151937Sjkim}
515100966Siwasaki
516100966Siwasaki// baseline current memory snapshot
517151937Sjkimbool MemTracker::baseline() {
518151937Sjkim  MutexLocker lock(_query_lock);
519100966Siwasaki  MemSnapshot* snapshot = get_snapshot();
520100966Siwasaki  if (snapshot != NULL) {
521100966Siwasaki    return _baseline.baseline(*snapshot, false);
522151937Sjkim  }
523151937Sjkim  return false;
524151937Sjkim}
525151937Sjkim
526100966Siwasaki// print memory usage from current snapshot
527100966Siwasakibool MemTracker::print_memory_usage(BaselineOutputer& out, size_t unit, bool summary_only) {
528100966Siwasaki  MemBaseline  baseline;
529100966Siwasaki  MutexLocker  lock(_query_lock);
530100966Siwasaki  MemSnapshot* snapshot = get_snapshot();
531100966Siwasaki  if (snapshot != NULL && baseline.baseline(*snapshot, summary_only)) {
532100966Siwasaki    BaselineReporter reporter(out, unit);
533100966Siwasaki    reporter.report_baseline(baseline, summary_only);
534100966Siwasaki    return true;
535100966Siwasaki  }
536100966Siwasaki  return false;
537100966Siwasaki}
538100966Siwasaki
539198237Sjkim// Whitebox API for blocking until the current generation of NMT data has been merged
540198237Sjkimbool MemTracker::wbtest_wait_for_data_merge() {
541198237Sjkim  // NMT can't be shutdown while we're holding _query_lock
542198237Sjkim  MutexLocker lock(_query_lock);
543198237Sjkim  assert(_worker_thread != NULL, "Invalid query");
544198237Sjkim  // the generation at query time, so NMT will spin till this generation is processed
545198237Sjkim  unsigned long generation_at_query_time = SequenceGenerator::current_generation();
546198237Sjkim  unsigned long current_processing_generation = _processing_generation;
547198237Sjkim  // if generation counter overflown
548198237Sjkim  bool generation_overflown = (generation_at_query_time < current_processing_generation);
549198237Sjkim  long generations_to_wrap = MAX_UNSIGNED_LONG - current_processing_generation;
550198237Sjkim  // spin
551198237Sjkim  while (!shutdown_in_progress()) {
552198237Sjkim    if (!generation_overflown) {
553198237Sjkim      if (current_processing_generation > generation_at_query_time) {
554198237Sjkim        return true;
555198237Sjkim      }
556198237Sjkim    } else {
557198237Sjkim      assert(generations_to_wrap >= 0, "Sanity check");
558198237Sjkim      long current_generations_to_wrap = MAX_UNSIGNED_LONG - current_processing_generation;
559198237Sjkim      assert(current_generations_to_wrap >= 0, "Sanity check");
560198237Sjkim      // to overflow an unsigned long should take long time, so to_wrap check should be sufficient
561198237Sjkim      if (current_generations_to_wrap > generations_to_wrap &&
562198237Sjkim          current_processing_generation > generation_at_query_time) {
563198237Sjkim        return true;
564198237Sjkim      }
565198237Sjkim    }
566100966Siwasaki
567100966Siwasaki    // if worker thread is idle, but generation is not advancing, that means
568151937Sjkim    // there is not safepoint to let NMT advance generation, force one.
569151937Sjkim    if (_worker_thread_idle) {
570151937Sjkim      VM_ForceSafepoint vfs;
571151937Sjkim      VMThread::execute(&vfs);
572100966Siwasaki    }
573100966Siwasaki    MemSnapshot* snapshot = get_snapshot();
574151937Sjkim    if (snapshot == NULL) {
575151937Sjkim      return false;
576151937Sjkim    }
577100966Siwasaki    snapshot->wait(1000);
578100966Siwasaki    current_processing_generation = _processing_generation;
579151937Sjkim  }
580151937Sjkim  // We end up here if NMT is shutting down before our data has been merged
581151937Sjkim  return false;
582100966Siwasaki}
583100966Siwasaki
584151937Sjkim// compare memory usage between current snapshot and baseline
585151937Sjkimbool MemTracker::compare_memory_usage(BaselineOutputer& out, size_t unit, bool summary_only) {
586151937Sjkim  MutexLocker lock(_query_lock);
587151937Sjkim  if (_baseline.baselined()) {
588151937Sjkim    MemBaseline baseline;
589151937Sjkim    MemSnapshot* snapshot = get_snapshot();
590102550Siwasaki    if (snapshot != NULL && baseline.baseline(*snapshot, summary_only)) {
591167802Sjkim      BaselineReporter reporter(out, unit);
592100966Siwasaki      reporter.diff_baselines(baseline, _baseline, summary_only);
593100966Siwasaki      return true;
594100966Siwasaki    }
595167802Sjkim  }
596151937Sjkim  return false;
597100966Siwasaki}
598100966Siwasaki
599100966Siwasaki#ifndef PRODUCT
600100966Siwasakivoid MemTracker::walk_stack(int toSkip, char* buf, int len) {
601100966Siwasaki  int cur_len = 0;
602100966Siwasaki  char tmp[1024];
603107325Siwasaki  address pc;
604167802Sjkim
605167802Sjkim  while (cur_len < len) {
606151937Sjkim    pc = os::get_caller_pc(toSkip + 1);
607167802Sjkim    if (pc != NULL && os::dll_address_to_function_name(pc, tmp, sizeof(tmp), NULL)) {
608100966Siwasaki      jio_snprintf(&buf[cur_len], (len - cur_len), "%s\n", tmp);
609100966Siwasaki      cur_len = (int)strlen(buf);
610100966Siwasaki    } else {
611100966Siwasaki      buf[cur_len] = '\0';
612100966Siwasaki      break;
613151937Sjkim    }
614100966Siwasaki    toSkip ++;
615100966Siwasaki  }
616100966Siwasaki}
617100966Siwasaki
618100966Siwasakivoid MemTracker::print_tracker_stats(outputStream* st) {
619151937Sjkim  st->print_cr("\nMemory Tracker Stats:");
620100966Siwasaki  st->print_cr("\tMax sequence number = %d", SequenceGenerator::max_seq_num());
621100966Siwasaki  st->print_cr("\tthead count = %d", _thread_count);
622100966Siwasaki  st->print_cr("\tArena instance = %d", Arena::_instance_count);
623100966Siwasaki  st->print_cr("\tpooled recorder count = %d", _pooled_recorder_count);
624151937Sjkim  st->print_cr("\tqueued recorder count = %d", _pending_recorder_count);
625151937Sjkim  st->print_cr("\tmemory recorder instance count = %d", MemRecorder::_instance_count);
626151937Sjkim  if (_worker_thread != NULL) {
627151937Sjkim    st->print_cr("\tWorker thread:");
628151937Sjkim    st->print_cr("\t\tSync point count = %d", _worker_thread->_sync_point_count);
629151937Sjkim    st->print_cr("\t\tpending recorder count = %d", _worker_thread->count_pending_recorders());
630100966Siwasaki    st->print_cr("\t\tmerge count = %d", _worker_thread->_merge_count);
631151937Sjkim  } else {
632100966Siwasaki    st->print_cr("\tWorker thread is not started");
633100966Siwasaki  }
634100966Siwasaki  st->print_cr(" ");
635100966Siwasaki
636100966Siwasaki  if (_snapshot != NULL) {
637151937Sjkim    _snapshot->print_snapshot_stats(st);
638100966Siwasaki  } else {
639100966Siwasaki    st->print_cr("No snapshot");
640100966Siwasaki  }
641100966Siwasaki}
642100966Siwasaki#endif
643151937Sjkim
644100966Siwasaki
645100966Siwasaki// Tracker Implementation
646100966Siwasaki
647100966Siwasaki/*
648151937Sjkim * Create a tracker.
649151937Sjkim * This is a fairly complicated constructor, as it has to make two important decisions:
650100966Siwasaki *   1) Does it need to take ThreadCritical lock to write tracking record
651100966Siwasaki *   2) Does it need to pre-reserve a sequence number for the tracking record
652100966Siwasaki *
653100966Siwasaki * The rules to determine if ThreadCritical is needed:
654100966Siwasaki *   1. When nmt is in single-threaded bootstrapping mode, no lock is needed as VM
655151937Sjkim *      still in single thread mode.
656100966Siwasaki *   2. For all threads other than JavaThread, ThreadCritical is needed
657100966Siwasaki *      to write to recorders to global recorder.
658100966Siwasaki *   3. For JavaThreads that are no longer visible by safepoint, also
659100966Siwasaki *      need to take ThreadCritical and records are written to global
660100966Siwasaki *      recorders, since these threads are NOT walked by Threads.do_thread().
661151937Sjkim *   4. JavaThreads that are running in safepoint-safe states do not stop
662100966Siwasaki *      for safepoints, ThreadCritical lock should be taken to write
663100966Siwasaki *      memory records.
664100966Siwasaki *   5. JavaThreads that are running in VM state do not need any lock and
665100966Siwasaki *      records are written to per-thread recorders.
666100966Siwasaki *   6. For a thread has yet to attach VM 'Thread', they need to take
667151937Sjkim *      ThreadCritical to write to global recorder.
668100966Siwasaki *
669100966Siwasaki *  The memory operations that need pre-reserve sequence numbers:
670100966Siwasaki *    The memory operations that "release" memory blocks and the
671151937Sjkim *    operations can fail, need to pre-reserve sequence number. They
672151937Sjkim *    are realloc, uncommit and release.
673151937Sjkim *
674151937Sjkim *  The reason for pre-reserve sequence number, is to prevent race condition:
675151937Sjkim *    Thread 1                      Thread 2
676151937Sjkim *    <release>
677100966Siwasaki *                                  <allocate>
678151937Sjkim *                                  <write allocate record>
679100966Siwasaki *   <write release record>
680100966Siwasaki *   if Thread 2 happens to obtain the memory address Thread 1 just released,
681100966Siwasaki *   then NMT can mistakenly report the memory is free.
682100966Siwasaki *
683100966Siwasaki *  Noticeably, free() does not need pre-reserve sequence number, because the call
684151937Sjkim *  does not fail, so we can alway write "release" record before the memory is actaully
685100966Siwasaki *  freed.
686100966Siwasaki *
687100966Siwasaki *  For realloc, uncommit and release, following coding pattern should be used:
688100966Siwasaki *
689100966Siwasaki *     MemTracker::Tracker tkr = MemTracker::get_realloc_tracker();
690151937Sjkim *     ptr = ::realloc(...);
691100966Siwasaki *     if (ptr == NULL) {
692100966Siwasaki *       tkr.record(...)
693100966Siwasaki *     } else {
694100966Siwasaki *       tkr.discard();
695100966Siwasaki *     }
696151937Sjkim *
697100966Siwasaki *     MemTracker::Tracker tkr = MemTracker::get_virtual_memory_uncommit_tracker();
698100966Siwasaki *     if (uncommit(...)) {
699100966Siwasaki *       tkr.record(...);
700100966Siwasaki *     } else {
701100966Siwasaki *       tkr.discard();
702151937Sjkim *     }
703100966Siwasaki *
704100966Siwasaki *     MemTracker::Tracker tkr = MemTracker::get_virtual_memory_release_tracker();
705100966Siwasaki *     if (release(...)) {
706100966Siwasaki *       tkr.record(...);
707100966Siwasaki *     } else {
708151937Sjkim *       tkr.discard();
709100966Siwasaki *     }
710100966Siwasaki *
711100966Siwasaki * Since pre-reserved sequence number is only good for the generation that it is acquired,
712100966Siwasaki * when there is pending Tracker that reserved sequence number, NMT sync-point has
713100966Siwasaki * to be skipped to prevent from advancing generation. This is done by inc and dec
714151937Sjkim * MemTracker::_pending_op_count, when MemTracker::_pending_op_count > 0, NMT sync-point is skipped.
715100966Siwasaki * Not all pre-reservation of sequence number will increment pending op count. For JavaThreads
716100966Siwasaki * that honor safepoints, safepoint can not occur during the memory operations, so the
717100966Siwasaki * pre-reserved sequence number won't cross the generation boundry.
718100966Siwasaki */
719100966SiwasakiMemTracker::Tracker::Tracker(MemoryOperation op, Thread* thr) {
720151937Sjkim  _op = NoOp;
721100966Siwasaki  _seq = 0;
722100966Siwasaki  if (MemTracker::is_on()) {
723100966Siwasaki    _java_thread = NULL;
724100966Siwasaki    _op = op;
725128212Snjl
726128212Snjl    // figure out if ThreadCritical lock is needed to write this operation
727128212Snjl    // to MemTracker
728128212Snjl    if (MemTracker::is_single_threaded_bootstrap()) {
729198237Sjkim      thr = NULL;
730198237Sjkim    } else if (thr == NULL) {
731128212Snjl      // don't use Thread::current(), since it is possible that
732198237Sjkim      // the calling thread has yet to attach to VM 'Thread',
733198237Sjkim      // which will result assertion failure
734198237Sjkim      thr = ThreadLocalStorage::thread();
735198237Sjkim    }
736198237Sjkim
737198237Sjkim    if (thr != NULL) {
738198237Sjkim      // Check NMT load
739198237Sjkim      MemTracker::check_NMT_load(thr);
740198237Sjkim
741198237Sjkim      if (thr->is_Java_thread() && ((JavaThread*)thr)->is_safepoint_visible()) {
742198237Sjkim        _java_thread = (JavaThread*)thr;
743198237Sjkim        JavaThreadState  state = _java_thread->thread_state();
744198237Sjkim        // JavaThreads that are safepoint safe, can run through safepoint,
745167802Sjkim        // so ThreadCritical is needed to ensure no threads at safepoint create
746167802Sjkim        // new records while the records are being gathered and the sequence number is changing
747167802Sjkim        _need_thread_critical_lock =
748167802Sjkim          SafepointSynchronize::safepoint_safe(_java_thread, state);
749167802Sjkim      } else {
750167802Sjkim        _need_thread_critical_lock = true;
751167802Sjkim      }
752167802Sjkim    } else {
753167802Sjkim       _need_thread_critical_lock
754167802Sjkim         = !MemTracker::is_single_threaded_bootstrap();
755167802Sjkim    }
756167802Sjkim
757100966Siwasaki    // see if we need to pre-reserve sequence number for this operation
758    if (_op == Realloc || _op == Uncommit || _op == Release) {
759      if (_need_thread_critical_lock) {
760        ThreadCritical tc;
761        MemTracker::inc_pending_op_count();
762        _seq = SequenceGenerator::next();
763      } else {
764        // for the threads that honor safepoints, no safepoint can occur
765        // during the lifespan of tracker, so we don't need to increase
766        // pending op count.
767        _seq = SequenceGenerator::next();
768      }
769    }
770  }
771}
772
773void MemTracker::Tracker::discard() {
774  if (MemTracker::is_on() && _seq != 0) {
775    if (_need_thread_critical_lock) {
776      ThreadCritical tc;
777      MemTracker::dec_pending_op_count();
778    }
779    _seq = 0;
780  }
781}
782
783
784void MemTracker::Tracker::record(address old_addr, address new_addr, size_t size,
785  MEMFLAGS flags, address pc) {
786  assert(old_addr != NULL && new_addr != NULL, "Sanity check");
787  assert(_op == Realloc || _op == NoOp, "Wrong call");
788  if (MemTracker::is_on() && NMT_CAN_TRACK(flags) && _op != NoOp && !MemTracker::shutdown_in_progress()) {
789    assert(_seq > 0, "Need pre-reserve sequence number");
790    if (_need_thread_critical_lock) {
791      ThreadCritical tc;
792      // free old address, use pre-reserved sequence number
793      MemTracker::write_tracking_record(old_addr, MemPointerRecord::free_tag(),
794        0, _seq, pc, _java_thread);
795      MemTracker::write_tracking_record(new_addr, flags | MemPointerRecord::malloc_tag(),
796        size, SequenceGenerator::next(), pc, _java_thread);
797      // decrement MemTracker pending_op_count
798      MemTracker::dec_pending_op_count();
799    } else {
800      // free old address, use pre-reserved sequence number
801      MemTracker::write_tracking_record(old_addr, MemPointerRecord::free_tag(),
802        0, _seq, pc, _java_thread);
803      MemTracker::write_tracking_record(new_addr, flags | MemPointerRecord::malloc_tag(),
804        size, SequenceGenerator::next(), pc, _java_thread);
805    }
806    _seq = 0;
807  }
808}
809
810void MemTracker::Tracker::record(address addr, size_t size, MEMFLAGS flags, address pc) {
811  // OOM already?
812  if (addr == NULL) return;
813
814  if (MemTracker::is_on() && NMT_CAN_TRACK(flags) && _op != NoOp && !MemTracker::shutdown_in_progress()) {
815    bool pre_reserved_seq = (_seq != 0);
816    address  pc = CALLER_CALLER_PC;
817    MEMFLAGS orig_flags = flags;
818
819    // or the tagging flags
820    switch(_op) {
821      case Malloc:
822        flags |= MemPointerRecord::malloc_tag();
823        break;
824      case Free:
825        flags = MemPointerRecord::free_tag();
826        break;
827      case Realloc:
828        fatal("Use the other Tracker::record()");
829        break;
830      case Reserve:
831      case ReserveAndCommit:
832        flags |= MemPointerRecord::virtual_memory_reserve_tag();
833        break;
834      case Commit:
835        flags = MemPointerRecord::virtual_memory_commit_tag();
836        break;
837      case Type:
838        flags |= MemPointerRecord::virtual_memory_type_tag();
839        break;
840      case Uncommit:
841        assert(pre_reserved_seq, "Need pre-reserve sequence number");
842        flags = MemPointerRecord::virtual_memory_uncommit_tag();
843        break;
844      case Release:
845        assert(pre_reserved_seq, "Need pre-reserve sequence number");
846        flags = MemPointerRecord::virtual_memory_release_tag();
847        break;
848      case ArenaSize:
849        // a bit of hack here, add a small postive offset to arena
850        // address for its size record, so the size record is sorted
851        // right after arena record.
852        flags = MemPointerRecord::arena_size_tag();
853        addr += sizeof(void*);
854        break;
855      case StackRelease:
856        flags = MemPointerRecord::virtual_memory_release_tag();
857        break;
858      default:
859        ShouldNotReachHere();
860    }
861
862    // write memory tracking record
863    if (_need_thread_critical_lock) {
864      ThreadCritical tc;
865      if (_seq == 0) _seq = SequenceGenerator::next();
866      MemTracker::write_tracking_record(addr, flags, size, _seq, pc, _java_thread);
867      if (_op == ReserveAndCommit) {
868        MemTracker::write_tracking_record(addr, orig_flags | MemPointerRecord::virtual_memory_commit_tag(),
869          size, SequenceGenerator::next(), pc, _java_thread);
870      }
871      if (pre_reserved_seq) MemTracker::dec_pending_op_count();
872    } else {
873      if (_seq == 0) _seq = SequenceGenerator::next();
874      MemTracker::write_tracking_record(addr, flags, size, _seq, pc, _java_thread);
875      if (_op == ReserveAndCommit) {
876        MemTracker::write_tracking_record(addr, orig_flags | MemPointerRecord::virtual_memory_commit_tag(),
877          size, SequenceGenerator::next(), pc, _java_thread);
878      }
879    }
880    _seq = 0;
881  }
882}
883
884