001 package jp.osdl.jbento2.analyzer; 002 003 import java.util.Calendar; 004 import java.util.Iterator; 005 006 public class GCBuilder { 007 008 private GCList list; 009 010 private Calendar calendar = Calendar.getInstance(); 011 012 private long lastModified = 0; 013 014 private long startMillis = 0; 015 016 private long rampUpMillis = 0; 017 018 private long durationMillis = 0; 019 020 int youngGcCount = 0; 021 022 int fullGcCount = 0; 023 024 long youngGcTime = 0; 025 026 long fullGcTime = 0; 027 028 public GCBuilder(GCList list) { 029 this.list = list; 030 } 031 032 public void setStartMillis(long l) { 033 this.startMillis = l; 034 } 035 036 public void setLastModified(long l) { 037 this.lastModified = l; 038 } 039 040 public String build() { 041 042 if (startMillis == 0) { 043 startMillis = lastModified - list.getLast().getStartTime() 044 - list.getLast().getProcessingTime(); 045 } 046 047 TextTable tt = new TextTable(12, TextTable.ALIGN_RIGHT, ","); 048 tt.setAlign(0, TextTable.ALIGN_LEFT); 049 tt.addRow(new String[] { "Time", "Timestamp", "EC", "EU", "OC", "OU", 050 "PC", "PU", "YGC", "YGCT", "FGC", "FGCT" }); 051 052 Iterator ite = list.iterator(); 053 054 long lastMillis = Long.MAX_VALUE; 055 056 if (durationMillis > 0) { 057 lastMillis = rampUpMillis + durationMillis; 058 } 059 060 while (ite.hasNext()) { 061 GCSample sample = (GCSample) ite.next(); 062 if (rampUpMillis < sample.getStartTime() 063 && sample.getStartTime() <= lastMillis) { 064 sample.calculate(); 065 buildRows(sample, tt); 066 } 067 } 068 069 return tt.toString(); 070 } 071 072 private void buildRows(GCSample sample, TextTable tt) { 073 long gcStartTime = sample.getStartTime(); 074 String startTimeStr = getTimeString(startMillis + gcStartTime); 075 tt.addRow(new String[] { startTimeStr, String.valueOf(gcStartTime), 076 String.valueOf(sample.getNewGC().getMaxSize()), 077 String.valueOf(sample.getNewGC().getBeforeSize()), 078 String.valueOf(sample.getTenuredGC().getMaxSize()), 079 String.valueOf(sample.getTenuredGC().getBeforeSize()), 080 String.valueOf(sample.getPermGC().getMaxSize()), 081 String.valueOf(sample.getPermGC().getBeforeSize()), 082 String.valueOf(youngGcCount), String.valueOf(youngGcTime), 083 String.valueOf(fullGcCount), String.valueOf(fullGcTime) }); 084 085 if (sample.getType() == GCSample.TYPE_GC) { 086 youngGcCount++; 087 youngGcTime += sample.getProcessingTime(); 088 } else { 089 fullGcCount++; 090 fullGcTime += sample.getProcessingTime(); 091 } 092 093 startTimeStr = getTimeString(startMillis + gcStartTime 094 + sample.getProcessingTime()); 095 tt.addRow(new String[] { startTimeStr, String.valueOf(gcStartTime), 096 String.valueOf(sample.getNewGC().getMaxSize()), 097 String.valueOf(sample.getNewGC().getAfterSize()), 098 String.valueOf(sample.getTenuredGC().getMaxSize()), 099 String.valueOf(sample.getTenuredGC().getAfterSize()), 100 String.valueOf(sample.getPermGC().getMaxSize()), 101 String.valueOf(sample.getPermGC().getAfterSize()), 102 String.valueOf(youngGcCount), String.valueOf(youngGcTime), 103 String.valueOf(fullGcCount), String.valueOf(fullGcTime) }); 104 } 105 106 public String getTimeString(long time) { 107 calendar.setTimeInMillis(time); 108 109 int hour = calendar.get(Calendar.HOUR_OF_DAY); 110 int min = calendar.get(Calendar.MINUTE); 111 int sec = calendar.get(Calendar.SECOND); 112 int msec = calendar.get(Calendar.MILLISECOND); 113 114 StringBuffer buf = new StringBuffer(12); 115 buf.append(hour / 10); 116 buf.append(hour % 10); 117 buf.append(":"); 118 buf.append(min / 10); 119 buf.append(min % 10); 120 buf.append(":"); 121 buf.append(sec / 10); 122 buf.append(sec % 10); 123 buf.append("."); 124 buf.append(msec / 100); 125 buf.append((msec / 10) % 10); 126 buf.append(msec % 10); 127 return buf.toString(); 128 } 129 130 public long getDurationMillis() { 131 return durationMillis; 132 } 133 134 public void setDurationMillis(long durationMillis) { 135 this.durationMillis = durationMillis; 136 } 137 138 public long getRampUpMillis() { 139 return rampUpMillis; 140 } 141 142 public void setRampUpMillis(long rampUpMillis) { 143 this.rampUpMillis = rampUpMillis; 144 } 145 }