View Javadoc

1   /*
2    * Copyright 2008 Eric Caspole
3    * 
4    * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this
5    * file except in compliance with the License. You may obtain a copy of the License at
6    * 
7    * http://www.apache.org/licenses/LICENSE-2.0
8    * 
9    * Unless required by applicable law or agreed to in writing, software distributed under
10   * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
11   * KIND, either express or implied. See the License for the specific language governing
12   * permissions and limitations under the License.
13   */
14  
15  package net.sf.madmap;
16  
17  import java.io.*;
18  import java.util.*;
19  import javax.swing.*;
20  
21  /**
22   *
23   *  This class holds the model for the cumulative retained size for all instances of a type
24   *
25   */
26  public class CumulativeRetainedHeapTableModel extends MadmapTableModel {
27  
28    ArrayList   _classes;
29    long        _retSizes[];
30    long        _totalLiveSize;
31    int         _rows;
32    
33    private String[] columnNames = {
34      "Type Name",
35      "Type Address",
36      "Instance Count",
37      "Cumulative Retained Size",
38      "Pct of Cum Retained Size"
39    };
40    
41    private Class[] columnType = {
42      (java.lang.Class)((new String("")).getClass()),
43      (java.lang.Class)((new String("")).getClass()),
44      (java.lang.Class)((new Long(0)).getClass()),
45      (java.lang.Class)((new Long(0)).getClass()),
46      (java.lang.Class)((new Double(0.0)).getClass())
47    };
48      
49    public CumulativeRetainedHeapTableModel( Madmap m, ArrayList classes, long liveSize ) {
50  	  super(m);
51      _classes  = classes;
52      _rows     = _classes.size();
53      _retSizes = new long[_rows];    
54      for( int i = 0; i < _rows; i++ ) {      
55        _retSizes[i] = ((HprofHeapCollectable)_classes.get(i)).getRetainedSize();        
56      }
57      
58      _totalLiveSize  = liveSize;
59    }
60  
61    public Class getColumnClass(int c) {
62      return columnType[c];
63    }
64    
65    public String getColumnName(int col) {
66        return columnNames[col];
67    }
68  
69    public int getColumnCount() { return columnNames.length; }
70    public int getRowCount() { return _rows; }
71  
72    /**
73    * Returns the vector containing the strings of the allocation stack trace recorded in the hprof file.
74    * <p>
75    * Retrieves the object from the list of objects shown in the table, then retrieve the stack trace 
76    * vector from the object.
77    *
78    * @param  row   the row selected by the user in the retained heap table
79    *
80    */
81    public Vector getStack(int row) {
82      String s = new String( "  <no stack trace available>" + "\n" );
83      Vector stk = new Vector();
84      stk.add(s);
85      return stk;
86  /*    
87      HprofHeapCollectable hk = (HprofHeapCollectable)_classes.get(row);
88      int stackId = hk.getStackTrace();
89      if ( stackId != 0 ) {
90        HprofStackTraceData std = (HprofStackTraceData) getController().getStackTraces().get(stackId);
91        Vector stk = null;
92        if ( std != null ) { 
93          stk = std.getStackVector();
94        }
95        return stk;
96      } else {
97        return null;
98      }
99  */
100       
101   }
102 
103   /**
104   * Retrieves the object from the list of objects shown in the table 
105   *
106   * @param  row   the row selected by the user in the retained heap table
107   *
108   */
109   public String childrenSummary(int row) {
110     HprofHeapCollectable hk = (HprofHeapCollectable)_classes.get(row);
111     return hk.toString();    
112   }
113 
114   
115   public Object getValueAt(int row, int col) { 
116     Iterator<HprofClassElement>   ihoc3 = _classes.iterator();
117     int i = 0;
118 
119     while( ihoc3.hasNext() ) {
120       HprofClassElement hk = ihoc3.next();
121       long  rs            = _retSizes[i];        
122       double pctLiveSize  = ((double) rs / (double) _totalLiveSize)  *  (double)100.0;
123       
124       if ( i == row ) {
125         if ( col == 0 ) {
126           return new String( hk.className() );
127         } else if ( col == 1 ) {
128           return new String( Long.toHexString(hk.addr()) );
129         } else if ( col == 2 ) {
130           return hk.getInstanceCount();
131         } else if ( col == 3 ) {
132           return rs;
133         } else if ( col == 4 ) {
134           return pctLiveSize;
135         }
136       }
137       i += 1;
138     }
139   
140     assert  true == false : "Should not reach here!" ;
141     return null;
142   }    
143 };