Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mobile
Path: blob/master/src/hotspot/share/services/diagnosticCommand.hpp
41144 views
1
/*
2
* Copyright (c) 2011, 2021, 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_SERVICES_DIAGNOSTICCOMMAND_HPP
26
#define SHARE_SERVICES_DIAGNOSTICCOMMAND_HPP
27
28
#include "classfile/stringTable.hpp"
29
#include "classfile/symbolTable.hpp"
30
#include "classfile/systemDictionary.hpp"
31
#include "classfile/vmSymbols.hpp"
32
#include "runtime/arguments.hpp"
33
#include "runtime/os.hpp"
34
#include "runtime/vmThread.hpp"
35
#include "services/diagnosticArgument.hpp"
36
#include "services/diagnosticCommand.hpp"
37
#include "services/diagnosticFramework.hpp"
38
#include "utilities/macros.hpp"
39
#include "utilities/ostream.hpp"
40
#include "oops/method.hpp"
41
42
class HelpDCmd : public DCmdWithParser {
43
protected:
44
DCmdArgument<bool> _all;
45
DCmdArgument<char*> _cmd;
46
public:
47
HelpDCmd(outputStream* output, bool heap);
48
static const char* name() { return "help"; }
49
static const char* description() {
50
return "For more information about a specific command use 'help <command>'. "
51
"With no argument this will show a list of available commands. "
52
"'help all' will show help for all commands.";
53
}
54
static const char* impact() { return "Low"; }
55
virtual void execute(DCmdSource source, TRAPS);
56
};
57
58
class VersionDCmd : public DCmd {
59
public:
60
VersionDCmd(outputStream* output, bool heap) : DCmd(output,heap) { }
61
static const char* name() { return "VM.version"; }
62
static const char* description() {
63
return "Print JVM version information.";
64
}
65
static const char* impact() { return "Low"; }
66
static const JavaPermission permission() {
67
JavaPermission p = {"java.util.PropertyPermission",
68
"java.vm.version", "read"};
69
return p;
70
}
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
virtual void execute(DCmdSource source, TRAPS) {
88
Arguments::print_on(_output);
89
}
90
};
91
92
// See also: get_system_properties in attachListener.cpp
93
class PrintSystemPropertiesDCmd : public DCmd {
94
public:
95
PrintSystemPropertiesDCmd(outputStream* output, bool heap) : DCmd(output, heap) { }
96
static const char* name() { return "VM.system_properties"; }
97
static const char* description() {
98
return "Print system properties.";
99
}
100
static const char* impact() {
101
return "Low";
102
}
103
static const JavaPermission permission() {
104
JavaPermission p = {"java.util.PropertyPermission",
105
"*", "read"};
106
return p;
107
}
108
virtual void execute(DCmdSource source, TRAPS);
109
};
110
111
// See also: print_flag in attachListener.cpp
112
class PrintVMFlagsDCmd : public DCmdWithParser {
113
protected:
114
DCmdArgument<bool> _all;
115
public:
116
PrintVMFlagsDCmd(outputStream* output, bool heap);
117
static const char* name() { return "VM.flags"; }
118
static const char* description() {
119
return "Print VM flag options and their current values.";
120
}
121
static const char* impact() {
122
return "Low";
123
}
124
static const JavaPermission permission() {
125
JavaPermission p = {"java.lang.management.ManagementPermission",
126
"monitor", NULL};
127
return p;
128
}
129
virtual void execute(DCmdSource source, TRAPS);
130
};
131
132
class SetVMFlagDCmd : public DCmdWithParser {
133
protected:
134
DCmdArgument<char*> _flag;
135
DCmdArgument<char*> _value;
136
137
public:
138
SetVMFlagDCmd(outputStream* output, bool heap);
139
static const char* name() { return "VM.set_flag"; }
140
static const char* description() {
141
return "Sets VM flag option using the provided value.";
142
}
143
static const char* impact() {
144
return "Low";
145
}
146
static const JavaPermission permission() {
147
JavaPermission p = {"java.lang.management.ManagementPermission",
148
"control", NULL};
149
return p;
150
}
151
virtual void execute(DCmdSource source, TRAPS);
152
};
153
154
class JVMTIDataDumpDCmd : public DCmd {
155
public:
156
JVMTIDataDumpDCmd(outputStream* output, bool heap) : DCmd(output, heap) { }
157
static const char* name() { return "JVMTI.data_dump"; }
158
static const char* description() {
159
return "Signal the JVM to do a data-dump request for JVMTI.";
160
}
161
static const char* impact() {
162
return "High";
163
}
164
static const JavaPermission permission() {
165
JavaPermission p = {"java.lang.management.ManagementPermission",
166
"monitor", NULL};
167
return p;
168
}
169
virtual void execute(DCmdSource source, TRAPS);
170
};
171
172
#if INCLUDE_SERVICES
173
#if INCLUDE_JVMTI
174
class JVMTIAgentLoadDCmd : public DCmdWithParser {
175
protected:
176
DCmdArgument<char*> _libpath;
177
DCmdArgument<char*> _option;
178
public:
179
JVMTIAgentLoadDCmd(outputStream* output, bool heap);
180
static const char* name() { return "JVMTI.agent_load"; }
181
static const char* description() {
182
return "Load JVMTI native agent.";
183
}
184
static const char* impact() { return "Low"; }
185
static const JavaPermission permission() {
186
JavaPermission p = {"java.lang.management.ManagementPermission",
187
"control", NULL};
188
return p;
189
}
190
virtual void execute(DCmdSource source, TRAPS);
191
};
192
#endif // INCLUDE_JVMTI
193
#endif // INCLUDE_SERVICES
194
195
class VMDynamicLibrariesDCmd : public DCmd {
196
public:
197
VMDynamicLibrariesDCmd(outputStream* output, bool heap);
198
static const char* name() {
199
return "VM.dynlibs";
200
}
201
static const char* description() {
202
return "Print loaded dynamic libraries.";
203
}
204
static const char* impact() {
205
return "Low";
206
}
207
static const JavaPermission permission() {
208
JavaPermission p = {"java.lang.management.ManagementPermission",
209
"monitor", NULL};
210
return p;
211
}
212
virtual void execute(DCmdSource source, TRAPS);
213
};
214
215
class VMUptimeDCmd : public DCmdWithParser {
216
protected:
217
DCmdArgument<bool> _date;
218
public:
219
VMUptimeDCmd(outputStream* output, bool heap);
220
static const char* name() { return "VM.uptime"; }
221
static const char* description() {
222
return "Print VM uptime.";
223
}
224
static const char* impact() {
225
return "Low";
226
}
227
virtual void execute(DCmdSource source, TRAPS);
228
};
229
230
class VMInfoDCmd : public DCmd {
231
public:
232
VMInfoDCmd(outputStream* output, bool heap) : DCmd(output, heap) { }
233
static const char* name() { return "VM.info"; }
234
static const char* description() {
235
return "Print information about JVM environment and status.";
236
}
237
static const char* impact() { return "Low"; }
238
static const JavaPermission permission() {
239
JavaPermission p = {"java.lang.management.ManagementPermission",
240
"monitor", NULL};
241
return p;
242
}
243
virtual void execute(DCmdSource source, TRAPS);
244
};
245
246
class SystemGCDCmd : public DCmd {
247
public:
248
SystemGCDCmd(outputStream* output, bool heap) : DCmd(output, heap) { }
249
static const char* name() { return "GC.run"; }
250
static const char* description() {
251
return "Call java.lang.System.gc().";
252
}
253
static const char* impact() {
254
return "Medium: Depends on Java heap size and content.";
255
}
256
virtual void execute(DCmdSource source, TRAPS);
257
};
258
259
class RunFinalizationDCmd : public DCmd {
260
public:
261
RunFinalizationDCmd(outputStream* output, bool heap) : DCmd(output, heap) { }
262
static const char* name() { return "GC.run_finalization"; }
263
static const char* description() {
264
return "Call java.lang.System.runFinalization().";
265
}
266
static const char* impact() {
267
return "Medium: Depends on Java content.";
268
}
269
virtual void execute(DCmdSource source, TRAPS);
270
};
271
272
class HeapInfoDCmd : public DCmd {
273
public:
274
HeapInfoDCmd(outputStream* output, bool heap) : DCmd(output, heap) { }
275
static const char* name() { return "GC.heap_info"; }
276
static const char* description() {
277
return "Provide generic Java heap information.";
278
}
279
static const char* impact() {
280
return "Medium";
281
}
282
static const JavaPermission permission() {
283
JavaPermission p = {"java.lang.management.ManagementPermission",
284
"monitor", NULL};
285
return p;
286
}
287
288
virtual void execute(DCmdSource source, TRAPS);
289
};
290
291
class FinalizerInfoDCmd : public DCmd {
292
public:
293
FinalizerInfoDCmd(outputStream* output, bool heap) : DCmd(output, heap) { }
294
static const char* name() { return "GC.finalizer_info"; }
295
static const char* description() {
296
return "Provide information about Java finalization queue.";
297
}
298
static const char* impact() {
299
return "Medium";
300
}
301
static const JavaPermission permission() {
302
JavaPermission p = {"java.lang.management.ManagementPermission",
303
"monitor", NULL};
304
return p;
305
}
306
307
virtual void execute(DCmdSource source, TRAPS);
308
};
309
310
#if INCLUDE_SERVICES // Heap dumping supported
311
// See also: dump_heap in attachListener.cpp
312
class HeapDumpDCmd : public DCmdWithParser {
313
protected:
314
DCmdArgument<char*> _filename;
315
DCmdArgument<bool> _all;
316
DCmdArgument<jlong> _gzip;
317
public:
318
HeapDumpDCmd(outputStream* output, bool heap);
319
static const char* name() {
320
return "GC.heap_dump";
321
}
322
static const char* description() {
323
return "Generate a HPROF format dump of the Java heap.";
324
}
325
static const char* impact() {
326
return "High: Depends on Java heap size and content. "
327
"Request a full GC unless the '-all' option is specified.";
328
}
329
static const JavaPermission permission() {
330
JavaPermission p = {"java.lang.management.ManagementPermission",
331
"monitor", NULL};
332
return p;
333
}
334
virtual void execute(DCmdSource source, TRAPS);
335
};
336
#endif // INCLUDE_SERVICES
337
338
// See also: inspectheap in attachListener.cpp
339
class ClassHistogramDCmd : public DCmdWithParser {
340
protected:
341
DCmdArgument<bool> _all;
342
DCmdArgument<jlong> _parallel_thread_num;
343
public:
344
ClassHistogramDCmd(outputStream* output, bool heap);
345
static const char* name() {
346
return "GC.class_histogram";
347
}
348
static const char* description() {
349
return "Provide statistics about the Java heap usage.";
350
}
351
static const char* impact() {
352
return "High: Depends on Java heap size and content.";
353
}
354
static const JavaPermission permission() {
355
JavaPermission p = {"java.lang.management.ManagementPermission",
356
"monitor", NULL};
357
return p;
358
}
359
virtual void execute(DCmdSource source, TRAPS);
360
};
361
362
class ClassHierarchyDCmd : public DCmdWithParser {
363
protected:
364
DCmdArgument<bool> _print_interfaces; // true if inherited interfaces should be printed.
365
DCmdArgument<bool> _print_subclasses; // true if subclasses of the specified classname should be printed.
366
DCmdArgument<char*> _classname; // Optional single class name whose hierarchy should be printed.
367
public:
368
ClassHierarchyDCmd(outputStream* output, bool heap);
369
static const char* name() {
370
return "VM.class_hierarchy";
371
}
372
static const char* description() {
373
return "Print a list of all loaded classes, indented to show the class hiearchy. "
374
"The name of each class is followed by the ClassLoaderData* of its ClassLoader, "
375
"or \"null\" if loaded by the bootstrap class loader.";
376
}
377
static const char* impact() {
378
return "Medium: Depends on number of loaded classes.";
379
}
380
static const JavaPermission permission() {
381
JavaPermission p = {"java.lang.management.ManagementPermission",
382
"monitor", NULL};
383
return p;
384
}
385
virtual void execute(DCmdSource source, TRAPS);
386
};
387
388
class TouchedMethodsDCmd : public DCmd {
389
public:
390
TouchedMethodsDCmd(outputStream* output, bool heap) : DCmd(output, heap) {}
391
static const char* name() {
392
return "VM.print_touched_methods";
393
}
394
static const char* description() {
395
return "Print all methods that have ever been touched during the lifetime of this JVM.";
396
}
397
static const char* impact() {
398
return "Medium: Depends on Java content.";
399
}
400
virtual void execute(DCmdSource source, TRAPS);
401
};
402
403
#if INCLUDE_CDS
404
class DumpSharedArchiveDCmd: public DCmdWithParser {
405
protected:
406
DCmdArgument<char*> _suboption; // option of VM.cds
407
DCmdArgument<char*> _filename; // file name, optional
408
public:
409
DumpSharedArchiveDCmd(outputStream* output, bool heap);
410
static const char* name() {
411
return "VM.cds";
412
}
413
static const char* description() {
414
return "Dump a static or dynamic shared archive including all shareable classes";
415
}
416
static const char* impact() {
417
return "Medium: Pause time depends on number of loaded classes";
418
}
419
static const JavaPermission permission() {
420
JavaPermission p = {"java.lang.management.ManagementPermission",
421
"monitor", NULL};
422
return p;
423
}
424
static int num_arguments();
425
virtual void execute(DCmdSource source, TRAPS);
426
};
427
#endif // INCLUDE_CDS
428
429
// See also: thread_dump in attachListener.cpp
430
class ThreadDumpDCmd : public DCmdWithParser {
431
protected:
432
DCmdArgument<bool> _locks;
433
DCmdArgument<bool> _extended;
434
public:
435
ThreadDumpDCmd(outputStream* output, bool heap);
436
static const char* name() { return "Thread.print"; }
437
static const char* description() {
438
return "Print all threads with stacktraces.";
439
}
440
static const char* impact() {
441
return "Medium: Depends on the number of threads.";
442
}
443
static const JavaPermission permission() {
444
JavaPermission p = {"java.lang.management.ManagementPermission",
445
"monitor", NULL};
446
return p;
447
}
448
virtual void execute(DCmdSource source, TRAPS);
449
};
450
451
// Enhanced JMX Agent support
452
453
class JMXStartRemoteDCmd : public DCmdWithParser {
454
455
// Explicitly list all properties that could be
456
// passed to Agent.startRemoteManagementAgent()
457
// com.sun.management is omitted
458
459
DCmdArgument<char *> _config_file;
460
DCmdArgument<char *> _jmxremote_host;
461
DCmdArgument<char *> _jmxremote_port;
462
DCmdArgument<char *> _jmxremote_rmi_port;
463
DCmdArgument<char *> _jmxremote_ssl;
464
DCmdArgument<char *> _jmxremote_registry_ssl;
465
DCmdArgument<char *> _jmxremote_authenticate;
466
DCmdArgument<char *> _jmxremote_password_file;
467
DCmdArgument<char *> _jmxremote_access_file;
468
DCmdArgument<char *> _jmxremote_login_config;
469
DCmdArgument<char *> _jmxremote_ssl_enabled_cipher_suites;
470
DCmdArgument<char *> _jmxremote_ssl_enabled_protocols;
471
DCmdArgument<char *> _jmxremote_ssl_need_client_auth;
472
DCmdArgument<char *> _jmxremote_ssl_config_file;
473
474
// JDP support
475
// Keep autodiscovery char* not bool to pass true/false
476
// as property value to java level.
477
DCmdArgument<char *> _jmxremote_autodiscovery;
478
DCmdArgument<jlong> _jdp_port;
479
DCmdArgument<char *> _jdp_address;
480
DCmdArgument<char *> _jdp_source_addr;
481
DCmdArgument<jlong> _jdp_ttl;
482
DCmdArgument<jlong> _jdp_pause;
483
DCmdArgument<char *> _jdp_name;
484
485
public:
486
JMXStartRemoteDCmd(outputStream *output, bool heap_allocated);
487
488
static const char *name() {
489
return "ManagementAgent.start";
490
}
491
492
static const char *description() {
493
return "Start remote management agent.";
494
}
495
496
virtual void execute(DCmdSource source, TRAPS);
497
};
498
499
class JMXStartLocalDCmd : public DCmd {
500
501
// Explicitly request start of local agent,
502
// it will not be started by start dcmd
503
504
505
public:
506
JMXStartLocalDCmd(outputStream *output, bool heap_allocated);
507
508
static const char *name() {
509
return "ManagementAgent.start_local";
510
}
511
512
static const char *description() {
513
return "Start local management agent.";
514
}
515
516
virtual void execute(DCmdSource source, TRAPS);
517
518
};
519
520
class JMXStopRemoteDCmd : public DCmd {
521
public:
522
JMXStopRemoteDCmd(outputStream *output, bool heap_allocated) :
523
DCmd(output, heap_allocated) {
524
// Do Nothing
525
}
526
527
static const char *name() {
528
return "ManagementAgent.stop";
529
}
530
531
static const char *description() {
532
return "Stop remote management agent.";
533
}
534
535
virtual void execute(DCmdSource source, TRAPS);
536
};
537
538
// Print the JMX system status
539
class JMXStatusDCmd : public DCmd {
540
public:
541
JMXStatusDCmd(outputStream *output, bool heap_allocated);
542
543
static const char *name() {
544
return "ManagementAgent.status";
545
}
546
547
static const char *description() {
548
return "Print the management agent status.";
549
}
550
551
static const JavaPermission permission() {
552
JavaPermission p = {"java.lang.management.ManagementPermission",
553
"monitor", NULL};
554
return p;
555
}
556
557
virtual void execute(DCmdSource source, TRAPS);
558
559
};
560
561
class CompileQueueDCmd : public DCmd {
562
public:
563
CompileQueueDCmd(outputStream* output, bool heap) : DCmd(output, heap) {}
564
static const char* name() {
565
return "Compiler.queue";
566
}
567
static const char* description() {
568
return "Print methods queued for compilation.";
569
}
570
static const char* impact() {
571
return "Low";
572
}
573
static const JavaPermission permission() {
574
JavaPermission p = {"java.lang.management.ManagementPermission",
575
"monitor", NULL};
576
return p;
577
}
578
virtual void execute(DCmdSource source, TRAPS);
579
};
580
581
#ifdef LINUX
582
class PerfMapDCmd : public DCmd {
583
public:
584
PerfMapDCmd(outputStream* output, bool heap) : DCmd(output, heap) {}
585
static const char* name() {
586
return "Compiler.perfmap";
587
}
588
static const char* description() {
589
return "Write map file for Linux perf tool.";
590
}
591
static const char* impact() {
592
return "Low";
593
}
594
static const JavaPermission permission() {
595
JavaPermission p = {"java.lang.management.ManagementPermission",
596
"monitor", NULL};
597
return p;
598
}
599
virtual void execute(DCmdSource source, TRAPS);
600
};
601
#endif // LINUX
602
603
class CodeListDCmd : public DCmd {
604
public:
605
CodeListDCmd(outputStream* output, bool heap) : DCmd(output, heap) {}
606
static const char* name() {
607
return "Compiler.codelist";
608
}
609
static const char* description() {
610
return "Print all compiled methods in code cache that are alive";
611
}
612
static const char* impact() {
613
return "Medium";
614
}
615
static const JavaPermission permission() {
616
JavaPermission p = {"java.lang.management.ManagementPermission",
617
"monitor", NULL};
618
return p;
619
}
620
virtual void execute(DCmdSource source, TRAPS);
621
};
622
623
class CodeCacheDCmd : public DCmd {
624
public:
625
CodeCacheDCmd(outputStream* output, bool heap) : DCmd(output, heap) {}
626
static const char* name() {
627
return "Compiler.codecache";
628
}
629
static const char* description() {
630
return "Print code cache layout and bounds.";
631
}
632
static const char* impact() {
633
return "Low";
634
}
635
static const JavaPermission permission() {
636
JavaPermission p = {"java.lang.management.ManagementPermission",
637
"monitor", NULL};
638
return p;
639
}
640
virtual void execute(DCmdSource source, TRAPS);
641
};
642
643
//---< BEGIN >--- CodeHeap State Analytics.
644
class CodeHeapAnalyticsDCmd : public DCmdWithParser {
645
protected:
646
DCmdArgument<char*> _function;
647
DCmdArgument<jlong> _granularity;
648
public:
649
CodeHeapAnalyticsDCmd(outputStream* output, bool heap);
650
static const char* name() {
651
return "Compiler.CodeHeap_Analytics";
652
}
653
static const char* description() {
654
return "Print CodeHeap analytics";
655
}
656
static const char* impact() {
657
return "Low: Depends on code heap size and content. "
658
"Holds CodeCache_lock during analysis step, usually sub-second duration.";
659
}
660
static const JavaPermission permission() {
661
JavaPermission p = {"java.lang.management.ManagementPermission",
662
"monitor", NULL};
663
return p;
664
}
665
virtual void execute(DCmdSource source, TRAPS);
666
};
667
//---< END >--- CodeHeap State Analytics.
668
669
class CompilerDirectivesPrintDCmd : public DCmd {
670
public:
671
CompilerDirectivesPrintDCmd(outputStream* output, bool heap) : DCmd(output, heap) {}
672
static const char* name() {
673
return "Compiler.directives_print";
674
}
675
static const char* description() {
676
return "Print all active compiler directives.";
677
}
678
static const char* impact() {
679
return "Low";
680
}
681
static const JavaPermission permission() {
682
JavaPermission p = {"java.lang.management.ManagementPermission",
683
"monitor", NULL};
684
return p;
685
}
686
virtual void execute(DCmdSource source, TRAPS);
687
};
688
689
class CompilerDirectivesRemoveDCmd : public DCmd {
690
public:
691
CompilerDirectivesRemoveDCmd(outputStream* output, bool heap) : DCmd(output, heap) {}
692
static const char* name() {
693
return "Compiler.directives_remove";
694
}
695
static const char* description() {
696
return "Remove latest added compiler directive.";
697
}
698
static const char* impact() {
699
return "Low";
700
}
701
static const JavaPermission permission() {
702
JavaPermission p = {"java.lang.management.ManagementPermission",
703
"monitor", NULL};
704
return p;
705
}
706
virtual void execute(DCmdSource source, TRAPS);
707
};
708
709
class CompilerDirectivesAddDCmd : public DCmdWithParser {
710
protected:
711
DCmdArgument<char*> _filename;
712
public:
713
CompilerDirectivesAddDCmd(outputStream* output, bool heap);
714
static const char* name() {
715
return "Compiler.directives_add";
716
}
717
static const char* description() {
718
return "Add compiler directives from file.";
719
}
720
static const char* impact() {
721
return "Low";
722
}
723
static const JavaPermission permission() {
724
JavaPermission p = {"java.lang.management.ManagementPermission",
725
"monitor", NULL};
726
return p;
727
}
728
virtual void execute(DCmdSource source, TRAPS);
729
};
730
731
class CompilerDirectivesClearDCmd : public DCmd {
732
public:
733
CompilerDirectivesClearDCmd(outputStream* output, bool heap) : DCmd(output, heap) {}
734
static const char* name() {
735
return "Compiler.directives_clear";
736
}
737
static const char* description() {
738
return "Remove all compiler directives.";
739
}
740
static const char* impact() {
741
return "Low";
742
}
743
static const JavaPermission permission() {
744
JavaPermission p = {"java.lang.management.ManagementPermission",
745
"monitor", NULL};
746
return p;
747
}
748
virtual void execute(DCmdSource source, TRAPS);
749
};
750
751
///////////////////////////////////////////////////////////////////////
752
//
753
// jcmd command support for symbol table, string table and system dictionary dumping:
754
// VM.symboltable -verbose: for dumping the symbol table
755
// VM.stringtable -verbose: for dumping the string table
756
// VM.systemdictionary -verbose: for dumping the system dictionary table
757
//
758
class VM_DumpHashtable : public VM_Operation {
759
private:
760
outputStream* _out;
761
int _which;
762
bool _verbose;
763
public:
764
enum {
765
DumpSymbols = 1 << 0,
766
DumpStrings = 1 << 1,
767
DumpSysDict = 1 << 2 // not implemented yet
768
};
769
VM_DumpHashtable(outputStream* out, int which, bool verbose) {
770
_out = out;
771
_which = which;
772
_verbose = verbose;
773
}
774
775
virtual VMOp_Type type() const { return VMOp_DumpHashtable; }
776
777
virtual void doit() {
778
switch (_which) {
779
case DumpSymbols:
780
SymbolTable::dump(_out, _verbose);
781
break;
782
case DumpStrings:
783
StringTable::dump(_out, _verbose);
784
break;
785
case DumpSysDict:
786
SystemDictionary::dump(_out, _verbose);
787
break;
788
default:
789
ShouldNotReachHere();
790
}
791
}
792
};
793
794
class SymboltableDCmd : public DCmdWithParser {
795
protected:
796
DCmdArgument<bool> _verbose;
797
public:
798
SymboltableDCmd(outputStream* output, bool heap);
799
static const char* name() {
800
return "VM.symboltable";
801
}
802
static const char* description() {
803
return "Dump symbol table.";
804
}
805
static const char* impact() {
806
return "Medium: Depends on Java content.";
807
}
808
static const JavaPermission permission() {
809
JavaPermission p = {"java.lang.management.ManagementPermission",
810
"monitor", NULL};
811
return p;
812
}
813
virtual void execute(DCmdSource source, TRAPS);
814
};
815
816
class StringtableDCmd : public DCmdWithParser {
817
protected:
818
DCmdArgument<bool> _verbose;
819
public:
820
StringtableDCmd(outputStream* output, bool heap);
821
static const char* name() {
822
return "VM.stringtable";
823
}
824
static const char* description() {
825
return "Dump string table.";
826
}
827
static const char* impact() {
828
return "Medium: Depends on Java content.";
829
}
830
static const JavaPermission permission() {
831
JavaPermission p = {"java.lang.management.ManagementPermission",
832
"monitor", NULL};
833
return p;
834
}
835
virtual void execute(DCmdSource source, TRAPS);
836
};
837
838
class SystemDictionaryDCmd : public DCmdWithParser {
839
protected:
840
DCmdArgument<bool> _verbose;
841
public:
842
SystemDictionaryDCmd(outputStream* output, bool heap);
843
static const char* name() {
844
return "VM.systemdictionary";
845
}
846
static const char* description() {
847
return "Prints the statistics for dictionary hashtable sizes and bucket length";
848
}
849
static const char* impact() {
850
return "Medium: Depends on Java content.";
851
}
852
static const JavaPermission permission() {
853
JavaPermission p = {"java.lang.management.ManagementPermission",
854
"monitor", NULL};
855
return p;
856
}
857
virtual void execute(DCmdSource source, TRAPS);
858
};
859
860
#if INCLUDE_JVMTI
861
class DebugOnCmdStartDCmd : public DCmd {
862
public:
863
DebugOnCmdStartDCmd(outputStream* output, bool heap) : DCmd(output, heap) {}
864
static const char* name() {
865
return "VM.start_java_debugging";
866
}
867
static const char* description() {
868
return "Starts up the Java debugging if the jdwp agentlib was enabled with the option onjcmd=y.";
869
}
870
static const char* impact() {
871
return "High: Switches the VM into Java debug mode.";
872
}
873
static const JavaPermission permission() {
874
JavaPermission p = { "java.lang.management.ManagementPermission", "control", NULL };
875
return p;
876
}
877
virtual void execute(DCmdSource source, TRAPS);
878
};
879
#endif // INCLUDE_JVMTI
880
881
class EventLogDCmd : public DCmdWithParser {
882
protected:
883
DCmdArgument<char*> _log;
884
DCmdArgument<char*> _max;
885
public:
886
EventLogDCmd(outputStream* output, bool heap);
887
static const char* name() {
888
return "VM.events";
889
}
890
static const char* description() {
891
return "Print VM event logs";
892
}
893
static const char* impact() {
894
return "Low: Depends on event log size. ";
895
}
896
static const JavaPermission permission() {
897
JavaPermission p = {"java.lang.management.ManagementPermission",
898
"monitor", NULL};
899
return p;
900
}
901
virtual void execute(DCmdSource source, TRAPS);
902
};
903
904
#endif // SHARE_SERVICES_DIAGNOSTICCOMMAND_HPP
905
906