11package com .tagtraum .perf .gcviewer .imp ;
22
3- import com .tagtraum .perf .gcviewer .model .*;
4- import com .tagtraum .perf .gcviewer .model .AbstractGCEvent .*;
5- import com .tagtraum .perf .gcviewer .util .NumberParser ;
6- import com .tagtraum .perf .gcviewer .util .ParseInformation ;
7-
83import java .io .IOException ;
94import java .io .InputStream ;
105import java .io .LineNumberReader ;
1712import java .util .regex .Matcher ;
1813import java .util .regex .Pattern ;
1914
15+ import com .tagtraum .perf .gcviewer .model .AbstractGCEvent ;
16+ import com .tagtraum .perf .gcviewer .model .AbstractGCEvent .CollectionType ;
17+ import com .tagtraum .perf .gcviewer .model .AbstractGCEvent .Concurrency ;
18+ import com .tagtraum .perf .gcviewer .model .AbstractGCEvent .ExtendedType ;
19+ import com .tagtraum .perf .gcviewer .model .AbstractGCEvent .GcPattern ;
20+ import com .tagtraum .perf .gcviewer .model .AbstractGCEvent .Type ;
21+ import com .tagtraum .perf .gcviewer .model .ConcurrentGCEvent ;
22+ import com .tagtraum .perf .gcviewer .model .GCEvent ;
23+ import com .tagtraum .perf .gcviewer .model .GCModel ;
24+ import com .tagtraum .perf .gcviewer .model .GCResource ;
25+ import com .tagtraum .perf .gcviewer .model .VmOperationEvent ;
26+ import com .tagtraum .perf .gcviewer .util .NumberParser ;
27+ import com .tagtraum .perf .gcviewer .util .ParseInformation ;
28+
2029/**
2130 * Parses log output from Sun / Oracle Java 1.4 / 1.5 / 1.6. / 1.7 / 1.8.
2231 * <p>
2736 * <li>-XX:+UseParNewGC</li>
2837 * <li>-XX:+UseParallelOldGC</li>
2938 * <li>-XX:+UseConcMarkSweepGC</li>
39+ * <li>-XX:+UseShenandoahGC</li>
3040 * <li>-Xincgc (1.4 / 1.5)</li>
3141 * </ul>
3242 * <p>
@@ -102,6 +112,8 @@ public class DataReaderSun1_6_0 extends AbstractDataReaderSun {
102112 EXCLUDE_STRINGS .add ("PS" + ADAPTIVE_PATTERN ); // -XX:PrintAdaptiveSizePolicy
103113 EXCLUDE_STRINGS .add (" avg_survived_padded_avg" ); // -XX:PrintAdaptiveSizePolicy
104114 EXCLUDE_STRINGS .add ("/proc/meminfo" ); // apple vms seem to print this out in the beginning of the logs
115+ EXCLUDE_STRINGS .add ("Uncommitted" ); // -XX:+UseShenandoahGC
116+ EXCLUDE_STRINGS .add ("Cancelling concurrent GC" ); // -XX:+UseShenandoahGC
105117 }
106118
107119 private static final String EVENT_YG_OCCUPANCY = "YG occupancy" ;
@@ -538,7 +550,6 @@ private boolean isCmsScavengeBeforeRemark(String line) {
538550 }
539551
540552 protected AbstractGCEvent <?> parseLine (String line , ParseInformation pos ) throws ParseException {
541- AbstractGCEvent <?> ae = null ;
542553 try {
543554 // parse datestamp "yyyy-MM-dd'T'hh:mm:ssZ:"
544555 // parse timestamp "double:"
@@ -548,57 +559,46 @@ protected AbstractGCEvent<?> parseLine(String line, ParseInformation pos) throws
548559 ZonedDateTime datestamp = parseDatestamp (line , pos );
549560 double timestamp = getTimestamp (line , pos , datestamp );
550561 ExtendedType type = parseType (line , pos );
551- // special provision for CMS events
562+ AbstractGCEvent <?> ae ;
552563 if (type .getConcurrency () == Concurrency .CONCURRENT ) {
553564 ae = new ConcurrentGCEvent ();
554- ConcurrentGCEvent event = (ConcurrentGCEvent )ae ;
555-
556- // simple concurrent events (ending with -start) just are of type GcPattern.GC
557- event .setDateStamp (datestamp );
558- event .setTimestamp (timestamp );
559- event .setExtendedType (type );
560- if (type .getPattern () == GcPattern .GC_PAUSE_DURATION ) {
561- // the -end events contain a pause and duration as well
562- int start = pos .getIndex ();
563- int end = line .indexOf ('/' , pos .getIndex ());
564- event .setPause (NumberParser .parseDouble (line .substring (start , end )));
565- start = end + 1 ;
566- end = line .indexOf (' ' , start );
567- event .setDuration (NumberParser .parseDouble (line .substring (start , end )));
568- }
569- // nothing more to parse...
570- }
571- else if (type .getCollectionType ().equals (CollectionType .VM_OPERATION )) {
565+ } else if (type .getCollectionType ().equals (CollectionType .VM_OPERATION )) {
572566 ae = new VmOperationEvent ();
573- VmOperationEvent vmOpEvent = (VmOperationEvent ) ae ;
574-
575- vmOpEvent .setDateStamp (datestamp );
576- vmOpEvent .setTimestamp (timestamp );
577- vmOpEvent .setExtendedType (type );
578- vmOpEvent .setPause (parsePause (line , pos ));
579- }
580- else {
567+ } else {
581568 ae = new GCEvent ();
582- GCEvent event = (GCEvent ) ae ;
583-
584- event .setDateStamp (datestamp );
585- event .setTimestamp (timestamp );
586- event .setExtendedType (type );
587- // now add detail gcevents, should they exist
588- parseDetailEventsIfExist (line , pos , event );
589- if (event .getExtendedType ().getPattern () == GcPattern .GC_MEMORY_PAUSE
590- || event .getExtendedType ().getPattern () == GcPattern .GC_MEMORY ) {
569+ }
591570
592- setMemory (event , line , pos );
593- }
594- // then more detail events follow (perm gen is usually here)
595- parseDetailEventsIfExist (line , pos , event );
596- if (event .getExtendedType ().getPattern () == GcPattern .GC_MEMORY_PAUSE
597- || event .getExtendedType ().getPattern () == GcPattern .GC_PAUSE ) {
571+ ae .setDateStamp (datestamp );
572+ ae .setTimestamp (timestamp );
573+ ae .setExtendedType (type );
574+ // now add detail gcevents, should they exist
575+ if (ae instanceof GCEvent ) {
576+ parseDetailEventsIfExist (line , pos , (GCEvent ) ae );
577+ }
578+ if (type .getPattern () == GcPattern .GC_MEMORY_PAUSE
579+ || type .getPattern () == GcPattern .GC_MEMORY ) {
598580
599- event .setPause (parsePause (line , pos ));
600- }
581+ setMemory (ae , line , pos );
582+ }
583+ // then more detail events follow (perm gen is usually here)
584+ if (ae instanceof GCEvent ) {
585+ parseDetailEventsIfExist (line , pos , (GCEvent )ae );
601586 }
587+ if (type .getPattern () == GcPattern .GC_MEMORY_PAUSE
588+ || type .getPattern () == GcPattern .GC_PAUSE ) {
589+
590+ ae .setPause (parsePause (line , pos ));
591+ } else if (type .getPattern () == GcPattern .GC_PAUSE_DURATION ) {
592+ // special case only occurring with concurrent collections...
593+ // the -end events contain a pause and duration as well
594+ int start = pos .getIndex ();
595+ int end = line .indexOf ('/' , pos .getIndex ());
596+ ae .setPause (NumberParser .parseDouble (line .substring (start , end )));
597+ start = end + 1 ;
598+ end = line .indexOf (' ' , start );
599+ ((ConcurrentGCEvent ) ae ).setDuration (NumberParser .parseDouble (line .substring (start , end )));
600+ }
601+
602602 return ae ;
603603 }
604604 catch (RuntimeException rte ) {
0 commit comments