hotspot/src/share/vm/services/memSnapshot.cpp
author drchase
Fri, 09 May 2014 16:50:54 -0400
changeset 24424 2658d7834c6e
parent 17302 915323420691
permissions -rw-r--r--
8037816: Fix for 8036122 breaks build with Xcode5/clang Summary: Repaired or selectively disabled offending formats; future-proofed with additional checking Reviewed-by: kvn, jrose, stefank
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
     1
/*
24424
2658d7834c6e 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 17302
diff changeset
     2
 * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
     4
 *
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
     7
 * published by the Free Software Foundation.
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
     8
 *
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
    13
 * accompanied this code).
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
    14
 *
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
    18
 *
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
    21
 * questions.
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
    22
 *
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
    23
 */
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
    24
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
    25
#include "precompiled.hpp"
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
    26
#include "runtime/mutexLocker.hpp"
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
    27
#include "utilities/decoder.hpp"
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
    28
#include "services/memBaseline.hpp"
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
    29
#include "services/memPtr.hpp"
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
    30
#include "services/memPtrArray.hpp"
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
    31
#include "services/memSnapshot.hpp"
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
    32
#include "services/memTracker.hpp"
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
    33
24424
2658d7834c6e 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 17302
diff changeset
    34
PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC
2658d7834c6e 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 17302
diff changeset
    35
14388
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
    36
#ifdef ASSERT
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
    37
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
    38
void decode_pointer_record(MemPointerRecord* rec) {
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
    39
  tty->print("Pointer: [" PTR_FORMAT " - " PTR_FORMAT  "] size = %d bytes", rec->addr(),
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
    40
    rec->addr() + rec->size(), (int)rec->size());
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
    41
  tty->print(" type = %s", MemBaseline::type2name(FLAGS_TO_MEMORY_TYPE(rec->flags())));
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
    42
  if (rec->is_vm_pointer()) {
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
    43
    if (rec->is_allocation_record()) {
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
    44
      tty->print_cr(" (reserve)");
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
    45
    } else if (rec->is_commit_record()) {
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
    46
      tty->print_cr(" (commit)");
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
    47
    } else if (rec->is_uncommit_record()) {
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
    48
      tty->print_cr(" (uncommit)");
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
    49
    } else if (rec->is_deallocation_record()) {
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
    50
      tty->print_cr(" (release)");
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
    51
    } else {
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
    52
      tty->print_cr(" (tag)");
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
    53
    }
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
    54
  } else {
14484
901d216b74bf 8001592: NMT: assertion failed: assert(_amount >= amt) failed: Just check: memBaseline.hpp:180
zgu
parents: 14388
diff changeset
    55
    if (rec->is_arena_memory_record()) {
14388
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
    56
      tty->print_cr(" (arena size)");
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
    57
    } else if (rec->is_allocation_record()) {
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
    58
      tty->print_cr(" (malloc)");
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
    59
    } else {
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
    60
      tty->print_cr(" (free)");
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
    61
    }
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
    62
  }
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
    63
  if (MemTracker::track_callsite()) {
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
    64
    char buf[1024];
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
    65
    address pc = ((MemPointerRecordEx*)rec)->pc();
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
    66
    if (pc != NULL && os::dll_address_to_function_name(pc, buf, sizeof(buf), NULL)) {
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
    67
      tty->print_cr("\tfrom %s", buf);
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
    68
    } else {
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
    69
      tty->print_cr("\tcould not decode pc = " PTR_FORMAT "", pc);
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
    70
    }
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
    71
  }
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
    72
}
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
    73
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
    74
void decode_vm_region_record(VMMemRegion* rec) {
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
    75
  tty->print("VM Region [" PTR_FORMAT " - " PTR_FORMAT "]", rec->addr(),
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
    76
    rec->addr() + rec->size());
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
    77
  tty->print(" type = %s", MemBaseline::type2name(FLAGS_TO_MEMORY_TYPE(rec->flags())));
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
    78
  if (rec->is_allocation_record()) {
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
    79
    tty->print_cr(" (reserved)");
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
    80
  } else if (rec->is_commit_record()) {
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
    81
    tty->print_cr(" (committed)");
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
    82
  } else {
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
    83
    ShouldNotReachHere();
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
    84
  }
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
    85
  if (MemTracker::track_callsite()) {
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
    86
    char buf[1024];
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
    87
    address pc = ((VMMemRegionEx*)rec)->pc();
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
    88
    if (pc != NULL && os::dll_address_to_function_name(pc, buf, sizeof(buf), NULL)) {
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
    89
      tty->print_cr("\tfrom %s", buf);
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
    90
    } else {
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
    91
      tty->print_cr("\tcould not decode pc = " PTR_FORMAT "", pc);
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
    92
    }
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
    93
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
    94
  }
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
    95
}
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
    96
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
    97
#endif
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
    98
14120
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
    99
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   100
bool VMMemPointerIterator::insert_record(MemPointerRecord* rec) {
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   101
  VMMemRegionEx new_rec;
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   102
  assert(rec->is_allocation_record() || rec->is_commit_record(),
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   103
    "Sanity check");
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   104
  if (MemTracker::track_callsite()) {
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   105
    new_rec.init((MemPointerRecordEx*)rec);
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   106
  } else {
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   107
    new_rec.init(rec);
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   108
  }
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   109
  return insert(&new_rec);
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   110
}
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   111
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   112
bool VMMemPointerIterator::insert_record_after(MemPointerRecord* rec) {
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   113
  VMMemRegionEx new_rec;
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   114
  assert(rec->is_allocation_record() || rec->is_commit_record(),
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   115
    "Sanity check");
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   116
  if (MemTracker::track_callsite()) {
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   117
    new_rec.init((MemPointerRecordEx*)rec);
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   118
  } else {
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   119
    new_rec.init(rec);
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   120
  }
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   121
  return insert_after(&new_rec);
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   122
}
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   123
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   124
// we don't consolidate reserved regions, since they may be categorized
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   125
// in different types.
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   126
bool VMMemPointerIterator::add_reserved_region(MemPointerRecord* rec) {
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   127
  assert(rec->is_allocation_record(), "Sanity check");
14482
e63476fd259a 8002273: NMT to report JNI memory leaks when -Xcheck:jni is on
zgu
parents: 14388
diff changeset
   128
  VMMemRegion* reserved_region = (VMMemRegion*)current();
14120
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   129
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   130
  // we don't have anything yet
14482
e63476fd259a 8002273: NMT to report JNI memory leaks when -Xcheck:jni is on
zgu
parents: 14388
diff changeset
   131
  if (reserved_region == NULL) {
14120
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   132
    return insert_record(rec);
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   133
  }
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   134
14482
e63476fd259a 8002273: NMT to report JNI memory leaks when -Xcheck:jni is on
zgu
parents: 14388
diff changeset
   135
  assert(reserved_region->is_reserved_region(), "Sanity check");
14120
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   136
  // duplicated records
14482
e63476fd259a 8002273: NMT to report JNI memory leaks when -Xcheck:jni is on
zgu
parents: 14388
diff changeset
   137
  if (reserved_region->is_same_region(rec)) {
14120
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   138
    return true;
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   139
  }
14482
e63476fd259a 8002273: NMT to report JNI memory leaks when -Xcheck:jni is on
zgu
parents: 14388
diff changeset
   140
  // Overlapping stack regions indicate that a JNI thread failed to
e63476fd259a 8002273: NMT to report JNI memory leaks when -Xcheck:jni is on
zgu
parents: 14388
diff changeset
   141
  // detach from the VM before exiting. This leaks the JavaThread object.
e63476fd259a 8002273: NMT to report JNI memory leaks when -Xcheck:jni is on
zgu
parents: 14388
diff changeset
   142
  if (CheckJNICalls)  {
e63476fd259a 8002273: NMT to report JNI memory leaks when -Xcheck:jni is on
zgu
parents: 14388
diff changeset
   143
      guarantee(FLAGS_TO_MEMORY_TYPE(reserved_region->flags()) != mtThreadStack ||
e63476fd259a 8002273: NMT to report JNI memory leaks when -Xcheck:jni is on
zgu
parents: 14388
diff changeset
   144
         !reserved_region->overlaps_region(rec),
e63476fd259a 8002273: NMT to report JNI memory leaks when -Xcheck:jni is on
zgu
parents: 14388
diff changeset
   145
         "Attached JNI thread exited without being detached");
e63476fd259a 8002273: NMT to report JNI memory leaks when -Xcheck:jni is on
zgu
parents: 14388
diff changeset
   146
  }
e63476fd259a 8002273: NMT to report JNI memory leaks when -Xcheck:jni is on
zgu
parents: 14388
diff changeset
   147
  // otherwise, we should not have overlapping reserved regions
e63476fd259a 8002273: NMT to report JNI memory leaks when -Xcheck:jni is on
zgu
parents: 14388
diff changeset
   148
  assert(FLAGS_TO_MEMORY_TYPE(reserved_region->flags()) == mtThreadStack ||
e63476fd259a 8002273: NMT to report JNI memory leaks when -Xcheck:jni is on
zgu
parents: 14388
diff changeset
   149
    reserved_region->base() > rec->addr(), "Just check: locate()");
e63476fd259a 8002273: NMT to report JNI memory leaks when -Xcheck:jni is on
zgu
parents: 14388
diff changeset
   150
  assert(FLAGS_TO_MEMORY_TYPE(reserved_region->flags()) == mtThreadStack ||
e63476fd259a 8002273: NMT to report JNI memory leaks when -Xcheck:jni is on
zgu
parents: 14388
diff changeset
   151
    !reserved_region->overlaps_region(rec), "overlapping reserved regions");
e63476fd259a 8002273: NMT to report JNI memory leaks when -Xcheck:jni is on
zgu
parents: 14388
diff changeset
   152
14120
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   153
  return insert_record(rec);
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   154
}
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   155
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   156
// we do consolidate committed regions
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   157
bool VMMemPointerIterator::add_committed_region(MemPointerRecord* rec) {
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   158
  assert(rec->is_commit_record(), "Sanity check");
14388
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
   159
  VMMemRegion* reserved_rgn = (VMMemRegion*)current();
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
   160
  assert(reserved_rgn->is_reserved_region() && reserved_rgn->contains_region(rec),
14120
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   161
    "Sanity check");
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   162
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   163
  // thread's native stack is always marked as "committed", ignore
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   164
  // the "commit" operation for creating stack guard pages
14388
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
   165
  if (FLAGS_TO_MEMORY_TYPE(reserved_rgn->flags()) == mtThreadStack &&
14120
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   166
      FLAGS_TO_MEMORY_TYPE(rec->flags()) != mtThreadStack) {
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   167
    return true;
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   168
  }
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   169
14388
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
   170
  // if the reserved region has any committed regions
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
   171
  VMMemRegion* committed_rgn  = (VMMemRegion*)next();
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
   172
  while (committed_rgn != NULL && committed_rgn->is_committed_region()) {
14120
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   173
    // duplicated commit records
14388
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
   174
    if(committed_rgn->contains_region(rec)) {
14120
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   175
      return true;
14388
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
   176
    } else if (committed_rgn->overlaps_region(rec)) {
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
   177
      // overlaps front part
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
   178
      if (rec->addr() < committed_rgn->addr()) {
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
   179
        committed_rgn->expand_region(rec->addr(),
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
   180
          committed_rgn->addr() - rec->addr());
14120
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   181
      } else {
14388
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
   182
        // overlaps tail part
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
   183
        address committed_rgn_end = committed_rgn->addr() +
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
   184
              committed_rgn->size();
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
   185
        assert(committed_rgn_end < rec->addr() + rec->size(),
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
   186
             "overlap tail part");
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
   187
        committed_rgn->expand_region(committed_rgn_end,
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
   188
          (rec->addr() + rec->size()) - committed_rgn_end);
14120
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   189
      }
14388
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
   190
    } else if (committed_rgn->base() + committed_rgn->size() == rec->addr()) {
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
   191
      // adjunct each other
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
   192
      committed_rgn->expand_region(rec->addr(), rec->size());
14120
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   193
      VMMemRegion* next_reg = (VMMemRegion*)next();
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   194
      // see if we can consolidate next committed region
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   195
      if (next_reg != NULL && next_reg->is_committed_region() &&
14388
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
   196
        next_reg->base() == committed_rgn->base() + committed_rgn->size()) {
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
   197
          committed_rgn->expand_region(next_reg->base(), next_reg->size());
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
   198
          // delete merged region
14120
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   199
          remove();
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   200
      }
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   201
      return true;
14388
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
   202
    } else if (committed_rgn->base() > rec->addr()) {
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
   203
      // found the location, insert this committed region
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
   204
      return insert_record(rec);
14120
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   205
    }
14388
2b7db60361a2 8001591: NMT: assertion failed: assert(rec->addr() + rec->size() <= cur->base()) failed: Can not overlap in memSnapshot.cpp
zgu
parents: 14120
diff changeset
   206
    committed_rgn = (VMMemRegion*)next();
14120
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   207
  }
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   208
  return insert_record(rec);
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   209
}
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   210
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   211
bool VMMemPointerIterator::remove_uncommitted_region(MemPointerRecord* rec) {
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   212
  assert(rec->is_uncommit_record(), "sanity check");
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   213
  VMMemRegion* cur;
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   214
  cur = (VMMemRegion*)current();
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   215
  assert(cur->is_reserved_region() && cur->contains_region(rec),
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   216
    "Sanity check");
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   217
  // thread's native stack is always marked as "committed", ignore
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   218
  // the "commit" operation for creating stack guard pages
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   219
  if (FLAGS_TO_MEMORY_TYPE(cur->flags()) == mtThreadStack &&
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   220
      FLAGS_TO_MEMORY_TYPE(rec->flags()) != mtThreadStack) {
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   221
    return true;
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   222
  }
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   223
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   224
  cur = (VMMemRegion*)next();
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   225
  while (cur != NULL && cur->is_committed_region()) {
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   226
    // region already uncommitted, must be due to duplicated record
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   227
    if (cur->addr() >= rec->addr() + rec->size()) {
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   228
      break;
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   229
    } else if (cur->contains_region(rec)) {
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   230
      // uncommit whole region
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   231
      if (cur->is_same_region(rec)) {
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   232
        remove();
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   233
        break;
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   234
      } else if (rec->addr() == cur->addr() ||
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   235
        rec->addr() + rec->size() == cur->addr() + cur->size()) {
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   236
        // uncommitted from either end of current memory region.
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   237
        cur->exclude_region(rec->addr(), rec->size());
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   238
        break;
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   239
      } else { // split the committed region and release the middle
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   240
        address high_addr = cur->addr() + cur->size();
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   241
        size_t sz = high_addr - rec->addr();
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   242
        cur->exclude_region(rec->addr(), sz);
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   243
        sz = high_addr - (rec->addr() + rec->size());
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   244
        if (MemTracker::track_callsite()) {
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   245
          MemPointerRecordEx tmp(rec->addr() + rec->size(), cur->flags(), sz,
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   246
             ((VMMemRegionEx*)cur)->pc());
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   247
          return insert_record_after(&tmp);
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   248
        } else {
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   249
          MemPointerRecord tmp(rec->addr() + rec->size(), cur->flags(), sz);
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   250
          return insert_record_after(&tmp);
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   251
        }
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   252
      }
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   253
    }
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   254
    cur = (VMMemRegion*)next();
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   255
  }
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   256
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   257
  // we may not find committed record due to duplicated records
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   258
  return true;
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   259
}
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   260
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   261
bool VMMemPointerIterator::remove_released_region(MemPointerRecord* rec) {
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   262
  assert(rec->is_deallocation_record(), "Sanity check");
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   263
  VMMemRegion* cur = (VMMemRegion*)current();
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   264
  assert(cur->is_reserved_region() && cur->contains_region(rec),
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   265
    "Sanity check");
14569
96937297368d 8003487: NMT: incorrect assertion in VMMemPointerIterator::remove_released_region method (memSnapshot.cpp)
zgu
parents: 14486
diff changeset
   266
  if (rec->is_same_region(cur)) {
17302
915323420691 8013120: NMT: Kitchensink crashes with assert(next_region == NULL || !next_region->is_committed_region()) failed: Sanity check
zgu
parents: 15797
diff changeset
   267
915323420691 8013120: NMT: Kitchensink crashes with assert(next_region == NULL || !next_region->is_committed_region()) failed: Sanity check
zgu
parents: 15797
diff changeset
   268
    // In snapshot, the virtual memory records are sorted in following orders:
915323420691 8013120: NMT: Kitchensink crashes with assert(next_region == NULL || !next_region->is_committed_region()) failed: Sanity check
zgu
parents: 15797
diff changeset
   269
    // 1. virtual memory's base address
915323420691 8013120: NMT: Kitchensink crashes with assert(next_region == NULL || !next_region->is_committed_region()) failed: Sanity check
zgu
parents: 15797
diff changeset
   270
    // 2. virtual memory reservation record, followed by commit records within this reservation.
915323420691 8013120: NMT: Kitchensink crashes with assert(next_region == NULL || !next_region->is_committed_region()) failed: Sanity check
zgu
parents: 15797
diff changeset
   271
    //    The commit records are also in base address order.
915323420691 8013120: NMT: Kitchensink crashes with assert(next_region == NULL || !next_region->is_committed_region()) failed: Sanity check
zgu
parents: 15797
diff changeset
   272
    // When a reserved region is released, we want to remove the reservation record and all
915323420691 8013120: NMT: Kitchensink crashes with assert(next_region == NULL || !next_region->is_committed_region()) failed: Sanity check
zgu
parents: 15797
diff changeset
   273
    // commit records following it.
14120
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   274
#ifdef ASSERT
17302
915323420691 8013120: NMT: Kitchensink crashes with assert(next_region == NULL || !next_region->is_committed_region()) failed: Sanity check
zgu
parents: 15797
diff changeset
   275
    address low_addr = cur->addr();
915323420691 8013120: NMT: Kitchensink crashes with assert(next_region == NULL || !next_region->is_committed_region()) failed: Sanity check
zgu
parents: 15797
diff changeset
   276
    address high_addr = low_addr + cur->size();
14120
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   277
#endif
17302
915323420691 8013120: NMT: Kitchensink crashes with assert(next_region == NULL || !next_region->is_committed_region()) failed: Sanity check
zgu
parents: 15797
diff changeset
   278
    // remove virtual memory reservation record
14120
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   279
    remove();
17302
915323420691 8013120: NMT: Kitchensink crashes with assert(next_region == NULL || !next_region->is_committed_region()) failed: Sanity check
zgu
parents: 15797
diff changeset
   280
    // remove committed regions within above reservation
915323420691 8013120: NMT: Kitchensink crashes with assert(next_region == NULL || !next_region->is_committed_region()) failed: Sanity check
zgu
parents: 15797
diff changeset
   281
    VMMemRegion* next_region = (VMMemRegion*)current();
915323420691 8013120: NMT: Kitchensink crashes with assert(next_region == NULL || !next_region->is_committed_region()) failed: Sanity check
zgu
parents: 15797
diff changeset
   282
    while (next_region != NULL && next_region->is_committed_region()) {
915323420691 8013120: NMT: Kitchensink crashes with assert(next_region == NULL || !next_region->is_committed_region()) failed: Sanity check
zgu
parents: 15797
diff changeset
   283
      assert(next_region->addr() >= low_addr &&
915323420691 8013120: NMT: Kitchensink crashes with assert(next_region == NULL || !next_region->is_committed_region()) failed: Sanity check
zgu
parents: 15797
diff changeset
   284
             next_region->addr() + next_region->size() <= high_addr,
915323420691 8013120: NMT: Kitchensink crashes with assert(next_region == NULL || !next_region->is_committed_region()) failed: Sanity check
zgu
parents: 15797
diff changeset
   285
            "Range check");
915323420691 8013120: NMT: Kitchensink crashes with assert(next_region == NULL || !next_region->is_committed_region()) failed: Sanity check
zgu
parents: 15797
diff changeset
   286
      remove();
915323420691 8013120: NMT: Kitchensink crashes with assert(next_region == NULL || !next_region->is_committed_region()) failed: Sanity check
zgu
parents: 15797
diff changeset
   287
      next_region = (VMMemRegion*)current();
915323420691 8013120: NMT: Kitchensink crashes with assert(next_region == NULL || !next_region->is_committed_region()) failed: Sanity check
zgu
parents: 15797
diff changeset
   288
    }
14120
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   289
  } else if (rec->addr() == cur->addr() ||
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   290
    rec->addr() + rec->size() == cur->addr() + cur->size()) {
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   291
    // released region is at either end of this region
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   292
    cur->exclude_region(rec->addr(), rec->size());
14569
96937297368d 8003487: NMT: incorrect assertion in VMMemPointerIterator::remove_released_region method (memSnapshot.cpp)
zgu
parents: 14486
diff changeset
   293
    assert(check_reserved_region(), "Integrity check");
14120
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   294
  } else { // split the reserved region and release the middle
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   295
    address high_addr = cur->addr() + cur->size();
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   296
    size_t sz = high_addr - rec->addr();
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   297
    cur->exclude_region(rec->addr(), sz);
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   298
    sz = high_addr - rec->addr() - rec->size();
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   299
    if (MemTracker::track_callsite()) {
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   300
      MemPointerRecordEx tmp(rec->addr() + rec->size(), cur->flags(), sz,
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   301
        ((VMMemRegionEx*)cur)->pc());
14569
96937297368d 8003487: NMT: incorrect assertion in VMMemPointerIterator::remove_released_region method (memSnapshot.cpp)
zgu
parents: 14486
diff changeset
   302
      bool ret = insert_reserved_region(&tmp);
96937297368d 8003487: NMT: incorrect assertion in VMMemPointerIterator::remove_released_region method (memSnapshot.cpp)
zgu
parents: 14486
diff changeset
   303
      assert(!ret || check_reserved_region(), "Integrity check");
96937297368d 8003487: NMT: incorrect assertion in VMMemPointerIterator::remove_released_region method (memSnapshot.cpp)
zgu
parents: 14486
diff changeset
   304
      return ret;
14120
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   305
    } else {
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   306
      MemPointerRecord tmp(rec->addr() + rec->size(), cur->flags(), sz);
14569
96937297368d 8003487: NMT: incorrect assertion in VMMemPointerIterator::remove_released_region method (memSnapshot.cpp)
zgu
parents: 14486
diff changeset
   307
      bool ret = insert_reserved_region(&tmp);
96937297368d 8003487: NMT: incorrect assertion in VMMemPointerIterator::remove_released_region method (memSnapshot.cpp)
zgu
parents: 14486
diff changeset
   308
      assert(!ret || check_reserved_region(), "Integrity check");
96937297368d 8003487: NMT: incorrect assertion in VMMemPointerIterator::remove_released_region method (memSnapshot.cpp)
zgu
parents: 14486
diff changeset
   309
      return ret;
14120
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   310
    }
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   311
  }
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   312
  return true;
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   313
}
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   314
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   315
bool VMMemPointerIterator::insert_reserved_region(MemPointerRecord* rec) {
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   316
  // skip all 'commit' records associated with previous reserved region
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   317
  VMMemRegion* p = (VMMemRegion*)next();
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   318
  while (p != NULL && p->is_committed_region() &&
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   319
         p->base() + p->size() < rec->addr()) {
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   320
    p = (VMMemRegion*)next();
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   321
  }
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   322
  return insert_record(rec);
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   323
}
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   324
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   325
bool VMMemPointerIterator::split_reserved_region(VMMemRegion* rgn, address new_rgn_addr, size_t new_rgn_size) {
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   326
  assert(rgn->contains_region(new_rgn_addr, new_rgn_size), "Not fully contained");
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   327
  address pc = (MemTracker::track_callsite() ? ((VMMemRegionEx*)rgn)->pc() : NULL);
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   328
  if (rgn->base() == new_rgn_addr) { // new region is at the beginning of the region
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   329
    size_t sz = rgn->size() - new_rgn_size;
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   330
    // the original region becomes 'new' region
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   331
    rgn->exclude_region(new_rgn_addr + new_rgn_size, sz);
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   332
     // remaining becomes next region
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   333
    MemPointerRecordEx next_rgn(new_rgn_addr + new_rgn_size, rgn->flags(), sz, pc);
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   334
    return insert_reserved_region(&next_rgn);
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   335
  } else if (rgn->base() + rgn->size() == new_rgn_addr + new_rgn_size) {
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   336
    rgn->exclude_region(new_rgn_addr, new_rgn_size);
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   337
    MemPointerRecordEx next_rgn(new_rgn_addr, rgn->flags(), new_rgn_size, pc);
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   338
    return insert_reserved_region(&next_rgn);
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   339
  } else {
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   340
    // the orginal region will be split into three
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   341
    address rgn_high_addr = rgn->base() + rgn->size();
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   342
    // first region
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   343
    rgn->exclude_region(new_rgn_addr, (rgn_high_addr - new_rgn_addr));
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   344
    // the second region is the new region
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   345
    MemPointerRecordEx new_rgn(new_rgn_addr, rgn->flags(), new_rgn_size, pc);
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   346
    if (!insert_reserved_region(&new_rgn)) return false;
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   347
    // the remaining region
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   348
    MemPointerRecordEx rem_rgn(new_rgn_addr + new_rgn_size, rgn->flags(),
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   349
      rgn_high_addr - (new_rgn_addr + new_rgn_size), pc);
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   350
    return insert_reserved_region(&rem_rgn);
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   351
  }
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   352
}
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   353
13744
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   354
static int sort_in_seq_order(const void* p1, const void* p2) {
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   355
  assert(p1 != NULL && p2 != NULL, "Sanity check");
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   356
  const MemPointerRecord* mp1 = (MemPointerRecord*)p1;
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   357
  const MemPointerRecord* mp2 = (MemPointerRecord*)p2;
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   358
  return (mp1->seq() - mp2->seq());
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   359
}
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   360
13744
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   361
bool StagingArea::init() {
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   362
  if (MemTracker::track_callsite()) {
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   363
    _malloc_data = new (std::nothrow)MemPointerArrayImpl<SeqMemPointerRecordEx>();
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   364
    _vm_data = new (std::nothrow)MemPointerArrayImpl<SeqMemPointerRecordEx>();
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   365
  } else {
13744
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   366
    _malloc_data = new (std::nothrow)MemPointerArrayImpl<SeqMemPointerRecord>();
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   367
    _vm_data = new (std::nothrow)MemPointerArrayImpl<SeqMemPointerRecord>();
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   368
  }
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   369
13744
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   370
  if (_malloc_data != NULL && _vm_data != NULL &&
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   371
      !_malloc_data->out_of_memory() &&
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   372
      !_vm_data->out_of_memory()) {
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   373
    return true;
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   374
  } else {
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   375
    if (_malloc_data != NULL) delete _malloc_data;
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   376
    if (_vm_data != NULL) delete _vm_data;
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   377
    _malloc_data = NULL;
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   378
    _vm_data = NULL;
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   379
    return false;
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   380
  }
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   381
}
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   382
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   383
14120
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   384
VMRecordIterator StagingArea::virtual_memory_record_walker() {
13744
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   385
  MemPointerArray* arr = vm_data();
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   386
  // sort into seq number order
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   387
  arr->sort((FN_SORT)sort_in_seq_order);
14120
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   388
  return VMRecordIterator(arr);
13744
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   389
}
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   390
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   391
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   392
MemSnapshot::MemSnapshot() {
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   393
  if (MemTracker::track_callsite()) {
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   394
    _alloc_ptrs = new (std::nothrow) MemPointerArrayImpl<MemPointerRecordEx>();
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   395
    _vm_ptrs = new (std::nothrow)MemPointerArrayImpl<VMMemRegionEx>(64, true);
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   396
  } else {
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   397
    _alloc_ptrs = new (std::nothrow) MemPointerArrayImpl<MemPointerRecord>();
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   398
    _vm_ptrs = new (std::nothrow)MemPointerArrayImpl<VMMemRegion>(64, true);
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   399
  }
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   400
13744
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   401
  _staging_area.init();
13301
f6dd749390dd 7181986: NMT ON: Assertion failure when running jdi ExpiredRequestDeletionTest
zgu
parents: 13195
diff changeset
   402
  _lock = new (std::nothrow) Mutex(Monitor::max_nonleaf - 1, "memSnapshotLock");
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   403
  NOT_PRODUCT(_untracked_count = 0;)
15104
f5d78994619f 8005048: NMT: #loaded classes needs to just show the # defined classes
zgu
parents: 14569
diff changeset
   404
  _number_of_classes = 0;
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   405
}
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   406
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   407
MemSnapshot::~MemSnapshot() {
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   408
  assert(MemTracker::shutdown_in_progress(), "native memory tracking still on");
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   409
  {
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   410
    MutexLockerEx locker(_lock);
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   411
    if (_alloc_ptrs != NULL) {
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   412
      delete _alloc_ptrs;
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   413
      _alloc_ptrs = NULL;
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   414
    }
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   415
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   416
    if (_vm_ptrs != NULL) {
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   417
      delete _vm_ptrs;
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   418
      _vm_ptrs = NULL;
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   419
    }
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   420
  }
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   421
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   422
  if (_lock != NULL) {
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   423
    delete _lock;
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   424
    _lock = NULL;
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   425
  }
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   426
}
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   427
14484
901d216b74bf 8001592: NMT: assertion failed: assert(_amount >= amt) failed: Just check: memBaseline.hpp:180
zgu
parents: 14388
diff changeset
   428
901d216b74bf 8001592: NMT: assertion failed: assert(_amount >= amt) failed: Just check: memBaseline.hpp:180
zgu
parents: 14388
diff changeset
   429
void MemSnapshot::copy_seq_pointer(MemPointerRecord* dest, const MemPointerRecord* src) {
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   430
  assert(dest != NULL && src != NULL, "Just check");
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   431
  assert(dest->addr() == src->addr(), "Just check");
14484
901d216b74bf 8001592: NMT: assertion failed: assert(_amount >= amt) failed: Just check: memBaseline.hpp:180
zgu
parents: 14388
diff changeset
   432
  assert(dest->seq() > 0 && src->seq() > 0, "not sequenced");
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   433
14484
901d216b74bf 8001592: NMT: assertion failed: assert(_amount >= amt) failed: Just check: memBaseline.hpp:180
zgu
parents: 14388
diff changeset
   434
  if (MemTracker::track_callsite()) {
901d216b74bf 8001592: NMT: assertion failed: assert(_amount >= amt) failed: Just check: memBaseline.hpp:180
zgu
parents: 14388
diff changeset
   435
    *(SeqMemPointerRecordEx*)dest = *(SeqMemPointerRecordEx*)src;
901d216b74bf 8001592: NMT: assertion failed: assert(_amount >= amt) failed: Just check: memBaseline.hpp:180
zgu
parents: 14388
diff changeset
   436
  } else {
901d216b74bf 8001592: NMT: assertion failed: assert(_amount >= amt) failed: Just check: memBaseline.hpp:180
zgu
parents: 14388
diff changeset
   437
    *(SeqMemPointerRecord*)dest = *(SeqMemPointerRecord*)src;
901d216b74bf 8001592: NMT: assertion failed: assert(_amount >= amt) failed: Just check: memBaseline.hpp:180
zgu
parents: 14388
diff changeset
   438
  }
901d216b74bf 8001592: NMT: assertion failed: assert(_amount >= amt) failed: Just check: memBaseline.hpp:180
zgu
parents: 14388
diff changeset
   439
}
901d216b74bf 8001592: NMT: assertion failed: assert(_amount >= amt) failed: Just check: memBaseline.hpp:180
zgu
parents: 14388
diff changeset
   440
901d216b74bf 8001592: NMT: assertion failed: assert(_amount >= amt) failed: Just check: memBaseline.hpp:180
zgu
parents: 14388
diff changeset
   441
void MemSnapshot::assign_pointer(MemPointerRecord*dest, const MemPointerRecord* src) {
901d216b74bf 8001592: NMT: assertion failed: assert(_amount >= amt) failed: Just check: memBaseline.hpp:180
zgu
parents: 14388
diff changeset
   442
  assert(src != NULL && dest != NULL, "Just check");
901d216b74bf 8001592: NMT: assertion failed: assert(_amount >= amt) failed: Just check: memBaseline.hpp:180
zgu
parents: 14388
diff changeset
   443
  assert(dest->seq() == 0 && src->seq() >0, "cast away sequence");
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   444
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   445
  if (MemTracker::track_callsite()) {
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   446
    *(MemPointerRecordEx*)dest = *(MemPointerRecordEx*)src;
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   447
  } else {
14484
901d216b74bf 8001592: NMT: assertion failed: assert(_amount >= amt) failed: Just check: memBaseline.hpp:180
zgu
parents: 14388
diff changeset
   448
    *(MemPointerRecord*)dest = *(MemPointerRecord*)src;
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   449
  }
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   450
}
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   451
14484
901d216b74bf 8001592: NMT: assertion failed: assert(_amount >= amt) failed: Just check: memBaseline.hpp:180
zgu
parents: 14388
diff changeset
   452
// merge a recorder to the staging area
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   453
bool MemSnapshot::merge(MemRecorder* rec) {
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   454
  assert(rec != NULL && !rec->out_of_memory(), "Just check");
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   455
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   456
  SequencedRecordIterator itr(rec->pointer_itr());
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   457
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   458
  MutexLockerEx lock(_lock, true);
13744
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   459
  MemPointerIterator malloc_staging_itr(_staging_area.malloc_data());
14484
901d216b74bf 8001592: NMT: assertion failed: assert(_amount >= amt) failed: Just check: memBaseline.hpp:180
zgu
parents: 14388
diff changeset
   460
  MemPointerRecord* incoming_rec = (MemPointerRecord*) itr.current();
901d216b74bf 8001592: NMT: assertion failed: assert(_amount >= amt) failed: Just check: memBaseline.hpp:180
zgu
parents: 14388
diff changeset
   461
  MemPointerRecord* matched_rec;
901d216b74bf 8001592: NMT: assertion failed: assert(_amount >= amt) failed: Just check: memBaseline.hpp:180
zgu
parents: 14388
diff changeset
   462
901d216b74bf 8001592: NMT: assertion failed: assert(_amount >= amt) failed: Just check: memBaseline.hpp:180
zgu
parents: 14388
diff changeset
   463
  while (incoming_rec != NULL) {
901d216b74bf 8001592: NMT: assertion failed: assert(_amount >= amt) failed: Just check: memBaseline.hpp:180
zgu
parents: 14388
diff changeset
   464
    if (incoming_rec->is_vm_pointer()) {
13744
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   465
      // we don't do anything with virtual memory records during merge
14484
901d216b74bf 8001592: NMT: assertion failed: assert(_amount >= amt) failed: Just check: memBaseline.hpp:180
zgu
parents: 14388
diff changeset
   466
      if (!_staging_area.vm_data()->append(incoming_rec)) {
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   467
        return false;
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   468
      }
13744
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   469
    } else {
14120
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   470
      // locate matched record and/or also position the iterator to proper
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   471
      // location for this incoming record.
14484
901d216b74bf 8001592: NMT: assertion failed: assert(_amount >= amt) failed: Just check: memBaseline.hpp:180
zgu
parents: 14388
diff changeset
   472
      matched_rec = (MemPointerRecord*)malloc_staging_itr.locate(incoming_rec->addr());
901d216b74bf 8001592: NMT: assertion failed: assert(_amount >= amt) failed: Just check: memBaseline.hpp:180
zgu
parents: 14388
diff changeset
   473
      // we have not seen this memory block in this generation,
901d216b74bf 8001592: NMT: assertion failed: assert(_amount >= amt) failed: Just check: memBaseline.hpp:180
zgu
parents: 14388
diff changeset
   474
      // so just add to staging area
901d216b74bf 8001592: NMT: assertion failed: assert(_amount >= amt) failed: Just check: memBaseline.hpp:180
zgu
parents: 14388
diff changeset
   475
      if (matched_rec == NULL) {
901d216b74bf 8001592: NMT: assertion failed: assert(_amount >= amt) failed: Just check: memBaseline.hpp:180
zgu
parents: 14388
diff changeset
   476
        if (!malloc_staging_itr.insert(incoming_rec)) {
13744
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   477
          return false;
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   478
        }
14484
901d216b74bf 8001592: NMT: assertion failed: assert(_amount >= amt) failed: Just check: memBaseline.hpp:180
zgu
parents: 14388
diff changeset
   479
      } else if (incoming_rec->addr() == matched_rec->addr()) {
901d216b74bf 8001592: NMT: assertion failed: assert(_amount >= amt) failed: Just check: memBaseline.hpp:180
zgu
parents: 14388
diff changeset
   480
        // whoever has higher sequence number wins
901d216b74bf 8001592: NMT: assertion failed: assert(_amount >= amt) failed: Just check: memBaseline.hpp:180
zgu
parents: 14388
diff changeset
   481
        if (incoming_rec->seq() > matched_rec->seq()) {
901d216b74bf 8001592: NMT: assertion failed: assert(_amount >= amt) failed: Just check: memBaseline.hpp:180
zgu
parents: 14388
diff changeset
   482
          copy_seq_pointer(matched_rec, incoming_rec);
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   483
        }
14484
901d216b74bf 8001592: NMT: assertion failed: assert(_amount >= amt) failed: Just check: memBaseline.hpp:180
zgu
parents: 14388
diff changeset
   484
      } else if (incoming_rec->addr() < matched_rec->addr()) {
901d216b74bf 8001592: NMT: assertion failed: assert(_amount >= amt) failed: Just check: memBaseline.hpp:180
zgu
parents: 14388
diff changeset
   485
        if (!malloc_staging_itr.insert(incoming_rec)) {
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   486
          return false;
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   487
        }
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   488
      } else {
14484
901d216b74bf 8001592: NMT: assertion failed: assert(_amount >= amt) failed: Just check: memBaseline.hpp:180
zgu
parents: 14388
diff changeset
   489
        ShouldNotReachHere();
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   490
      }
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   491
    }
14484
901d216b74bf 8001592: NMT: assertion failed: assert(_amount >= amt) failed: Just check: memBaseline.hpp:180
zgu
parents: 14388
diff changeset
   492
    incoming_rec = (MemPointerRecord*)itr.next();
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   493
  }
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   494
  NOT_PRODUCT(void check_staging_data();)
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   495
  return true;
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   496
}
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   497
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   498
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   499
// promote data to next generation
15104
f5d78994619f 8005048: NMT: #loaded classes needs to just show the # defined classes
zgu
parents: 14569
diff changeset
   500
bool MemSnapshot::promote(int number_of_classes) {
13744
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   501
  assert(_alloc_ptrs != NULL && _vm_ptrs != NULL, "Just check");
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   502
  assert(_staging_area.malloc_data() != NULL && _staging_area.vm_data() != NULL,
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   503
         "Just check");
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   504
  MutexLockerEx lock(_lock, true);
13744
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   505
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   506
  MallocRecordIterator  malloc_itr = _staging_area.malloc_record_walker();
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   507
  bool promoted = false;
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   508
  if (promote_malloc_records(&malloc_itr)) {
14120
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   509
    VMRecordIterator vm_itr = _staging_area.virtual_memory_record_walker();
13744
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   510
    if (promote_virtual_memory_records(&vm_itr)) {
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   511
      promoted = true;
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   512
    }
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   513
  }
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   514
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   515
  NOT_PRODUCT(check_malloc_pointers();)
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   516
  _staging_area.clear();
15104
f5d78994619f 8005048: NMT: #loaded classes needs to just show the # defined classes
zgu
parents: 14569
diff changeset
   517
  _number_of_classes = number_of_classes;
13744
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   518
  return promoted;
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   519
}
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   520
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   521
bool MemSnapshot::promote_malloc_records(MemPointerArrayIterator* itr) {
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   522
  MemPointerIterator malloc_snapshot_itr(_alloc_ptrs);
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   523
  MemPointerRecord* new_rec = (MemPointerRecord*)itr->current();
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   524
  MemPointerRecord* matched_rec;
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   525
  while (new_rec != NULL) {
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   526
    matched_rec = (MemPointerRecord*)malloc_snapshot_itr.locate(new_rec->addr());
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   527
    // found matched memory block
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   528
    if (matched_rec != NULL && new_rec->addr() == matched_rec->addr()) {
14120
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   529
      // snapshot already contains 'live' records
14484
901d216b74bf 8001592: NMT: assertion failed: assert(_amount >= amt) failed: Just check: memBaseline.hpp:180
zgu
parents: 14388
diff changeset
   530
      assert(matched_rec->is_allocation_record() || matched_rec->is_arena_memory_record(),
13744
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   531
             "Sanity check");
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   532
      // update block states
14484
901d216b74bf 8001592: NMT: assertion failed: assert(_amount >= amt) failed: Just check: memBaseline.hpp:180
zgu
parents: 14388
diff changeset
   533
      if (new_rec->is_allocation_record()) {
901d216b74bf 8001592: NMT: assertion failed: assert(_amount >= amt) failed: Just check: memBaseline.hpp:180
zgu
parents: 14388
diff changeset
   534
        assign_pointer(matched_rec, new_rec);
901d216b74bf 8001592: NMT: assertion failed: assert(_amount >= amt) failed: Just check: memBaseline.hpp:180
zgu
parents: 14388
diff changeset
   535
      } else if (new_rec->is_arena_memory_record()) {
901d216b74bf 8001592: NMT: assertion failed: assert(_amount >= amt) failed: Just check: memBaseline.hpp:180
zgu
parents: 14388
diff changeset
   536
        if (new_rec->size() == 0) {
901d216b74bf 8001592: NMT: assertion failed: assert(_amount >= amt) failed: Just check: memBaseline.hpp:180
zgu
parents: 14388
diff changeset
   537
          // remove size record once size drops to 0
901d216b74bf 8001592: NMT: assertion failed: assert(_amount >= amt) failed: Just check: memBaseline.hpp:180
zgu
parents: 14388
diff changeset
   538
          malloc_snapshot_itr.remove();
901d216b74bf 8001592: NMT: assertion failed: assert(_amount >= amt) failed: Just check: memBaseline.hpp:180
zgu
parents: 14388
diff changeset
   539
        } else {
901d216b74bf 8001592: NMT: assertion failed: assert(_amount >= amt) failed: Just check: memBaseline.hpp:180
zgu
parents: 14388
diff changeset
   540
          assign_pointer(matched_rec, new_rec);
901d216b74bf 8001592: NMT: assertion failed: assert(_amount >= amt) failed: Just check: memBaseline.hpp:180
zgu
parents: 14388
diff changeset
   541
        }
13744
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   542
      } else {
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   543
        // a deallocation record
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   544
        assert(new_rec->is_deallocation_record(), "Sanity check");
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   545
        // an arena record can be followed by a size record, we need to remove both
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   546
        if (matched_rec->is_arena_record()) {
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   547
          MemPointerRecord* next = (MemPointerRecord*)malloc_snapshot_itr.peek_next();
15797
43706e10feea 8008071: Crashed in promote_malloc_records() with Kitchensink after 19 days
zgu
parents: 15104
diff changeset
   548
          if (next != NULL && next->is_arena_memory_record() &&
43706e10feea 8008071: Crashed in promote_malloc_records() with Kitchensink after 19 days
zgu
parents: 15104
diff changeset
   549
              next->is_memory_record_of_arena(matched_rec)) {
13744
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   550
            malloc_snapshot_itr.remove();
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   551
          }
13744
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   552
        }
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   553
        // the memory is deallocated, remove related record(s)
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   554
        malloc_snapshot_itr.remove();
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   555
      }
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   556
    } else {
14484
901d216b74bf 8001592: NMT: assertion failed: assert(_amount >= amt) failed: Just check: memBaseline.hpp:180
zgu
parents: 14388
diff changeset
   557
      // don't insert size 0 record
901d216b74bf 8001592: NMT: assertion failed: assert(_amount >= amt) failed: Just check: memBaseline.hpp:180
zgu
parents: 14388
diff changeset
   558
      if (new_rec->is_arena_memory_record() && new_rec->size() == 0) {
901d216b74bf 8001592: NMT: assertion failed: assert(_amount >= amt) failed: Just check: memBaseline.hpp:180
zgu
parents: 14388
diff changeset
   559
        new_rec = NULL;
13744
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   560
      }
14484
901d216b74bf 8001592: NMT: assertion failed: assert(_amount >= amt) failed: Just check: memBaseline.hpp:180
zgu
parents: 14388
diff changeset
   561
13744
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   562
      if (new_rec != NULL) {
14484
901d216b74bf 8001592: NMT: assertion failed: assert(_amount >= amt) failed: Just check: memBaseline.hpp:180
zgu
parents: 14388
diff changeset
   563
        if  (new_rec->is_allocation_record() || new_rec->is_arena_memory_record()) {
13744
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   564
          if (matched_rec != NULL && new_rec->addr() > matched_rec->addr()) {
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   565
            if (!malloc_snapshot_itr.insert_after(new_rec)) {
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   566
              return false;
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   567
            }
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   568
          } else {
13744
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   569
            if (!malloc_snapshot_itr.insert(new_rec)) {
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   570
              return false;
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   571
            }
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   572
          }
13744
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   573
        }
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   574
#ifndef PRODUCT
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   575
        else if (!has_allocation_record(new_rec->addr())) {
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   576
          // NMT can not track some startup memory, which is allocated before NMT is on
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   577
          _untracked_count ++;
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   578
        }
13744
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   579
#endif
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   580
      }
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   581
    }
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   582
    new_rec = (MemPointerRecord*)itr->next();
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   583
  }
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   584
  return true;
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   585
}
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   586
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   587
bool MemSnapshot::promote_virtual_memory_records(MemPointerArrayIterator* itr) {
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   588
  VMMemPointerIterator vm_snapshot_itr(_vm_ptrs);
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   589
  MemPointerRecord* new_rec = (MemPointerRecord*)itr->current();
14120
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   590
  VMMemRegion*  reserved_rec;
13744
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   591
  while (new_rec != NULL) {
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   592
    assert(new_rec->is_vm_pointer(), "Sanity check");
14120
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   593
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   594
    // locate a reserved region that contains the specified address, or
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   595
    // the nearest reserved region has base address just above the specified
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   596
    // address
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   597
    reserved_rec = (VMMemRegion*)vm_snapshot_itr.locate(new_rec->addr());
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   598
    if (reserved_rec != NULL && reserved_rec->contains_region(new_rec)) {
13744
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   599
      // snapshot can only have 'live' records
14120
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   600
      assert(reserved_rec->is_reserved_region(), "Sanity check");
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   601
      if (new_rec->is_allocation_record()) {
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   602
        if (!reserved_rec->is_same_region(new_rec)) {
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   603
          // only deal with split a bigger reserved region into smaller regions.
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   604
          // So far, CDS is the only use case.
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   605
          if (!vm_snapshot_itr.split_reserved_region(reserved_rec, new_rec->addr(), new_rec->size())) {
13744
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   606
            return false;
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   607
          }
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   608
        }
14120
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   609
      } else if (new_rec->is_uncommit_record()) {
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   610
        if (!vm_snapshot_itr.remove_uncommitted_region(new_rec)) {
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   611
          return false;
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   612
        }
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   613
      } else if (new_rec->is_commit_record()) {
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   614
        // insert or expand existing committed region to cover this
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   615
        // newly committed region
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   616
        if (!vm_snapshot_itr.add_committed_region(new_rec)) {
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   617
          return false;
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   618
        }
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   619
      } else if (new_rec->is_deallocation_record()) {
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   620
        // release part or all memory region
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   621
        if (!vm_snapshot_itr.remove_released_region(new_rec)) {
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   622
          return false;
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   623
        }
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   624
      } else if (new_rec->is_type_tagging_record()) {
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   625
        // tag this reserved virtual memory range to a memory type. Can not re-tag a memory range
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   626
        // to different type.
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   627
        assert(FLAGS_TO_MEMORY_TYPE(reserved_rec->flags()) == mtNone ||
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   628
               FLAGS_TO_MEMORY_TYPE(reserved_rec->flags()) == FLAGS_TO_MEMORY_TYPE(new_rec->flags()),
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   629
               "Sanity check");
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   630
        reserved_rec->tag(new_rec->flags());
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   631
    } else {
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   632
        ShouldNotReachHere();
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   633
          }
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   634
        } else {
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   635
      /*
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   636
       * The assertion failure indicates mis-matched virtual memory records. The likely
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   637
       * scenario is, that some virtual memory operations are not going through os::xxxx_memory()
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   638
       * api, which have to be tracked manually. (perfMemory is an example).
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   639
      */
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   640
      assert(new_rec->is_allocation_record(), "Sanity check");
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   641
      if (!vm_snapshot_itr.add_reserved_region(new_rec)) {
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   642
            return false;
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   643
          }
13744
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   644
  }
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   645
    new_rec = (MemPointerRecord*)itr->next();
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   646
  }
13744
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   647
  return true;
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   648
}
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   649
13478
85fe611440e5 7191124: Optimized build is broken due to inconsistent use of DEBUG_ONLY and NOT_PRODUCT macros in NMT
zgu
parents: 13470
diff changeset
   650
#ifndef PRODUCT
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   651
void MemSnapshot::print_snapshot_stats(outputStream* st) {
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   652
  st->print_cr("Snapshot:");
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   653
  st->print_cr("\tMalloced: %d/%d [%5.2f%%]  %dKB", _alloc_ptrs->length(), _alloc_ptrs->capacity(),
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   654
    (100.0 * (float)_alloc_ptrs->length()) / (float)_alloc_ptrs->capacity(), _alloc_ptrs->instance_size()/K);
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   655
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   656
  st->print_cr("\tVM: %d/%d [%5.2f%%] %dKB", _vm_ptrs->length(), _vm_ptrs->capacity(),
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   657
    (100.0 * (float)_vm_ptrs->length()) / (float)_vm_ptrs->capacity(), _vm_ptrs->instance_size()/K);
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   658
13744
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   659
  st->print_cr("\tMalloc staging Area:     %d/%d [%5.2f%%] %dKB", _staging_area.malloc_data()->length(),
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   660
    _staging_area.malloc_data()->capacity(),
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   661
    (100.0 * (float)_staging_area.malloc_data()->length()) / (float)_staging_area.malloc_data()->capacity(),
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   662
    _staging_area.malloc_data()->instance_size()/K);
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   663
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   664
  st->print_cr("\tVirtual memory staging Area:     %d/%d [%5.2f%%] %dKB", _staging_area.vm_data()->length(),
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   665
    _staging_area.vm_data()->capacity(),
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   666
    (100.0 * (float)_staging_area.vm_data()->length()) / (float)_staging_area.vm_data()->capacity(),
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   667
    _staging_area.vm_data()->instance_size()/K);
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   668
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   669
  st->print_cr("\tUntracked allocation: %d", _untracked_count);
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   670
}
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   671
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   672
void MemSnapshot::check_malloc_pointers() {
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   673
  MemPointerArrayIteratorImpl mItr(_alloc_ptrs);
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   674
  MemPointerRecord* p = (MemPointerRecord*)mItr.current();
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   675
  MemPointerRecord* prev = NULL;
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   676
  while (p != NULL) {
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   677
    if (prev != NULL) {
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   678
      assert(p->addr() >= prev->addr(), "sorting order");
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   679
    }
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   680
    prev = p;
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   681
    p = (MemPointerRecord*)mItr.next();
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   682
  }
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   683
}
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   684
13478
85fe611440e5 7191124: Optimized build is broken due to inconsistent use of DEBUG_ONLY and NOT_PRODUCT macros in NMT
zgu
parents: 13470
diff changeset
   685
bool MemSnapshot::has_allocation_record(address addr) {
13744
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   686
  MemPointerArrayIteratorImpl itr(_staging_area.malloc_data());
13478
85fe611440e5 7191124: Optimized build is broken due to inconsistent use of DEBUG_ONLY and NOT_PRODUCT macros in NMT
zgu
parents: 13470
diff changeset
   687
  MemPointerRecord* cur = (MemPointerRecord*)itr.current();
85fe611440e5 7191124: Optimized build is broken due to inconsistent use of DEBUG_ONLY and NOT_PRODUCT macros in NMT
zgu
parents: 13470
diff changeset
   688
  while (cur != NULL) {
85fe611440e5 7191124: Optimized build is broken due to inconsistent use of DEBUG_ONLY and NOT_PRODUCT macros in NMT
zgu
parents: 13470
diff changeset
   689
    if (cur->addr() == addr && cur->is_allocation_record()) {
85fe611440e5 7191124: Optimized build is broken due to inconsistent use of DEBUG_ONLY and NOT_PRODUCT macros in NMT
zgu
parents: 13470
diff changeset
   690
      return true;
85fe611440e5 7191124: Optimized build is broken due to inconsistent use of DEBUG_ONLY and NOT_PRODUCT macros in NMT
zgu
parents: 13470
diff changeset
   691
    }
85fe611440e5 7191124: Optimized build is broken due to inconsistent use of DEBUG_ONLY and NOT_PRODUCT macros in NMT
zgu
parents: 13470
diff changeset
   692
    cur = (MemPointerRecord*)itr.next();
85fe611440e5 7191124: Optimized build is broken due to inconsistent use of DEBUG_ONLY and NOT_PRODUCT macros in NMT
zgu
parents: 13470
diff changeset
   693
  }
85fe611440e5 7191124: Optimized build is broken due to inconsistent use of DEBUG_ONLY and NOT_PRODUCT macros in NMT
zgu
parents: 13470
diff changeset
   694
  return false;
85fe611440e5 7191124: Optimized build is broken due to inconsistent use of DEBUG_ONLY and NOT_PRODUCT macros in NMT
zgu
parents: 13470
diff changeset
   695
}
85fe611440e5 7191124: Optimized build is broken due to inconsistent use of DEBUG_ONLY and NOT_PRODUCT macros in NMT
zgu
parents: 13470
diff changeset
   696
#endif // PRODUCT
85fe611440e5 7191124: Optimized build is broken due to inconsistent use of DEBUG_ONLY and NOT_PRODUCT macros in NMT
zgu
parents: 13470
diff changeset
   697
85fe611440e5 7191124: Optimized build is broken due to inconsistent use of DEBUG_ONLY and NOT_PRODUCT macros in NMT
zgu
parents: 13470
diff changeset
   698
#ifdef ASSERT
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   699
void MemSnapshot::check_staging_data() {
13744
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   700
  MemPointerArrayIteratorImpl itr(_staging_area.malloc_data());
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   701
  MemPointerRecord* cur = (MemPointerRecord*)itr.current();
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   702
  MemPointerRecord* next = (MemPointerRecord*)itr.next();
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   703
  while (next != NULL) {
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   704
    assert((next->addr() > cur->addr()) ||
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   705
      ((next->flags() & MemPointerRecord::tag_masks) >
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   706
       (cur->flags() & MemPointerRecord::tag_masks)),
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   707
       "sorting order");
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   708
    cur = next;
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   709
    next = (MemPointerRecord*)itr.next();
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   710
  }
13744
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   711
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   712
  MemPointerArrayIteratorImpl vm_itr(_staging_area.vm_data());
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   713
  cur = (MemPointerRecord*)vm_itr.current();
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   714
  while (cur != NULL) {
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   715
    assert(cur->is_vm_pointer(), "virtual memory pointer only");
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   716
    cur = (MemPointerRecord*)vm_itr.next();
631fe815def5 7181995: NMT ON: NMT assertion failure assert(cur_vm->is_uncommit_record() || cur_vm->is_deallocation_record
zgu
parents: 13478
diff changeset
   717
  }
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   718
}
14120
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   719
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   720
void MemSnapshot::dump_all_vm_pointers() {
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   721
  MemPointerArrayIteratorImpl itr(_vm_ptrs);
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   722
  VMMemRegion* ptr = (VMMemRegion*)itr.current();
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   723
  tty->print_cr("dump virtual memory pointers:");
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   724
  while (ptr != NULL) {
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   725
    if (ptr->is_committed_region()) {
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   726
      tty->print("\t");
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   727
    }
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   728
    tty->print("[" PTR_FORMAT " - " PTR_FORMAT "] [%x]", ptr->addr(),
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   729
      (ptr->addr() + ptr->size()), ptr->flags());
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   730
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   731
    if (MemTracker::track_callsite()) {
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   732
      VMMemRegionEx* ex = (VMMemRegionEx*)ptr;
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   733
      if (ex->pc() != NULL) {
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   734
        char buf[1024];
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   735
        if (os::dll_address_to_function_name(ex->pc(), buf, sizeof(buf), NULL)) {
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   736
          tty->print_cr("\t%s", buf);
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   737
        } else {
24424
2658d7834c6e 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 17302
diff changeset
   738
          tty->cr();
14120
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   739
        }
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   740
      }
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   741
    }
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   742
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   743
    ptr = (VMMemRegion*)itr.next();
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   744
  }
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   745
  tty->flush();
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 13744
diff changeset
   746
}
13478
85fe611440e5 7191124: Optimized build is broken due to inconsistent use of DEBUG_ONLY and NOT_PRODUCT macros in NMT
zgu
parents: 13470
diff changeset
   747
#endif // ASSERT
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
   748