hotspot/src/share/vm/services/gcNotifier.cpp
author coleenp
Mon, 14 Jan 2013 11:01:39 -0500
changeset 15194 a35093d73168
parent 13728 882756847a04
child 19144 02f1ea6475c0
permissions -rw-r--r--
8006005: Fix constant pool index validation and alignment trap for method parameter reflection Summary: This patch addresses an alignment trap due to the storage format of method parameters data in constMethod. It also adds code to validate constant pool indexes for method parameters data. Reviewed-by: jrose, dholmes Contributed-by: eric.mccorkle@oracle.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
9623
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
     1
/*
11766
b1ff60353280 7143760: Memory leak in GarbageCollectionNotifications
fparain
parents: 11591
diff changeset
     2
 * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
9623
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
     4
 *
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
     7
 * published by the Free Software Foundation.
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
     8
 *
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    13
 * accompanied this code).
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    14
 *
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    18
 *
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    21
 * questions.
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    22
 *
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    23
 */
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    24
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    25
#include "precompiled.hpp"
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    26
#include "classfile/systemDictionary.hpp"
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    27
#include "classfile/vmSymbols.hpp"
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    28
#include "oops/oop.inline.hpp"
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    29
#include "runtime/interfaceSupport.hpp"
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    30
#include "runtime/java.hpp"
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    31
#include "runtime/javaCalls.hpp"
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    32
#include "runtime/mutex.hpp"
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    33
#include "runtime/mutexLocker.hpp"
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    34
#include "services/gcNotifier.hpp"
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    35
#include "services/management.hpp"
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    36
#include "services/memoryService.hpp"
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    37
#include "memoryManager.hpp"
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    38
#include "memory/oopFactory.hpp"
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    39
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    40
GCNotificationRequest *GCNotifier::first_request = NULL;
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    41
GCNotificationRequest *GCNotifier::last_request = NULL;
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    42
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    43
void GCNotifier::pushNotification(GCMemoryManager *mgr, const char *action, const char *cause) {
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    44
  // Make a copy of the last GC statistics
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    45
  // GC may occur between now and the creation of the notification
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    46
  int num_pools = MemoryService::num_memory_pools();
11591
854c0dff3844 7066129: GarbageCollectorMXBean#getLastGcInfo leaks native memory
dsamersoff
parents: 10242
diff changeset
    47
  // stat is deallocated inside GCNotificationRequest
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12266
diff changeset
    48
  GCStatInfo* stat = new(ResourceObj::C_HEAP, mtGC) GCStatInfo(num_pools);
9623
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    49
  mgr->get_last_gc_stat(stat);
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    50
  GCNotificationRequest *request = new GCNotificationRequest(os::javaTimeMillis(),mgr,action,cause,stat);
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    51
  addRequest(request);
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    52
 }
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    53
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    54
void GCNotifier::addRequest(GCNotificationRequest *request) {
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    55
  MutexLockerEx ml(Service_lock, Mutex::_no_safepoint_check_flag);
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    56
  if(first_request == NULL) {
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    57
    first_request = request;
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    58
  } else {
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    59
    last_request->next = request;
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    60
  }
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    61
  last_request = request;
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    62
  Service_lock->notify_all();
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    63
}
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    64
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    65
GCNotificationRequest *GCNotifier::getRequest() {
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    66
  MutexLockerEx ml(Service_lock, Mutex::_no_safepoint_check_flag);
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    67
  GCNotificationRequest *request = first_request;
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    68
  if(first_request != NULL) {
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    69
    first_request = first_request->next;
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    70
  }
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    71
  return request;
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    72
}
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    73
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    74
bool GCNotifier::has_event() {
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    75
  return first_request != NULL;
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    76
}
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    77
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    78
static Handle getGcInfoBuilder(GCMemoryManager *gcManager,TRAPS) {
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    79
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
    80
  Klass* k = Management::sun_management_GarbageCollectorImpl_klass(CHECK_NH);
9623
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    81
  instanceKlassHandle gcMBeanKlass (THREAD, k);
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    82
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    83
  instanceOop i = gcManager->get_memory_manager_instance(THREAD);
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    84
  instanceHandle ih(THREAD, i);
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    85
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    86
  JavaValue result(T_OBJECT);
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    87
  JavaCallArguments args(ih);
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    88
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    89
  JavaCalls::call_virtual(&result,
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    90
                          gcMBeanKlass,
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    91
                          vmSymbols::getGcInfoBuilder_name(),
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    92
                          vmSymbols::getGcInfoBuilder_signature(),
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    93
                          &args,
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    94
                          CHECK_NH);
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    95
  return Handle(THREAD,(oop)result.get_jobject());
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    96
}
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    97
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    98
static Handle createGcInfo(GCMemoryManager *gcManager, GCStatInfo *gcStatInfo,TRAPS) {
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
    99
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   100
  // Fill the arrays of MemoryUsage objects with before and after GC
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   101
  // per pool memory usage
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   102
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   103
  Klass* mu_klass = Management::java_lang_management_MemoryUsage_klass(CHECK_NH);
10242
ec32bf88801c 7074579: G1: JVM crash with JDK7 running ATG CRMDemo Fusion App
johnc
parents: 9623
diff changeset
   104
  instanceKlassHandle mu_kh(THREAD, mu_klass);
ec32bf88801c 7074579: G1: JVM crash with JDK7 running ATG CRMDemo Fusion App
johnc
parents: 9623
diff changeset
   105
ec32bf88801c 7074579: G1: JVM crash with JDK7 running ATG CRMDemo Fusion App
johnc
parents: 9623
diff changeset
   106
  // The array allocations below should use a handle containing mu_klass
ec32bf88801c 7074579: G1: JVM crash with JDK7 running ATG CRMDemo Fusion App
johnc
parents: 9623
diff changeset
   107
  // as the first allocation could trigger a GC, causing the actual
ec32bf88801c 7074579: G1: JVM crash with JDK7 running ATG CRMDemo Fusion App
johnc
parents: 9623
diff changeset
   108
  // klass oop to move, and leaving mu_klass pointing to the old
ec32bf88801c 7074579: G1: JVM crash with JDK7 running ATG CRMDemo Fusion App
johnc
parents: 9623
diff changeset
   109
  // location.
ec32bf88801c 7074579: G1: JVM crash with JDK7 running ATG CRMDemo Fusion App
johnc
parents: 9623
diff changeset
   110
  objArrayOop bu = oopFactory::new_objArray(mu_kh(), MemoryService::num_memory_pools(), CHECK_NH);
9623
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   111
  objArrayHandle usage_before_gc_ah(THREAD, bu);
10242
ec32bf88801c 7074579: G1: JVM crash with JDK7 running ATG CRMDemo Fusion App
johnc
parents: 9623
diff changeset
   112
  objArrayOop au = oopFactory::new_objArray(mu_kh(), MemoryService::num_memory_pools(), CHECK_NH);
9623
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   113
  objArrayHandle usage_after_gc_ah(THREAD, au);
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   114
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   115
  for (int i = 0; i < MemoryService::num_memory_pools(); i++) {
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   116
    Handle before_usage = MemoryService::create_MemoryUsage_obj(gcStatInfo->before_gc_usage_for_pool(i), CHECK_NH);
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   117
    Handle after_usage;
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   118
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   119
    MemoryUsage u = gcStatInfo->after_gc_usage_for_pool(i);
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   120
    if (u.max_size() == 0 && u.used() > 0) {
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   121
      // If max size == 0, this pool is a survivor space.
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   122
      // Set max size = -1 since the pools will be swapped after GC.
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   123
      MemoryUsage usage(u.init_size(), u.used(), u.committed(), (size_t)-1);
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   124
      after_usage = MemoryService::create_MemoryUsage_obj(usage, CHECK_NH);
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   125
    } else {
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   126
        after_usage = MemoryService::create_MemoryUsage_obj(u, CHECK_NH);
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   127
    }
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   128
    usage_before_gc_ah->obj_at_put(i, before_usage());
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   129
    usage_after_gc_ah->obj_at_put(i, after_usage());
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   130
  }
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   131
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   132
  // Current implementation only has 1 attribute (number of GC threads)
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   133
  // The type is 'I'
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   134
  objArrayOop extra_args_array = oopFactory::new_objArray(SystemDictionary::Integer_klass(), 1, CHECK_NH);
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   135
  objArrayHandle extra_array (THREAD, extra_args_array);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   136
  Klass* itKlass = SystemDictionary::Integer_klass();
9623
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   137
  instanceKlassHandle intK(THREAD, itKlass);
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   138
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   139
  instanceHandle extra_arg_val = intK->allocate_instance_handle(CHECK_NH);
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   140
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   141
  {
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   142
    JavaValue res(T_VOID);
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   143
    JavaCallArguments argsInt;
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   144
    argsInt.push_oop(extra_arg_val);
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   145
    argsInt.push_int(gcManager->num_gc_threads());
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   146
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   147
    JavaCalls::call_special(&res,
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   148
                            intK,
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   149
                            vmSymbols::object_initializer_name(),
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   150
                            vmSymbols::int_void_signature(),
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   151
                            &argsInt,
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   152
                            CHECK_NH);
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   153
  }
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   154
  extra_array->obj_at_put(0,extra_arg_val());
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   155
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   156
  Klass* gcInfoklass = Management::com_sun_management_GcInfo_klass(CHECK_NH);
10242
ec32bf88801c 7074579: G1: JVM crash with JDK7 running ATG CRMDemo Fusion App
johnc
parents: 9623
diff changeset
   157
  instanceKlassHandle ik(THREAD, gcInfoklass);
9623
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   158
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   159
  Handle gcInfo_instance = ik->allocate_instance_handle(CHECK_NH);
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   160
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   161
  JavaValue constructor_result(T_VOID);
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   162
  JavaCallArguments constructor_args(16);
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   163
  constructor_args.push_oop(gcInfo_instance);
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   164
  constructor_args.push_oop(getGcInfoBuilder(gcManager,THREAD));
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   165
  constructor_args.push_long(gcStatInfo->gc_index());
12266
a7ec6d9d767f 7087969: GarbageCollectorMXBean notification contains ticks vs millis
fparain
parents: 11766
diff changeset
   166
  constructor_args.push_long(Management::ticks_to_ms(gcStatInfo->start_time()));
a7ec6d9d767f 7087969: GarbageCollectorMXBean notification contains ticks vs millis
fparain
parents: 11766
diff changeset
   167
  constructor_args.push_long(Management::ticks_to_ms(gcStatInfo->end_time()));
9623
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   168
  constructor_args.push_oop(usage_before_gc_ah);
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   169
  constructor_args.push_oop(usage_after_gc_ah);
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   170
  constructor_args.push_oop(extra_array);
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   171
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   172
  JavaCalls::call_special(&constructor_result,
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   173
                          ik,
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   174
                          vmSymbols::object_initializer_name(),
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   175
                          vmSymbols::com_sun_management_GcInfo_constructor_signature(),
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   176
                          &constructor_args,
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   177
                          CHECK_NH);
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   178
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   179
  return Handle(gcInfo_instance());
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   180
}
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   181
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   182
void GCNotifier::sendNotification(TRAPS) {
11766
b1ff60353280 7143760: Memory leak in GarbageCollectionNotifications
fparain
parents: 11591
diff changeset
   183
  GCNotifier::sendNotificationInternal(THREAD);
b1ff60353280 7143760: Memory leak in GarbageCollectionNotifications
fparain
parents: 11591
diff changeset
   184
  // Clearing pending exception to avoid premature termination of
b1ff60353280 7143760: Memory leak in GarbageCollectionNotifications
fparain
parents: 11591
diff changeset
   185
  // the service thread
b1ff60353280 7143760: Memory leak in GarbageCollectionNotifications
fparain
parents: 11591
diff changeset
   186
  if (HAS_PENDING_EXCEPTION) {
b1ff60353280 7143760: Memory leak in GarbageCollectionNotifications
fparain
parents: 11591
diff changeset
   187
    CLEAR_PENDING_EXCEPTION;
b1ff60353280 7143760: Memory leak in GarbageCollectionNotifications
fparain
parents: 11591
diff changeset
   188
  }
b1ff60353280 7143760: Memory leak in GarbageCollectionNotifications
fparain
parents: 11591
diff changeset
   189
}
b1ff60353280 7143760: Memory leak in GarbageCollectionNotifications
fparain
parents: 11591
diff changeset
   190
b1ff60353280 7143760: Memory leak in GarbageCollectionNotifications
fparain
parents: 11591
diff changeset
   191
class NotificationMark : public StackObj {
b1ff60353280 7143760: Memory leak in GarbageCollectionNotifications
fparain
parents: 11591
diff changeset
   192
  // This class is used in GCNotifier::sendNotificationInternal to ensure that
b1ff60353280 7143760: Memory leak in GarbageCollectionNotifications
fparain
parents: 11591
diff changeset
   193
  // the GCNotificationRequest object is properly cleaned up, whatever path
b1ff60353280 7143760: Memory leak in GarbageCollectionNotifications
fparain
parents: 11591
diff changeset
   194
  // is used to exit the method.
b1ff60353280 7143760: Memory leak in GarbageCollectionNotifications
fparain
parents: 11591
diff changeset
   195
  GCNotificationRequest* _request;
b1ff60353280 7143760: Memory leak in GarbageCollectionNotifications
fparain
parents: 11591
diff changeset
   196
public:
b1ff60353280 7143760: Memory leak in GarbageCollectionNotifications
fparain
parents: 11591
diff changeset
   197
  NotificationMark(GCNotificationRequest* r) {
b1ff60353280 7143760: Memory leak in GarbageCollectionNotifications
fparain
parents: 11591
diff changeset
   198
    _request = r;
b1ff60353280 7143760: Memory leak in GarbageCollectionNotifications
fparain
parents: 11591
diff changeset
   199
  }
b1ff60353280 7143760: Memory leak in GarbageCollectionNotifications
fparain
parents: 11591
diff changeset
   200
  ~NotificationMark() {
b1ff60353280 7143760: Memory leak in GarbageCollectionNotifications
fparain
parents: 11591
diff changeset
   201
    assert(_request != NULL, "Sanity check");
b1ff60353280 7143760: Memory leak in GarbageCollectionNotifications
fparain
parents: 11591
diff changeset
   202
    delete _request;
b1ff60353280 7143760: Memory leak in GarbageCollectionNotifications
fparain
parents: 11591
diff changeset
   203
  }
b1ff60353280 7143760: Memory leak in GarbageCollectionNotifications
fparain
parents: 11591
diff changeset
   204
};
b1ff60353280 7143760: Memory leak in GarbageCollectionNotifications
fparain
parents: 11591
diff changeset
   205
b1ff60353280 7143760: Memory leak in GarbageCollectionNotifications
fparain
parents: 11591
diff changeset
   206
void GCNotifier::sendNotificationInternal(TRAPS) {
9623
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   207
  ResourceMark rm(THREAD);
11766
b1ff60353280 7143760: Memory leak in GarbageCollectionNotifications
fparain
parents: 11591
diff changeset
   208
  HandleMark hm(THREAD);
9623
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   209
  GCNotificationRequest *request = getRequest();
11766
b1ff60353280 7143760: Memory leak in GarbageCollectionNotifications
fparain
parents: 11591
diff changeset
   210
  if (request != NULL) {
b1ff60353280 7143760: Memory leak in GarbageCollectionNotifications
fparain
parents: 11591
diff changeset
   211
    NotificationMark nm(request);
b1ff60353280 7143760: Memory leak in GarbageCollectionNotifications
fparain
parents: 11591
diff changeset
   212
    Handle objGcInfo = createGcInfo(request->gcManager, request->gcStatInfo, THREAD);
9623
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   213
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   214
    Handle objName = java_lang_String::create_from_platform_dependent_str(request->gcManager->name(), CHECK);
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   215
    Handle objAction = java_lang_String::create_from_platform_dependent_str(request->gcAction, CHECK);
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   216
    Handle objCause = java_lang_String::create_from_platform_dependent_str(request->gcCause, CHECK);
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   217
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   218
    Klass* k = Management::sun_management_GarbageCollectorImpl_klass(CHECK);
11766
b1ff60353280 7143760: Memory leak in GarbageCollectionNotifications
fparain
parents: 11591
diff changeset
   219
    instanceKlassHandle gc_mbean_klass(THREAD, k);
9623
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   220
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   221
    instanceOop gc_mbean = request->gcManager->get_memory_manager_instance(THREAD);
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   222
    instanceHandle gc_mbean_h(THREAD, gc_mbean);
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   223
    if (!gc_mbean_h->is_a(k)) {
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   224
      THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   225
                "This GCMemoryManager doesn't have a GarbageCollectorMXBean");
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   226
    }
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   227
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   228
    JavaValue result(T_VOID);
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   229
    JavaCallArguments args(gc_mbean_h);
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   230
    args.push_long(request->timestamp);
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   231
    args.push_oop(objName);
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   232
    args.push_oop(objAction);
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   233
    args.push_oop(objCause);
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   234
    args.push_oop(objGcInfo);
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   235
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   236
    JavaCalls::call_virtual(&result,
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   237
                            gc_mbean_klass,
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   238
                            vmSymbols::createGCNotification_name(),
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   239
                            vmSymbols::createGCNotification_signature(),
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   240
                            &args,
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   241
                            CHECK);
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   242
  }
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   243
}
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
diff changeset
   244