Skip to content

Commit 32ecde7

Browse files
committed
new chart lines for "initial-mark" events and begin / end of concurrent
collection cycles (CMS + G1)
1 parent 9fc20ce commit 32ecde7

12 files changed

+242
-8
lines changed

README

+8-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,14 @@ GCViewer shows a number of lines etc. These are:
5151
generation (not available without PrintGCDetails)
5252
- Used Heap:
5353
o Blue line that shows used heap size
54-
54+
- Initial mark level:
55+
o Yellow line that shows the heap usage at "initial-mark" event
56+
(only available when the gc algorithm uses concurrent collections,
57+
which is the case for CMS and G1)
58+
- Concurrent collections
59+
o Cyan vertical line for every begin (concurrent-mark-start) and
60+
pink vertical line for every end (CMS-concurrent-reset /
61+
G1: concurrent-cleanup-end) of a concurrent collection cycle
5562

5663
Metrics
5764
=======

src/main/java/com/tagtraum/perf/gcviewer/GCDocument.java

+52-1
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ public void drop(DropTargetDropEvent e) {
7878
Transferable tr = e.getTransferable();
7979
if (e.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
8080
e.acceptDrop(DnDConstants.ACTION_COPY);
81-
java.util.List list = (java.util.List)tr.getTransferData(DataFlavor.javaFileListFlavor);
81+
List<Object> list = (List<Object>)tr.getTransferData(DataFlavor.javaFileListFlavor);
8282
File[] files = (File[])list.toArray(new File[list.size()]);
8383
gcViewer.add(files);
8484
GCDocument.this.getContentPane().invalidate();
@@ -358,144 +358,195 @@ private double getMaxMaxPause() {
358358

359359
private class MultiModelChartFacade implements ModelChart {
360360

361+
@Override
361362
public boolean isAntiAlias() {
362363
if (chartPanelViews.isEmpty()) return false;
363364
return chartPanelViews.get(0).getModelChart().isAntiAlias();
364365
}
365366

367+
@Override
366368
public void setAntiAlias(boolean antiAlias) {
367369
for (int i = 0; i < chartPanelViews.size(); i++) {
368370
chartPanelViews.get(i).getModelChart().setAntiAlias(antiAlias);
369371
}
370372
}
371373

374+
@Override
372375
public long getFootprint() {
373376
if (chartPanelViews.isEmpty()) return 0;
374377
return chartPanelViews.get(0).getModelChart().getFootprint();
375378
}
376379

380+
@Override
377381
public double getMaxPause() {
378382
if (chartPanelViews.isEmpty()) return 0;
379383
return chartPanelViews.get(0).getModelChart().getMaxPause();
380384
}
381385

386+
@Override
382387
public void setRunningTime(double runningTime) {
383388
for (int i = 0; i < chartPanelViews.size(); i++) {
384389
chartPanelViews.get(i).getModelChart().setRunningTime(runningTime);
385390
}
386391
}
387392

393+
@Override
388394
public void setFootprint(long footPrint) {
389395
for (int i = 0; i < chartPanelViews.size(); i++) {
390396
chartPanelViews.get(i).getModelChart().setFootprint(footPrint);
391397
}
392398
}
393399

400+
@Override
394401
public void setMaxPause(double maxPause) {
395402
for (int i = 0; i < chartPanelViews.size(); i++) {
396403
chartPanelViews.get(i).getModelChart().setMaxPause(maxPause);
397404
}
398405
}
399406

407+
@Override
400408
public void setScaleFactor(double scaleFactor) {
401409
for (int i = 0; i < chartPanelViews.size(); i++) {
402410
chartPanelViews.get(i).getModelChart().setScaleFactor(scaleFactor);
403411
}
404412
}
405413

414+
@Override
406415
public double getScaleFactor() {
407416
if (chartPanelViews.isEmpty()) return 1;
408417
return chartPanelViews.get(0).getModelChart().getScaleFactor();
409418
}
410419

420+
@Override
411421
public boolean isShowGCTimesLine() {
412422
if (chartPanelViews.isEmpty()) return false;
413423
return chartPanelViews.get(0).getModelChart().isShowGCTimesLine();
414424
}
415425

426+
@Override
416427
public void setShowGCTimesLine(boolean showGCTimesLine) {
417428
for (int i = 0; i < chartPanelViews.size(); i++) {
418429
chartPanelViews.get(i).getModelChart().setShowGCTimesLine(showGCTimesLine);
419430
}
420431
}
421432

433+
@Override
422434
public boolean isShowGCTimesRectangles() {
423435
if (chartPanelViews.isEmpty()) return false;
424436
return chartPanelViews.get(0).getModelChart().isShowGCTimesRectangles();
425437
}
426438

439+
@Override
427440
public void setShowGCTimesRectangles(boolean showGCTimesRectangles) {
428441
for (int i = 0; i < chartPanelViews.size(); i++) {
429442
chartPanelViews.get(i).getModelChart().setShowGCTimesRectangles(showGCTimesRectangles);
430443
}
431444
}
432445

446+
@Override
433447
public boolean isShowFullGCLines() {
434448
if (chartPanelViews.isEmpty()) return false;
435449
return chartPanelViews.get(0).getModelChart().isShowFullGCLines();
436450
}
437451

452+
@Override
438453
public void setShowFullGCLines(boolean showFullGCLines) {
439454
for (int i = 0; i < chartPanelViews.size(); i++) {
440455
chartPanelViews.get(i).getModelChart().setShowFullGCLines(showFullGCLines);
441456
}
442457
}
443458

459+
@Override
444460
public boolean isShowIncGCLines() {
445461
if (chartPanelViews.isEmpty()) return false;
446462
return chartPanelViews.get(0).getModelChart().isShowIncGCLines();
447463
}
448464

465+
@Override
449466
public void setShowIncGCLines(boolean showIncGCLines) {
450467
for (int i = 0; i < chartPanelViews.size(); i++) {
451468
chartPanelViews.get(i).getModelChart().setShowIncGCLines(showIncGCLines);
452469
}
453470
}
454471

472+
@Override
455473
public boolean isShowTotalMemoryLine() {
456474
if (chartPanelViews.isEmpty()) return false;
457475
return chartPanelViews.get(0).getModelChart().isShowTotalMemoryLine();
458476
}
459477

478+
@Override
460479
public void setShowTotalMemoryLine(boolean showTotalMemoryLine) {
461480
for (int i = 0; i < chartPanelViews.size(); i++) {
462481
chartPanelViews.get(i).getModelChart().setShowTotalMemoryLine(showTotalMemoryLine);
463482
}
464483
}
465484

485+
@Override
466486
public boolean isShowUsedMemoryLine() {
467487
if (chartPanelViews.isEmpty()) return false;
468488
return chartPanelViews.get(0).getModelChart().isShowUsedMemoryLine();
469489
}
470490

491+
@Override
471492
public void setShowUsedMemoryLine(boolean showUsedMemoryLine) {
472493
for (int i = 0; i < chartPanelViews.size(); i++) {
473494
chartPanelViews.get(i).getModelChart().setShowUsedMemoryLine(showUsedMemoryLine);
474495
}
475496
}
476497

498+
@Override
477499
public void setShowTenured(boolean showTenured) {
478500
for (int i = 0; i < chartPanelViews.size(); i++) {
479501
chartPanelViews.get(i).getModelChart().setShowTenured(showTenured);
480502
}
481503
}
482504

505+
@Override
483506
public boolean isShowTenured() {
484507
if (chartPanelViews.isEmpty()) return false;
485508
return chartPanelViews.get(0).getModelChart().isShowTenured();
486509
}
487510

511+
@Override
488512
public void setShowYoung(boolean showYoung) {
489513
for (int i = 0; i < chartPanelViews.size(); i++) {
490514
chartPanelViews.get(i).getModelChart().setShowYoung(showYoung);
491515
}
492516
}
493517

518+
@Override
494519
public boolean isShowYoung() {
495520
if (chartPanelViews.isEmpty()) return false;
496521
return chartPanelViews.get(0).getModelChart().isShowYoung();
497522
}
498523

524+
@Override
525+
public void setShowInitialMarkLevel(boolean showInitialMarkLevel) {
526+
for (int i = 0; i < chartPanelViews.size(); i++) {
527+
chartPanelViews.get(i).getModelChart().setShowInitialMarkLevel(showInitialMarkLevel);
528+
}
529+
}
530+
531+
@Override
532+
public boolean isShowInitialMarkLevel() {
533+
if (chartPanelViews.isEmpty()) return false;
534+
return chartPanelViews.get(0).getModelChart().isShowInitialMarkLevel();
535+
}
536+
537+
@Override
538+
public void setShowConcurrentCollectionBeginEnd(boolean showConcurrentCollectionBeginEnd) {
539+
for (int i = 0; i < chartPanelViews.size(); i++) {
540+
chartPanelViews.get(i).getModelChart().setShowConcurrentCollectionBeginEnd(showConcurrentCollectionBeginEnd);
541+
}
542+
}
543+
544+
@Override
545+
public boolean isShowConcurrentCollectionBeginEnd() {
546+
if (chartPanelViews.isEmpty()) return false;
547+
return chartPanelViews.get(0).getModelChart().isShowConcurrentCollectionBeginEnd();
548+
}
549+
499550
}
500551

501552
private class ScrollBarMaximumChangeListener implements ChangeListener {

src/main/java/com/tagtraum/perf/gcviewer/GCPreferences.java

+2
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ public class GCPreferences {
2727
public static final String USED_MEMORY = "usedmemory";
2828
public static final String TENURED_MEMORY = "tenuredmemory";
2929
public static final String YOUNG_MEMORY = "youngmemory";
30+
public static final String INITIAL_MARK_LEVEL = "initialmarklevel";
31+
public static final String CONCURRENT_COLLECTION_BEGIN_END = "concurrentcollectionbeginend";
3032
public static final String ANTI_ALIAS = "antialias";
3133

3234
public static final String SHOW_DATA_PANEL = "showdatapanel";

src/main/java/com/tagtraum/perf/gcviewer/GCViewer.java

+28
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,12 @@
5555
import com.tagtraum.perf.gcviewer.action.Refresh;
5656
import com.tagtraum.perf.gcviewer.action.Watch;
5757
import com.tagtraum.perf.gcviewer.action.Zoom;
58+
import com.tagtraum.perf.gcviewer.renderer.ConcurrentGcBegionEndRenderer;
5859
import com.tagtraum.perf.gcviewer.renderer.FullGCLineRenderer;
5960
import com.tagtraum.perf.gcviewer.renderer.GCRectanglesRenderer;
6061
import com.tagtraum.perf.gcviewer.renderer.GCTimesRenderer;
6162
import com.tagtraum.perf.gcviewer.renderer.IncLineRenderer;
63+
import com.tagtraum.perf.gcviewer.renderer.InitialMarkLevelRenderer;
6264
import com.tagtraum.perf.gcviewer.renderer.TotalHeapRenderer;
6365
import com.tagtraum.perf.gcviewer.renderer.TotalTenuredRenderer;
6466
import com.tagtraum.perf.gcviewer.renderer.TotalYoungRenderer;
@@ -105,6 +107,8 @@ public class GCViewer extends JFrame {
105107
private JCheckBoxMenuItem menuItemTotalMemory;
106108
private JCheckBoxMenuItem menuItemTenuredMemory;
107109
private JCheckBoxMenuItem menuItemYoungMemory;
110+
private JCheckBoxMenuItem menuItemInitialMarkLevel;
111+
private JCheckBoxMenuItem menuItemConcurrentGcBeginEnd;
108112
private JCheckBoxMenuItem menuItemWatch;
109113
private JCheckBoxMenuItem menuItemAntiAlias;
110114
private Map<String, JCheckBoxMenuItem> gcLineMenuItems;
@@ -213,6 +217,8 @@ public void internalFrameActivated(final InternalFrameEvent e) {
213217
menuItemUsedMemory.setState(getSelectedGCDocument().getModelChart().isShowUsedMemoryLine());
214218
menuItemTenuredMemory.setState(getSelectedGCDocument().getModelChart().isShowTenured());
215219
menuItemYoungMemory.setState(getSelectedGCDocument().getModelChart().isShowYoung());
220+
menuItemInitialMarkLevel.setState(getSelectedGCDocument().getModelChart().isShowInitialMarkLevel());
221+
menuItemConcurrentGcBeginEnd.setState(getSelectedGCDocument().getModelChart().isShowConcurrentCollectionBeginEnd());
216222
menuItemShowDataPanel.setState(getSelectedGCDocument().isShowModelPanel());
217223
menuItemAntiAlias.setSelected(getSelectedGCDocument().getModelChart().isAntiAlias());
218224
}
@@ -517,6 +523,24 @@ public void actionPerformed(final ActionEvent e) {
517523
viewMenu.add(menuItemUsedMemory);
518524
gcLineMenuItems.put(GCPreferences.USED_MEMORY, menuItemUsedMemory);
519525

526+
menuItemInitialMarkLevel = new JCheckBoxMenuItem(localStrings.getString("main_frame_menuitem_initial_mark_level"), true);
527+
menuItemInitialMarkLevel.setMnemonic(localStrings.getString("main_frame_menuitem_mnemonic_initial_mark_level").charAt(0));
528+
menuItemInitialMarkLevel.setToolTipText(localStrings.getString("main_frame_menuitem_hint_initial_mark_level"));
529+
menuItemInitialMarkLevel.setIcon(createMonoColoredImageIcon(InitialMarkLevelRenderer.DEFAULT_LINEPAINT, 20, 20));
530+
menuItemInitialMarkLevel.setActionCommand(GCPreferences.INITIAL_MARK_LEVEL);
531+
menuItemInitialMarkLevel.addActionListener(viewMenuActionListener);
532+
viewMenu.add(menuItemInitialMarkLevel);
533+
gcLineMenuItems.put(GCPreferences.INITIAL_MARK_LEVEL, menuItemInitialMarkLevel);
534+
535+
menuItemConcurrentGcBeginEnd = new JCheckBoxMenuItem(localStrings.getString("main_frame_menuitem_concurrent_collection_begin_end"), true);
536+
menuItemConcurrentGcBeginEnd.setMnemonic(localStrings.getString("main_frame_menuitem_mnemonic_concurrent_collection_begin_end").charAt(0));
537+
menuItemConcurrentGcBeginEnd.setToolTipText(localStrings.getString("main_frame_menuitem_hint_concurrent_collection_begin_end"));
538+
menuItemConcurrentGcBeginEnd.setIcon(createMonoColoredImageIcon(ConcurrentGcBegionEndRenderer.CONCURRENT_COLLECTION_BEGIN, 20, 20));
539+
menuItemConcurrentGcBeginEnd.setActionCommand(GCPreferences.CONCURRENT_COLLECTION_BEGIN_END);
540+
menuItemConcurrentGcBeginEnd.addActionListener(viewMenuActionListener);
541+
viewMenu.add(menuItemConcurrentGcBeginEnd);
542+
gcLineMenuItems.put(GCPreferences.CONCURRENT_COLLECTION_BEGIN_END, menuItemConcurrentGcBeginEnd);
543+
520544
windowMenu = new JMenu(localStrings.getString("main_frame_menu_window"));
521545
windowMenu.setMnemonic(localStrings.getString("main_frame_menu_mnemonic_window").charAt(0));
522546
menuBar.add(windowMenu);
@@ -554,6 +578,10 @@ public void actionPerformed(final ActionEvent e) {
554578
getSelectedGCDocument().getModelChart().setShowTenured(((JCheckBoxMenuItem) e.getSource()).getState());
555579
} else if (e.getActionCommand() == GCPreferences.YOUNG_MEMORY) {
556580
getSelectedGCDocument().getModelChart().setShowYoung(((JCheckBoxMenuItem) e.getSource()).getState());
581+
} else if (e.getActionCommand() == GCPreferences.INITIAL_MARK_LEVEL) {
582+
getSelectedGCDocument().getModelChart().setShowInitialMarkLevel(((JCheckBoxMenuItem) e.getSource()).getState());
583+
} else if (e.getActionCommand() == GCPreferences.CONCURRENT_COLLECTION_BEGIN_END) {
584+
getSelectedGCDocument().getModelChart().setShowConcurrentCollectionBeginEnd(((JCheckBoxMenuItem) e.getSource()).getState());
557585
}
558586
}
559587
}

src/main/java/com/tagtraum/perf/gcviewer/ModelChart.java

+8
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,14 @@ public interface ModelChart {
4343
void setShowYoung(boolean showYoung);
4444

4545
boolean isShowYoung();
46+
47+
void setShowInitialMarkLevel(boolean showInitialMarkLevel);
48+
49+
boolean isShowInitialMarkLevel();
50+
51+
void setShowConcurrentCollectionBeginEnd(boolean showConcurrentCollectionBeginEnd);
52+
53+
boolean isShowConcurrentCollectionBeginEnd();
4654

4755
void setRunningTime(double runningTime);
4856

0 commit comments

Comments
 (0)