src/hotspot/share/services/threadStackTracker.cpp
author stefank
Tue, 26 Nov 2019 10:47:46 +0100
changeset 59290 97d13893ec3c
parent 54292 c31faeacf00a
permissions -rw-r--r--
8234748: Clean up atomic and orderAccess includes Reviewed-by: dholmes
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
54292
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
     1
/*
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
     2
 * Copyright (c) 2019, Red Hat, Inc. All rights reserved.
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
     3
 *
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
     4
 * This code is free software; you can redistribute it and/or modify it
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
     5
 * under the terms of the GNU General Public License version 2 only, as
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
     6
 * published by the Free Software Foundation.
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
     7
 *
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
     8
 * This code is distributed in the hope that it will be useful, but WITHOUT
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
     9
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    10
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    11
 * version 2 for more details (a copy is included in the LICENSE file that
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    12
 * accompanied this code).
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    13
 *
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    14
 * You should have received a copy of the GNU General Public License version
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    15
 * 2 along with this work; if not, write to the Free Software Foundation,
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    16
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    17
 *
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    18
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    19
 * or visit www.oracle.com if you need additional information or have any
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    20
 * questions.
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    21
 *
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    22
 */
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    23
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    24
#include "precompiled.hpp"
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    25
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    26
#include "runtime/threadCritical.hpp"
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    27
#include "services/mallocTracker.hpp"
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    28
#include "services/memTracker.hpp"
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    29
#include "services/virtualMemoryTracker.hpp"
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    30
#include "services/threadStackTracker.hpp"
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    31
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    32
volatile size_t ThreadStackTracker::_thread_count = 0;
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    33
SortedLinkedList<SimpleThreadStackSite, ThreadStackTracker::compare_thread_stack_base>* ThreadStackTracker::_simple_thread_stacks = NULL;
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    34
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    35
bool ThreadStackTracker::late_initialize(NMT_TrackingLevel level) {
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    36
  if (level == NMT_detail && !track_as_vm()) {
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    37
    _simple_thread_stacks = new (std::nothrow, ResourceObj::C_HEAP, mtNMT)
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    38
      SortedLinkedList<SimpleThreadStackSite, ThreadStackTracker::compare_thread_stack_base>();
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    39
    return (_simple_thread_stacks != NULL);
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    40
  }
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    41
  return true;
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    42
}
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    43
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    44
bool ThreadStackTracker::transition(NMT_TrackingLevel from, NMT_TrackingLevel to) {
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    45
  assert (from != NMT_minimal, "cannot convert from the lowest tracking level to anything");
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    46
  if (to == NMT_minimal) {
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    47
    assert(from == NMT_summary || from == NMT_detail, "Just check");
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    48
    ThreadCritical tc;
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    49
    if (_simple_thread_stacks != NULL) {
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    50
      delete _simple_thread_stacks;
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    51
      _simple_thread_stacks = NULL;
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    52
    }
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    53
  }
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    54
  return true;
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    55
}
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    56
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    57
int ThreadStackTracker::compare_thread_stack_base(const SimpleThreadStackSite& s1, const SimpleThreadStackSite& s2) {
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    58
  return s1.base() - s2.base();
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    59
}
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    60
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    61
void ThreadStackTracker::new_thread_stack(void* base, size_t size, const NativeCallStack& stack) {
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    62
  assert(MemTracker::tracking_level() >= NMT_summary, "Must be");
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    63
  assert(base != NULL, "Should have been filtered");
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    64
  if (track_as_vm()) {
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    65
    ThreadCritical tc;
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    66
    VirtualMemoryTracker::add_reserved_region((address)base, size, stack, mtThreadStack);
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    67
    _thread_count ++;
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    68
  } else {
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    69
    // Use a slot in mallocMemorySummary for thread stack bookkeeping
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    70
    MallocMemorySummary::record_malloc(size, mtThreadStack);
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    71
    if (MemTracker::tracking_level() == NMT_detail) {
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    72
      ThreadCritical tc;
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    73
      assert(_simple_thread_stacks != NULL, "Must be initialized");
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    74
      SimpleThreadStackSite site((address)base, size, stack);
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    75
      _simple_thread_stacks->add(site);
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    76
    }
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    77
  }
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    78
}
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    79
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    80
void ThreadStackTracker::delete_thread_stack(void* base, size_t size) {
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    81
  assert(MemTracker::tracking_level() >= NMT_summary, "Must be");
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    82
  assert(base != NULL, "Should have been filtered");
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    83
  if(track_as_vm()) {
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    84
    ThreadCritical tc;
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    85
    VirtualMemoryTracker::remove_released_region((address)base, size);
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    86
    _thread_count--;
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    87
  } else {
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    88
    // Use a slot in mallocMemorySummary for thread stack bookkeeping
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    89
    MallocMemorySummary::record_free(size, mtThreadStack);
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    90
    if (MemTracker::tracking_level() == NMT_detail) {
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    91
      ThreadCritical tc;
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    92
      assert(_simple_thread_stacks != NULL, "Must be initialized");
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    93
      SimpleThreadStackSite site((address)base, size);
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    94
      bool removed = _simple_thread_stacks->remove(site);
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    95
      assert(removed, "Must exist");
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    96
    }
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    97
  }
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    98
}
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    99
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
   100
bool ThreadStackTracker::walk_simple_thread_stack_site(MallocSiteWalker* walker) {
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
   101
  if (!track_as_vm()) {
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
   102
    LinkedListImpl<MallocSite> _sites;
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
   103
    {
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
   104
      ThreadCritical tc;
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
   105
      assert(_simple_thread_stacks != NULL, "Must be initialized");
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
   106
      LinkedListIterator<SimpleThreadStackSite> itr(_simple_thread_stacks->head());
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
   107
      const SimpleThreadStackSite* ts = itr.next();
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
   108
      // Consolidate sites and convert to MallocSites, so we can piggyback into
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
   109
      // malloc snapshot
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
   110
      while (ts != NULL) {
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
   111
        MallocSite site(*ts->call_stack(), mtThreadStack);
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
   112
        MallocSite* exist = _sites.find(site);
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
   113
        if (exist != NULL) {
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
   114
          exist->allocate(ts->size());
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
   115
        } else {
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
   116
          site.allocate(ts->size());
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
   117
          _sites.add(site);
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
   118
        }
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
   119
        ts = itr.next();
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
   120
      }
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
   121
    }
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
   122
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
   123
    // Piggyback to malloc snapshot
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
   124
    LinkedListIterator<MallocSite> site_itr(_sites.head());
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
   125
    const MallocSite* s = site_itr.next();
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
   126
    while (s != NULL) {
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
   127
      walker->do_malloc_site(s);
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
   128
      s = site_itr.next();
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
   129
    }
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
   130
  }
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
   131
  return true;
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
   132
}