1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package net.sf.madmap;
16
17 import java.io.*;
18 import java.util.*;
19 import javax.swing.*;
20
21
22 public class RetainedHeapTableModel extends MadmapTableModel {
23
24 ArrayList _objects;
25 long _retSizes[];
26 boolean _leakGuesses[];
27 long _totalLiveSize;
28 int _rows;
29 JTextArea _retLog;
30
31 private String[] columnNames = {
32 "Object Type",
33 "Object Address",
34 "Leak Guess?",
35 "Retained Size",
36 "Pct of Retained Size"
37 };
38
39 private Class[] columnType = {
40 (java.lang.Class)((new String("")).getClass()),
41 (java.lang.Class)((new String("")).getClass()),
42 (java.lang.Class)((new String("")).getClass()),
43 (java.lang.Class)((new Long(0)).getClass()),
44 (java.lang.Class)((new Double(0.0)).getClass())
45 };
46
47 public RetainedHeapTableModel( Madmap m, ArrayList objs, long liveSize, JTextArea log ) {
48 super(m);
49 _objects = objs;
50 _rows = _objects.size();
51 _retSizes = new long[_rows];
52 _leakGuesses = new boolean[_rows];
53
54
55
56 for( int i = 0; i < _rows; i++ ) {
57 _retSizes[i] = ((HprofHeapCollectable)_objects.get(i)).getRetainedSize();
58 HprofHeapCollectable curr = (HprofHeapCollectable)_objects.get(i);
59 assert (curr != null) : "curr obj is null in retained obj input array" ;
60 Boolean b = (Boolean) getController().getGuesses().get(curr.addr());
61 if (( b != null ) && ( b == true )) {
62 _leakGuesses[i] = true;
63 } else {
64 _leakGuesses[i] = false;
65 }
66 }
67
68 _totalLiveSize = liveSize;
69 _retLog = log;
70 }
71
72 public Class getColumnClass(int c) {
73 return columnType[c];
74 }
75
76 public String getColumnName(int col) {
77 return columnNames[col];
78 }
79
80 public int getColumnCount() { return columnNames.length; }
81 public int getRowCount() { return _rows; }
82
83 public JTextArea getLog() { return _retLog; }
84
85
86
87
88
89
90
91
92
93
94 public Vector getStack(int row) {
95
96 HprofHeapAllocation hk = (HprofHeapAllocation)_objects.get(row);
97 int stackId = hk.getStackTrace();
98 if ( stackId != 0 ) {
99 HprofStackTraceData std = (HprofStackTraceData) getController().getStackTraces().get(stackId);
100 Vector stk = null;
101 if ( std != null ) {
102 stk = std.getStackVector();
103 }
104 return stk;
105 } else {
106 return null;
107 }
108 }
109
110
111
112
113
114
115
116 public String childrenSummary(int row) {
117 HprofHeapCollectable hk = (HprofHeapCollectable)_objects.get(row);
118 return hk.toString();
119 }
120
121
122 public Object getValueAt(int row, int col) {
123 Iterator<HprofHeapAllocation> ihoc3 = _objects.iterator();
124 int i = 0;
125
126 while( ihoc3.hasNext() ) {
127 HprofHeapAllocation hk = ihoc3.next();
128
129 if ( i == row ) {
130 if ( col == 0 ) {
131 HprofThreadData thd = null;
132
133 if ( hk.className().equals("java.lang.Thread") ) {
134 thd = (HprofThreadData) getController().getThreads().get( (int) hk.addr() );
135 if ( thd != null ) {
136 return new String( hk.className() + " [ " + thd.name() + " ]" );
137 }
138 }
139 return new String( hk.className() );
140 } else if ( col == 1 ) {
141 return new String( Long.toHexString(hk.addr()) );
142 } else if ( col == 2 ) {
143 if ( _leakGuesses[i] == true ) {
144 return "Yes";
145 } else {
146 return null;
147 }
148 } else if ( col == 3 ) {
149 return _retSizes[i];
150 } else if ( col == 4 ) {
151 long rs = _retSizes[i];
152 double pctLiveSize = ((double) rs / (double) _totalLiveSize) * (double)100.0;
153 return pctLiveSize;
154 }
155 }
156 i += 1;
157 }
158
159 assert true == false : "Should not reach here!" ;
160 return null;
161 }
162 };