Skip to content

Commit 43feb5c

Browse files
committed
Display JVM Arguments from a heap dump where available.
1 parent 2f91802 commit 43feb5c

File tree

1 file changed

+153
-8
lines changed

1 file changed

+153
-8
lines changed

visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaOverviewSummary.java

Lines changed: 153 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@
6464
import org.graalvm.visualvm.lib.profiler.heapwalk.details.api.DetailsSupport;
6565
import org.graalvm.visualvm.lib.ui.components.ProfilerToolbar;
6666
import org.graalvm.visualvm.lib.ui.swing.renderer.LabelRenderer;
67+
import org.graalvm.visualvm.lib.ui.swing.renderer.NormalBoldGrayRenderer;
68+
import org.graalvm.visualvm.lib.ui.swing.renderer.ProfilerRenderer;
6769
import org.openide.util.NbBundle;
6870
import org.openide.util.lookup.ServiceProvider;
6971

@@ -94,6 +96,7 @@
9496
"JavaOverviewSummary_JavaVersionItemString=Java Version:",
9597
"JavaOverviewSummary_JvmItemString=Java Name:",
9698
"JavaOverviewSummary_JavaVendorItemString=Java Vendor:",
99+
"JavaOverviewSummary_VmArgsSection=JVM Arguments",
97100
"JavaOverviewSummary_SysPropsSection=System Properties",
98101
"JavaOverviewSummary_LinkShow=show",
99102
"JavaOverviewSummary_LinkHide=hide",
@@ -108,6 +111,7 @@ class JavaOverviewSummary extends HeapView {
108111

109112
private final Object[][] heapData;
110113
private final Object[][] environmentData;
114+
private final Object[][] vmArgsData;
111115
private final Object[][] syspropsData;
112116

113117
private JComponent component;
@@ -121,6 +125,7 @@ private JavaOverviewSummary(HeapContext context) {
121125

122126
heapData = computeHeapData(heap);
123127
environmentData = computeEnvironmentData(heap, sysprops);
128+
vmArgsData = computeVMArgs(heap);
124129
syspropsData = computeSyspropsData(sysprops);
125130
}
126131

@@ -142,6 +147,7 @@ private void init() {
142147
ResultsSnippet environmentSnippet = new ResultsSnippet(Bundle.JavaOverviewSummary_EnvironmentSection(), environmentData, 1);
143148
Splitter overviewRow = new Splitter(Splitter.HORIZONTAL_SPLIT, heapSnippet, environmentSnippet);
144149

150+
VMArgsSnippet vmArgsSnippet = vmArgsData == null ? null : new VMArgsSnippet(vmArgsData);
145151
SyspropsSnippet syspropsSnippet = new SyspropsSnippet(syspropsData);
146152

147153
component = new JPanel(new VerticalLayout(false)) {
@@ -160,6 +166,7 @@ public Dimension getPreferredSize() {
160166
component.setOpaque(false);
161167

162168
component.add(overviewRow);
169+
if (vmArgsSnippet != null) component.add(vmArgsSnippet);
163170
component.add(syspropsSnippet);
164171
}
165172

@@ -303,26 +310,26 @@ private static long computeStartupTime(Heap heap) {
303310
return -1;
304311
}
305312

306-
private List<String> computeVMArgs(Heap heap) {
313+
private Object[][] computeVMArgs(Heap heap) {
307314
List<String> vmArgsList = new ArrayList();
308315
JavaClass vmManagementClass = heap.getJavaClassByName("sun.management.VMManagementImpl"); // NOI18N
309316

310317
if (vmManagementClass != null) {
311318
if (vmManagementClass.getInstancesCount()>0) {
312319
Instance vmManagement = (Instance) vmManagementClass.getInstancesIterator().next();
313-
Object vma = vmManagement.getValueOfField("vmArgs");
320+
Object vma = vmManagement.getValueOfField("vmArgs"); // NOI18N
314321

315322
if (vma instanceof Instance) {
316323
Instance vmargs = (Instance) vma;
317-
Object list = vmargs.getValueOfField("list");
324+
Object list = vmargs.getValueOfField("list"); // NOI18N
318325
Object arr;
319326
Object size = null;
320327

321328
if (list instanceof Instance) {
322-
arr = ((Instance)list).getValueOfField("a");
329+
arr = ((Instance)list).getValueOfField("a"); // NOI18N
323330
} else {
324-
size = vmargs.getValueOfField("size");
325-
arr = vmargs.getValueOfField("elementData");
331+
size = vmargs.getValueOfField("size"); // NOI18N
332+
arr = vmargs.getValueOfField("elementData"); // NOI18N
326333
}
327334
if (arr instanceof ObjectArrayInstance) {
328335
ObjectArrayInstance vmArgsArr = (ObjectArrayInstance) arr;
@@ -337,7 +344,13 @@ private List<String> computeVMArgs(Heap heap) {
337344

338345
vmArgsList.add(DetailsSupport.getDetailsString(arg, heap));
339346
}
340-
return vmArgsList;
347+
348+
if (vmArgsList.isEmpty()) vmArgsList.add("<no JVM arguments>");
349+
350+
Object[][] data = new Object[vmArgsList.size()][2];
351+
for (int i = 0; i < data.length; i++)
352+
data[i][0] = vmArgsList.get(i);
353+
return data;
341354
}
342355
}
343356
}
@@ -412,6 +425,138 @@ public Dimension getPreferredSize() {
412425

413426
}
414427

428+
private static class VMArgsSnippet extends JPanel {
429+
430+
VMArgsSnippet(final Object[][] data) {
431+
super(new GridBagLayout());
432+
433+
setOpaque(false);
434+
setBorder(BorderFactory.createEmptyBorder(0, 5, 15, 5));
435+
436+
JLabel caption = new JLabel(Bundle.JavaOverviewSummary_VmArgsSection());
437+
caption.setFont(caption.getFont().deriveFont(Font.BOLD));
438+
GridBagConstraints c = new GridBagConstraints();
439+
c.gridx = 0;
440+
c.gridy = 0;
441+
c.weighty = 1d;
442+
add(caption, c);
443+
444+
c = new GridBagConstraints();
445+
c.gridx = 1;
446+
c.gridy = 0;
447+
c.insets = new Insets(0, 5, 0, 0);
448+
add(new JLabel("["), c); // NOI18N
449+
450+
if (data != null) {
451+
TableModel model = new DefaultTableModel(data, new Object[] { Bundle.JavaOverviewSummary_NameColumn() }) {
452+
public boolean isCellEditable(int row, int column) { return false; }
453+
};
454+
final SummaryView.SimpleTable vmArgs = new SummaryView.SimpleTable(model, 0);
455+
vmArgs.setFocusable(false);
456+
NormalBoldGrayRenderer r1 = new NormalBoldGrayRenderer() {
457+
public void setValue(Object value, int row) {
458+
if (value == null) {
459+
setNormalValue(""); // NOI18N
460+
setBoldValue(""); // NOI18N
461+
} else {
462+
String s = value.toString();
463+
int i = s.indexOf('=');
464+
if (i > 0) {
465+
setNormalValue(s.substring(i));
466+
setBoldValue(s.substring(0, i));
467+
} else {
468+
setNormalValue(""); // NOI18N
469+
setBoldValue(s);
470+
}
471+
}
472+
}
473+
474+
private ProfilerRenderer[] valueRenderers;
475+
protected ProfilerRenderer[] valueRenderers() {
476+
if (valueRenderers == null) {
477+
valueRenderers = super.valueRenderers();
478+
if (valueRenderers != null) {
479+
LabelRenderer bold = (LabelRenderer)valueRenderers[1];
480+
bold.setMargin(3, 3, 3, 0);
481+
LabelRenderer normal = (LabelRenderer)valueRenderers[0];
482+
normal.setMargin(3, 0, 3, 3);
483+
valueRenderers = new ProfilerRenderer[] { bold, normal };
484+
}
485+
}
486+
return valueRenderers;
487+
}
488+
};
489+
vmArgs.setColumnRenderer(0, r1, true);
490+
491+
LinkButton lb = new LinkButton() {
492+
{
493+
clicked(); // sets link text, hides properties table
494+
}
495+
@Override
496+
protected void clicked() {
497+
if (vmArgs.isVisible()) {
498+
setText(Bundle.JavaOverviewSummary_LinkShow());
499+
vmArgs.setVisible(false);
500+
} else {
501+
setText(Bundle.JavaOverviewSummary_LinkHide());
502+
vmArgs.setVisible(true);
503+
}
504+
}
505+
};
506+
c = new GridBagConstraints();
507+
c.gridx = 2;
508+
c.gridy = 0;
509+
c.insets = new Insets(0, 0, 0, 0);
510+
add(lb, c);
511+
512+
c = new GridBagConstraints();
513+
c.gridx = 0;
514+
c.gridy = 1;
515+
c.gridwidth = GridBagConstraints.REMAINDER;
516+
c.weightx = 1d;
517+
c.weighty = 1d;
518+
c.anchor = GridBagConstraints.NORTHWEST;
519+
c.fill = GridBagConstraints.BOTH;
520+
c.insets = new Insets(6, 0, 0, 0);
521+
add(vmArgs, c);
522+
} else {
523+
JLabel nal = new JLabel(Bundle.JavaOverviewSummary_NotAvailable());
524+
nal.setBorder(new LinkButton().getBorder());
525+
c = new GridBagConstraints();
526+
c.gridx = 2;
527+
c.insets = new Insets(0, 0, 0, 0);
528+
add(nal, c);
529+
}
530+
531+
c = new GridBagConstraints();
532+
c.gridx = 3;
533+
c.gridy = 0;
534+
c.insets = new Insets(0, 0, 0, 0);
535+
add(new JLabel("]"), c); // NOI18N
536+
537+
c = new GridBagConstraints();
538+
c.gridx = 4;
539+
c.gridy = 0;
540+
c.weightx = 1d;
541+
c.fill = GridBagConstraints.HORIZONTAL;
542+
c.insets = new Insets(1, 4, 0, 0);
543+
add(new SeparatorLine(), c);
544+
}
545+
546+
public Dimension getMinimumSize() {
547+
Dimension dim = super.getMinimumSize();
548+
dim.width = 0;
549+
return dim;
550+
}
551+
552+
public Dimension getPreferredSize() {
553+
Dimension dim = super.getPreferredSize();
554+
dim.width = 100;
555+
return dim;
556+
}
557+
558+
}
559+
415560
private static class SyspropsSnippet extends JPanel {
416561

417562
SyspropsSnippet(final Object[][] data) {
@@ -516,7 +661,7 @@ public Dimension getPreferredSize() {
516661

517662
}
518663

519-
664+
520665
@ServiceProvider(service=SummaryView.ContentProvider.class, position = 100)
521666
public static class Provider extends SummaryView.ContentProvider {
522667

0 commit comments

Comments
 (0)