hotspot/src/share/vm/services/management.cpp
changeset 17296 68557efd8583
parent 17030 c91fa0770046
child 18444 8adb4bc92f18
equal deleted inserted replaced
17093:04fc6db0518b 17296:68557efd8583
     1 /*
     1 /*
     2  * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
     2  * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.
     7  * published by the Free Software Foundation.
    66 Klass* Management::_memoryManagerMXBean_klass = NULL;
    66 Klass* Management::_memoryManagerMXBean_klass = NULL;
    67 Klass* Management::_garbageCollectorMXBean_klass = NULL;
    67 Klass* Management::_garbageCollectorMXBean_klass = NULL;
    68 Klass* Management::_managementFactory_klass = NULL;
    68 Klass* Management::_managementFactory_klass = NULL;
    69 Klass* Management::_garbageCollectorImpl_klass = NULL;
    69 Klass* Management::_garbageCollectorImpl_klass = NULL;
    70 Klass* Management::_gcInfo_klass = NULL;
    70 Klass* Management::_gcInfo_klass = NULL;
       
    71 Klass* Management::_diagnosticCommandImpl_klass = NULL;
       
    72 Klass* Management::_managementFactoryHelper_klass = NULL;
       
    73 
    71 
    74 
    72 jmmOptionalSupport Management::_optional_support = {0};
    75 jmmOptionalSupport Management::_optional_support = {0};
    73 TimeStamp Management::_stamp;
    76 TimeStamp Management::_stamp;
    74 
    77 
    75 void management_init() {
    78 void management_init() {
   126 #if INCLUDE_SERVICES
   129 #if INCLUDE_SERVICES
   127   // This depends on the heap inspector
   130   // This depends on the heap inspector
   128   _optional_support.isSynchronizerUsageSupported = 1;
   131   _optional_support.isSynchronizerUsageSupported = 1;
   129 #endif // INCLUDE_SERVICES
   132 #endif // INCLUDE_SERVICES
   130   _optional_support.isThreadAllocatedMemorySupported = 1;
   133   _optional_support.isThreadAllocatedMemorySupported = 1;
       
   134   _optional_support.isRemoteDiagnosticCommandsSupported = 1;
   131 
   135 
   132   // Registration of the diagnostic commands
   136   // Registration of the diagnostic commands
   133   DCmdRegistrant::register_dcmds();
   137   DCmdRegistrant::register_dcmds();
   134   DCmdRegistrant::register_dcmds_ext();
   138   DCmdRegistrant::register_dcmds_ext();
   135   DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl<NMTDCmd>(true, false));
   139   uint32_t full_export = DCmd_Source_Internal | DCmd_Source_AttachAPI
       
   140                          | DCmd_Source_MBean;
       
   141   DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl<NMTDCmd>(full_export, true, false));
   136 }
   142 }
   137 
   143 
   138 void Management::initialize(TRAPS) {
   144 void Management::initialize(TRAPS) {
   139   // Start the service thread
   145   // Start the service thread
   140   ServiceThread::initialize();
   146   ServiceThread::initialize();
   258 Klass* Management::com_sun_management_GcInfo_klass(TRAPS) {
   264 Klass* Management::com_sun_management_GcInfo_klass(TRAPS) {
   259   if (_gcInfo_klass == NULL) {
   265   if (_gcInfo_klass == NULL) {
   260     _gcInfo_klass = load_and_initialize_klass(vmSymbols::com_sun_management_GcInfo(), CHECK_NULL);
   266     _gcInfo_klass = load_and_initialize_klass(vmSymbols::com_sun_management_GcInfo(), CHECK_NULL);
   261   }
   267   }
   262   return _gcInfo_klass;
   268   return _gcInfo_klass;
       
   269 }
       
   270 
       
   271 Klass* Management::sun_management_DiagnosticCommandImpl_klass(TRAPS) {
       
   272   if (_diagnosticCommandImpl_klass == NULL) {
       
   273     _diagnosticCommandImpl_klass = load_and_initialize_klass(vmSymbols::sun_management_DiagnosticCommandImpl(), CHECK_NULL);
       
   274   }
       
   275   return _diagnosticCommandImpl_klass;
       
   276 }
       
   277 
       
   278 Klass* Management::sun_management_ManagementFactoryHelper_klass(TRAPS) {
       
   279   if (_managementFactoryHelper_klass == NULL) {
       
   280     _managementFactoryHelper_klass = load_and_initialize_klass(vmSymbols::sun_management_ManagementFactoryHelper(), CHECK_NULL);
       
   281   }
       
   282   return _managementFactoryHelper_klass;
   263 }
   283 }
   264 
   284 
   265 static void initialize_ThreadInfo_constructor_arguments(JavaCallArguments* args, ThreadSnapshot* snapshot, TRAPS) {
   285 static void initialize_ThreadInfo_constructor_arguments(JavaCallArguments* args, ThreadSnapshot* snapshot, TRAPS) {
   266   Handle snapshot_thread(THREAD, snapshot->threadObj());
   286   Handle snapshot_thread(THREAD, snapshot->threadObj());
   267 
   287 
  2142 #endif // INCLUDE_SERVICES
  2162 #endif // INCLUDE_SERVICES
  2143 JVM_END
  2163 JVM_END
  2144 
  2164 
  2145 JVM_ENTRY(jobjectArray, jmm_GetDiagnosticCommands(JNIEnv *env))
  2165 JVM_ENTRY(jobjectArray, jmm_GetDiagnosticCommands(JNIEnv *env))
  2146   ResourceMark rm(THREAD);
  2166   ResourceMark rm(THREAD);
  2147   GrowableArray<const char *>* dcmd_list = DCmdFactory::DCmd_list();
  2167   GrowableArray<const char *>* dcmd_list = DCmdFactory::DCmd_list(DCmd_Source_MBean);
  2148   objArrayOop cmd_array_oop = oopFactory::new_objArray(SystemDictionary::String_klass(),
  2168   objArrayOop cmd_array_oop = oopFactory::new_objArray(SystemDictionary::String_klass(),
  2149           dcmd_list->length(), CHECK_NULL);
  2169           dcmd_list->length(), CHECK_NULL);
  2150   objArrayHandle cmd_array(THREAD, cmd_array_oop);
  2170   objArrayHandle cmd_array(THREAD, cmd_array_oop);
  2151   for (int i = 0; i < dcmd_list->length(); i++) {
  2171   for (int i = 0; i < dcmd_list->length(); i++) {
  2152     oop cmd_name = java_lang_String::create_oop_from_str(dcmd_list->at(i), CHECK_NULL);
  2172     oop cmd_name = java_lang_String::create_oop_from_str(dcmd_list->at(i), CHECK_NULL);
  2171   if (element_klass != SystemDictionary::String_klass()) {
  2191   if (element_klass != SystemDictionary::String_klass()) {
  2172     THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
  2192     THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
  2173                "Array element type is not String class");
  2193                "Array element type is not String class");
  2174   }
  2194   }
  2175 
  2195 
  2176   GrowableArray<DCmdInfo *>* info_list = DCmdFactory::DCmdInfo_list();
  2196   GrowableArray<DCmdInfo *>* info_list = DCmdFactory::DCmdInfo_list(DCmd_Source_MBean);
  2177 
  2197 
  2178   int num_cmds = cmds_ah->length();
  2198   int num_cmds = cmds_ah->length();
  2179   for (int i = 0; i < num_cmds; i++) {
  2199   for (int i = 0; i < num_cmds; i++) {
  2180     oop cmd = cmds_ah->obj_at(i);
  2200     oop cmd = cmds_ah->obj_at(i);
  2181     if (cmd == NULL) {
  2201     if (cmd == NULL) {
  2194     }
  2214     }
  2195     DCmdInfo* info = info_list->at(pos);
  2215     DCmdInfo* info = info_list->at(pos);
  2196     infoArray[i].name = info->name();
  2216     infoArray[i].name = info->name();
  2197     infoArray[i].description = info->description();
  2217     infoArray[i].description = info->description();
  2198     infoArray[i].impact = info->impact();
  2218     infoArray[i].impact = info->impact();
       
  2219     JavaPermission p = info->permission();
       
  2220     infoArray[i].permission_class = p._class;
       
  2221     infoArray[i].permission_name = p._name;
       
  2222     infoArray[i].permission_action = p._action;
  2199     infoArray[i].num_arguments = info->num_arguments();
  2223     infoArray[i].num_arguments = info->num_arguments();
  2200     infoArray[i].enabled = info->is_enabled();
  2224     infoArray[i].enabled = info->is_enabled();
  2201   }
  2225   }
  2202 JVM_END
  2226 JVM_END
  2203 
  2227 
  2213   if (cmd_name == NULL) {
  2237   if (cmd_name == NULL) {
  2214     THROW_MSG(vmSymbols::java_lang_NullPointerException(),
  2238     THROW_MSG(vmSymbols::java_lang_NullPointerException(),
  2215               "Command line content cannot be null.");
  2239               "Command line content cannot be null.");
  2216   }
  2240   }
  2217   DCmd* dcmd = NULL;
  2241   DCmd* dcmd = NULL;
  2218   DCmdFactory*factory = DCmdFactory::factory(cmd_name, strlen(cmd_name));
  2242   DCmdFactory*factory = DCmdFactory::factory(DCmd_Source_MBean, cmd_name,
       
  2243                                              strlen(cmd_name));
  2219   if (factory != NULL) {
  2244   if (factory != NULL) {
  2220     dcmd = factory->create_resource_instance(NULL);
  2245     dcmd = factory->create_resource_instance(NULL);
  2221   }
  2246   }
  2222   if (dcmd == NULL) {
  2247   if (dcmd == NULL) {
  2223     THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
  2248     THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
  2233     infoArray[i].description = array->at(i)->description();
  2258     infoArray[i].description = array->at(i)->description();
  2234     infoArray[i].type = array->at(i)->type();
  2259     infoArray[i].type = array->at(i)->type();
  2235     infoArray[i].default_string = array->at(i)->default_string();
  2260     infoArray[i].default_string = array->at(i)->default_string();
  2236     infoArray[i].mandatory = array->at(i)->is_mandatory();
  2261     infoArray[i].mandatory = array->at(i)->is_mandatory();
  2237     infoArray[i].option = array->at(i)->is_option();
  2262     infoArray[i].option = array->at(i)->is_option();
       
  2263     infoArray[i].multiple = array->at(i)->is_multiple();
  2238     infoArray[i].position = array->at(i)->position();
  2264     infoArray[i].position = array->at(i)->position();
  2239   }
  2265   }
  2240   return;
  2266   return;
  2241 JVM_END
  2267 JVM_END
  2242 
  2268 
  2251   if (cmdline == NULL) {
  2277   if (cmdline == NULL) {
  2252     THROW_MSG_NULL(vmSymbols::java_lang_NullPointerException(),
  2278     THROW_MSG_NULL(vmSymbols::java_lang_NullPointerException(),
  2253                    "Command line content cannot be null.");
  2279                    "Command line content cannot be null.");
  2254   }
  2280   }
  2255   bufferedStream output;
  2281   bufferedStream output;
  2256   DCmd::parse_and_execute(&output, cmdline, ' ', CHECK_NULL);
  2282   DCmd::parse_and_execute(DCmd_Source_MBean, &output, cmdline, ' ', CHECK_NULL);
  2257   oop result = java_lang_String::create_oop_from_str(output.as_string(), CHECK_NULL);
  2283   oop result = java_lang_String::create_oop_from_str(output.as_string(), CHECK_NULL);
  2258   return (jstring) JNIHandles::make_local(env, result);
  2284   return (jstring) JNIHandles::make_local(env, result);
       
  2285 JVM_END
       
  2286 
       
  2287 JVM_ENTRY(void, jmm_SetDiagnosticFrameworkNotificationEnabled(JNIEnv *env, jboolean enabled))
       
  2288   DCmdFactory::set_jmx_notification_enabled(enabled?true:false);
  2259 JVM_END
  2289 JVM_END
  2260 
  2290 
  2261 jlong Management::ticks_to_ms(jlong ticks) {
  2291 jlong Management::ticks_to_ms(jlong ticks) {
  2262   assert(os::elapsed_frequency() > 0, "Must be non-zero");
  2292   assert(os::elapsed_frequency() > 0, "Must be non-zero");
  2263   return (jlong)(((double)ticks / (double)os::elapsed_frequency())
  2293   return (jlong)(((double)ticks / (double)os::elapsed_frequency())
  2302   jmm_DumpThreads,
  2332   jmm_DumpThreads,
  2303   jmm_SetGCNotificationEnabled,
  2333   jmm_SetGCNotificationEnabled,
  2304   jmm_GetDiagnosticCommands,
  2334   jmm_GetDiagnosticCommands,
  2305   jmm_GetDiagnosticCommandInfo,
  2335   jmm_GetDiagnosticCommandInfo,
  2306   jmm_GetDiagnosticCommandArgumentsInfo,
  2336   jmm_GetDiagnosticCommandArgumentsInfo,
  2307   jmm_ExecuteDiagnosticCommand
  2337   jmm_ExecuteDiagnosticCommand,
       
  2338   jmm_SetDiagnosticFrameworkNotificationEnabled
  2308 };
  2339 };
  2309 #endif // INCLUDE_MANAGEMENT
  2340 #endif // INCLUDE_MANAGEMENT
  2310 
  2341 
  2311 void* Management::get_jmm_interface(int version) {
  2342 void* Management::get_jmm_interface(int version) {
  2312 #if INCLUDE_MANAGEMENT
  2343 #if INCLUDE_MANAGEMENT