src/hotspot/share/services/threadStackTracker.cpp
author herrick
Fri, 18 Oct 2019 14:14:37 -0400
branchJDK-8200758-branch
changeset 58696 61c44899b4eb
parent 54292 c31faeacf00a
child 59290 97d13893ec3c
permissions -rw-r--r--
8223325: Improve wix sources generated by jpackage Submitted-by: asemenyuk Reviewed-by: aherrick, almatvee
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/atomic.hpp"
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    27
#include "runtime/threadCritical.hpp"
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    28
#include "services/mallocTracker.hpp"
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    29
#include "services/memTracker.hpp"
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    30
#include "services/virtualMemoryTracker.hpp"
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    31
#include "services/threadStackTracker.hpp"
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    32
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    33
volatile size_t ThreadStackTracker::_thread_count = 0;
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    34
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
    35
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    36
bool ThreadStackTracker::late_initialize(NMT_TrackingLevel level) {
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    37
  if (level == NMT_detail && !track_as_vm()) {
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    38
    _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
    39
      SortedLinkedList<SimpleThreadStackSite, ThreadStackTracker::compare_thread_stack_base>();
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    40
    return (_simple_thread_stacks != NULL);
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    41
  }
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    42
  return true;
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
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    45
bool ThreadStackTracker::transition(NMT_TrackingLevel from, NMT_TrackingLevel to) {
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    46
  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
    47
  if (to == NMT_minimal) {
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    48
    assert(from == NMT_summary || from == NMT_detail, "Just check");
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    49
    ThreadCritical tc;
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    50
    if (_simple_thread_stacks != NULL) {
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    51
      delete _simple_thread_stacks;
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    52
      _simple_thread_stacks = NULL;
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
  }
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    55
  return true;
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
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    58
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
    59
  return s1.base() - s2.base();
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
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    62
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
    63
  assert(MemTracker::tracking_level() >= NMT_summary, "Must be");
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    64
  assert(base != NULL, "Should have been filtered");
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    65
  if (track_as_vm()) {
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    66
    ThreadCritical tc;
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    67
    VirtualMemoryTracker::add_reserved_region((address)base, size, stack, mtThreadStack);
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    68
    _thread_count ++;
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    69
  } else {
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    70
    // Use a slot in mallocMemorySummary for thread stack bookkeeping
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    71
    MallocMemorySummary::record_malloc(size, mtThreadStack);
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    72
    if (MemTracker::tracking_level() == NMT_detail) {
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    73
      ThreadCritical tc;
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    74
      assert(_simple_thread_stacks != NULL, "Must be initialized");
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    75
      SimpleThreadStackSite site((address)base, size, stack);
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    76
      _simple_thread_stacks->add(site);
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
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    81
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
    82
  assert(MemTracker::tracking_level() >= NMT_summary, "Must be");
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    83
  assert(base != NULL, "Should have been filtered");
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    84
  if(track_as_vm()) {
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    85
    ThreadCritical tc;
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    86
    VirtualMemoryTracker::remove_released_region((address)base, size);
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    87
    _thread_count--;
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    88
  } else {
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    89
    // Use a slot in mallocMemorySummary for thread stack bookkeeping
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    90
    MallocMemorySummary::record_free(size, mtThreadStack);
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    91
    if (MemTracker::tracking_level() == NMT_detail) {
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    92
      ThreadCritical tc;
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    93
      assert(_simple_thread_stacks != NULL, "Must be initialized");
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    94
      SimpleThreadStackSite site((address)base, size);
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    95
      bool removed = _simple_thread_stacks->remove(site);
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
    96
      assert(removed, "Must exist");
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
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
   101
bool ThreadStackTracker::walk_simple_thread_stack_site(MallocSiteWalker* walker) {
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
   102
  if (!track_as_vm()) {
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
   103
    LinkedListImpl<MallocSite> _sites;
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
   104
    {
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
   105
      ThreadCritical tc;
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
   106
      assert(_simple_thread_stacks != NULL, "Must be initialized");
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
   107
      LinkedListIterator<SimpleThreadStackSite> itr(_simple_thread_stacks->head());
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
   108
      const SimpleThreadStackSite* ts = itr.next();
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
   109
      // 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
   110
      // malloc snapshot
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
   111
      while (ts != NULL) {
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
   112
        MallocSite site(*ts->call_stack(), mtThreadStack);
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
   113
        MallocSite* exist = _sites.find(site);
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
   114
        if (exist != NULL) {
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
   115
          exist->allocate(ts->size());
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
   116
        } else {
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
   117
          site.allocate(ts->size());
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
   118
          _sites.add(site);
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
   119
        }
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
   120
        ts = itr.next();
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
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
   124
    // Piggyback to malloc snapshot
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
   125
    LinkedListIterator<MallocSite> site_itr(_sites.head());
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
   126
    const MallocSite* s = site_itr.next();
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
   127
    while (s != NULL) {
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
   128
      walker->do_malloc_site(s);
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
   129
      s = site_itr.next();
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
  }
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
   132
  return true;
c31faeacf00a 8204552: NMT: Separate thread stack tracking from virtual memory tracking
zgu
parents:
diff changeset
   133
}