1 /* 2 * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 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 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 * 23 */ 24 25 #ifndef SHARE_VM_SERVICES_DIAGNOSTICCOMMAND_HPP 26 #define SHARE_VM_SERVICES_DIAGNOSTICCOMMAND_HPP 27 28 #include "runtime/arguments.hpp" 29 #include "classfile/vmSymbols.hpp" 30 #include "utilities/ostream.hpp" 31 #include "runtime/vm_version.hpp" 32 #include "runtime/vmThread.hpp" 33 #include "runtime/os.hpp" 34 #include "services/diagnosticArgument.hpp" 35 #include "services/diagnosticCommand.hpp" 36 #include "services/diagnosticFramework.hpp" 37 #include "services/diagnosticCommand_ext.hpp" 38 #include "utilities/macros.hpp" 39 40 class HelpDCmd : public DCmdWithParser { 41 protected: 42 DCmdArgument<bool> _all; 43 DCmdArgument<char*> _cmd; 44 public: 45 HelpDCmd(outputStream* output, bool heap); 46 static const char* name() { return "help"; } 47 static const char* description() { 48 return "For more information about a specific command use 'help <command>'. " 49 "With no argument this will show a list of available commands. " 50 "'help all' will show help for all commands."; 51 } 52 static const char* impact() { return "Low"; } 53 static int num_arguments(); 54 virtual void execute(DCmdSource source, TRAPS); 55 }; 56 57 class VersionDCmd : public DCmd { 58 public: 59 VersionDCmd(outputStream* output, bool heap) : DCmd(output,heap) { } 60 static const char* name() { return "VM.version"; } 61 static const char* description() { 62 return "Print JVM version information."; 63 } 64 static const char* impact() { return "Low"; } 65 static const JavaPermission permission() { 66 JavaPermission p = {"java.util.PropertyPermission", 67 "java.vm.version", "read"}; 68 return p; 69 } 70 static int num_arguments() { return 0; } 71 virtual void execute(DCmdSource source, TRAPS); 72 }; 73 74 class CommandLineDCmd : public DCmd { 75 public: 76 CommandLineDCmd(outputStream* output, bool heap) : DCmd(output, heap) { } 77 static const char* name() { return "VM.command_line"; } 78 static const char* description() { 79 return "Print the command line used to start this VM instance."; 80 } 81 static const char* impact() { return "Low"; } 82 static const JavaPermission permission() { 83 JavaPermission p = {"java.lang.management.ManagementPermission", 84 "monitor", NULL}; 85 return p; 86 } 87 static int num_arguments() { return 0; } 88 virtual void execute(DCmdSource source, TRAPS) { 89 Arguments::print_on(_output); 90 } 91 }; 92 93 // See also: get_system_properties in attachListener.cpp 94 class PrintSystemPropertiesDCmd : public DCmd { 95 public: 96 PrintSystemPropertiesDCmd(outputStream* output, bool heap) : DCmd(output, heap) { } 97 static const char* name() { return "VM.system_properties"; } 98 static const char* description() { 99 return "Print system properties."; 100 } 101 static const char* impact() { 102 return "Low"; 103 } 104 static const JavaPermission permission() { 105 JavaPermission p = {"java.util.PropertyPermission", 106 "*", "read"}; 107 return p; 108 } 109 static int num_arguments() { return 0; } 110 virtual void execute(DCmdSource source, TRAPS); 111 }; 112 113 // See also: print_flag in attachListener.cpp 114 class PrintVMFlagsDCmd : public DCmdWithParser { 115 protected: 116 DCmdArgument<bool> _all; 117 public: 118 PrintVMFlagsDCmd(outputStream* output, bool heap); 119 static const char* name() { return "VM.flags"; } 120 static const char* description() { 121 return "Print VM flag options and their current values."; 122 } 123 static const char* impact() { 124 return "Low"; 125 } 126 static const JavaPermission permission() { 127 JavaPermission p = {"java.lang.management.ManagementPermission", 128 "monitor", NULL}; 129 return p; 130 } 131 static int num_arguments(); 132 virtual void execute(DCmdSource source, TRAPS); 133 }; 134 135 class VMDynamicLibrariesDCmd : public DCmd { 136 public: 137 VMDynamicLibrariesDCmd(outputStream* output, bool heap); 138 static const char* name() { 139 return "VM.dynlibs"; 140 } 141 static const char* description() { 142 return "Print loaded dynamic libraries."; 143 } 144 static const char* impact() { 145 return "Low"; 146 } 147 static const JavaPermission permission() { 148 JavaPermission p = {"java.lang.management.ManagementPermission", 149 "monitor", NULL}; 150 return p; 151 } 152 static int num_arguments() { 153 return 0; 154 }; 155 virtual void execute(DCmdSource source, TRAPS); 156 }; 157 158 class VMUptimeDCmd : public DCmdWithParser { 159 protected: 160 DCmdArgument<bool> _date; 161 public: 162 VMUptimeDCmd(outputStream* output, bool heap); 163 static const char* name() { return "VM.uptime"; } 164 static const char* description() { 165 return "Print VM uptime."; 166 } 167 static const char* impact() { 168 return "Low"; 169 } 170 static int num_arguments(); 171 virtual void execute(DCmdSource source, TRAPS); 172 }; 173 174 class SystemGCDCmd : public DCmd { 175 public: 176 SystemGCDCmd(outputStream* output, bool heap) : DCmd(output, heap) { } 177 static const char* name() { return "GC.run"; } 178 static const char* description() { 179 return "Call java.lang.System.gc()."; 180 } 181 static const char* impact() { 182 return "Medium: Depends on Java heap size and content."; 183 } 184 static int num_arguments() { return 0; } 185 virtual void execute(DCmdSource source, TRAPS); 186 }; 187 188 class RunFinalizationDCmd : public DCmd { 189 public: 190 RunFinalizationDCmd(outputStream* output, bool heap) : DCmd(output, heap) { } 191 static const char* name() { return "GC.run_finalization"; } 192 static const char* description() { 193 return "Call java.lang.System.runFinalization()."; 194 } 195 static const char* impact() { 196 return "Medium: Depends on Java content."; 197 } 198 static int num_arguments() { return 0; } 199 virtual void execute(DCmdSource source, TRAPS); 200 }; 201 202 #if INCLUDE_SERVICES // Heap dumping supported 203 // See also: dump_heap in attachListener.cpp 204 class HeapDumpDCmd : public DCmdWithParser { 205 protected: 206 DCmdArgument<char*> _filename; 207 DCmdArgument<bool> _all; 208 public: 209 HeapDumpDCmd(outputStream* output, bool heap); 210 static const char* name() { 211 return "GC.heap_dump"; 212 } 213 static const char* description() { 214 return "Generate a HPROF format dump of the Java heap."; 215 } 216 static const char* impact() { 217 return "High: Depends on Java heap size and content. " 218 "Request a full GC unless the '-all' option is specified."; 219 } 220 static const JavaPermission permission() { 221 JavaPermission p = {"java.lang.management.ManagementPermission", 222 "monitor", NULL}; 223 return p; 224 } 225 static int num_arguments(); 226 virtual void execute(DCmdSource source, TRAPS); 227 }; 228 #endif // INCLUDE_SERVICES 229 230 // See also: inspectheap in attachListener.cpp 231 class ClassHistogramDCmd : public DCmdWithParser { 232 protected: 233 DCmdArgument<bool> _all; 234 public: 235 ClassHistogramDCmd(outputStream* output, bool heap); 236 static const char* name() { 237 return "GC.class_histogram"; 238 } 239 static const char* description() { 240 return "Provide statistics about the Java heap usage."; 241 } 242 static const char* impact() { 243 return "High: Depends on Java heap size and content."; 244 } 245 static const JavaPermission permission() { 246 JavaPermission p = {"java.lang.management.ManagementPermission", 247 "monitor", NULL}; 248 return p; 249 } 250 static int num_arguments(); 251 virtual void execute(DCmdSource source, TRAPS); 252 }; 253 254 class ClassStatsDCmd : public DCmdWithParser { 255 protected: 256 DCmdArgument<bool> _all; 257 DCmdArgument<bool> _csv; 258 DCmdArgument<bool> _help; 259 DCmdArgument<char*> _columns; 260 public: 261 ClassStatsDCmd(outputStream* output, bool heap); 262 static const char* name() { 263 return "GC.class_stats"; 264 } 265 static const char* description() { 266 return "Provide statistics about Java class meta data. Requires -XX:+UnlockDiagnosticVMOptions."; 267 } 268 static const char* impact() { 269 return "High: Depends on Java heap size and content."; 270 } 271 static int num_arguments(); 272 virtual void execute(DCmdSource source, TRAPS); 273 }; 274 275 // See also: thread_dump in attachListener.cpp 276 class ThreadDumpDCmd : public DCmdWithParser { 277 protected: 278 DCmdArgument<bool> _locks; 279 public: 280 ThreadDumpDCmd(outputStream* output, bool heap); 281 static const char* name() { return "Thread.print"; } 282 static const char* description() { 283 return "Print all threads with stacktraces."; 284 } 285 static const char* impact() { 286 return "Medium: Depends on the number of threads."; 287 } 288 static const JavaPermission permission() { 289 JavaPermission p = {"java.lang.management.ManagementPermission", 290 "monitor", NULL}; 291 return p; 292 } 293 static int num_arguments(); 294 virtual void execute(DCmdSource source, TRAPS); 295 }; 296 297 // Enhanced JMX Agent support 298 299 class JMXStartRemoteDCmd : public DCmdWithParser { 300 301 // Explicitly list all properties that could be 302 // passed to Agent.startRemoteManagementAgent() 303 // com.sun.management is omitted 304 305 DCmdArgument<char *> _config_file; 306 DCmdArgument<char *> _jmxremote_port; 307 DCmdArgument<char *> _jmxremote_rmi_port; 308 DCmdArgument<char *> _jmxremote_ssl; 309 DCmdArgument<char *> _jmxremote_registry_ssl; 310 DCmdArgument<char *> _jmxremote_authenticate; 311 DCmdArgument<char *> _jmxremote_password_file; 312 DCmdArgument<char *> _jmxremote_access_file; 313 DCmdArgument<char *> _jmxremote_login_config; 314 DCmdArgument<char *> _jmxremote_ssl_enabled_cipher_suites; 315 DCmdArgument<char *> _jmxremote_ssl_enabled_protocols; 316 DCmdArgument<char *> _jmxremote_ssl_need_client_auth; 317 DCmdArgument<char *> _jmxremote_ssl_config_file; 318 319 // JDP support 320 // Keep autodiscovery char* not bool to pass true/false 321 // as property value to java level. 322 DCmdArgument<char *> _jmxremote_autodiscovery; 323 DCmdArgument<jlong> _jdp_port; 324 DCmdArgument<char *> _jdp_address; 325 DCmdArgument<char *> _jdp_source_addr; 326 DCmdArgument<jlong> _jdp_ttl; 327 DCmdArgument<jlong> _jdp_pause; 328 DCmdArgument<char *> _jdp_name; 329 330 public: 331 JMXStartRemoteDCmd(outputStream *output, bool heap_allocated); 332 333 static const char *name() { 334 return "ManagementAgent.start"; 335 } 336 337 static const char *description() { 338 return "Start remote management agent."; 339 } 340 341 static int num_arguments(); 342 343 virtual void execute(DCmdSource source, TRAPS); 344 345 }; 346 347 class JMXStartLocalDCmd : public DCmd { 348 349 // Explicitly request start of local agent, 350 // it will not be started by start dcmd 351 352 353 public: 354 JMXStartLocalDCmd(outputStream *output, bool heap_allocated); 355 356 static const char *name() { 357 return "ManagementAgent.start_local"; 358 } 359 360 static const char *description() { 361 return "Start local management agent."; 362 } 363 364 virtual void execute(DCmdSource source, TRAPS); 365 366 }; 367 368 class JMXStopRemoteDCmd : public DCmd { 369 public: 370 JMXStopRemoteDCmd(outputStream *output, bool heap_allocated) : 371 DCmd(output, heap_allocated) { 372 // Do Nothing 373 } 374 375 static const char *name() { 376 return "ManagementAgent.stop"; 377 } 378 379 static const char *description() { 380 return "Stop remote management agent."; 381 } 382 383 virtual void execute(DCmdSource source, TRAPS); 384 }; 385 386 class RotateGCLogDCmd : public DCmd { 387 public: 388 RotateGCLogDCmd(outputStream* output, bool heap) : DCmd(output, heap) {} 389 static const char* name() { return "GC.rotate_log"; } 390 static const char* description() { 391 return "Force the GC log file to be rotated."; 392 } 393 static const char* impact() { return "Low"; } 394 virtual void execute(DCmdSource source, TRAPS); 395 static int num_arguments() { return 0; } 396 static const JavaPermission permission() { 397 JavaPermission p = {"java.lang.management.ManagementPermission", 398 "control", NULL}; 399 return p; 400 } 401 }; 402 403 #endif // SHARE_VM_SERVICES_DIAGNOSTICCOMMAND_HPP