View Javadoc
1   /*
2    * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
3    * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4    *
5    * This code is free software; you can redistribute it and/or modify it
6    * under the terms of the GNU General Public License version 2 only, as
7    * published by the Free Software Foundation.
8    *
9    * This code is distributed in the hope that it will be useful, but WITHOUT
10   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11   * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12   * version 2 for more details (a copy is included in the LICENSE file that
13   * accompanied this code).
14   *
15   * You should have received a copy of the GNU General Public License version
16   * 2 along with this work; if not, write to the Free Software Foundation,
17   * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18   *
19   * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20   * or visit www.oracle.com if you need additional information or have any
21   * questions.
22   *
23   */
24  
25  package sun.jvm.hotspot.memory;
26  
27  import java.io.*;
28  import java.util.*;
29  
30  import sun.jvm.hotspot.debugger.*;
31  import sun.jvm.hotspot.gc_interface.*;
32  import sun.jvm.hotspot.runtime.*;
33  import sun.jvm.hotspot.types.*;
34  import sun.jvm.hotspot.utilities.*;
35  
36  public class GenCollectedHeap extends SharedHeap {
37    private static CIntegerField nGensField;
38    private static long gensOffset;
39    private static AddressField genSpecsField;
40  
41    private static GenerationFactory genFactory;
42  
43    static {
44      VM.registerVMInitializedObserver(new Observer() {
45          public void update(Observable o, Object data) {
46            initialize(VM.getVM().getTypeDataBase());
47          }
48        });
49    }
50  
51    private static synchronized void initialize(TypeDataBase db) {
52      Type type = db.lookupType("GenCollectedHeap");
53  
54      nGensField = type.getCIntegerField("_n_gens");
55      gensOffset = type.getField("_gens").getOffset();
56      genSpecsField = type.getAddressField("_gen_specs");
57  
58      genFactory = new GenerationFactory();
59    }
60  
61    public GenCollectedHeap(Address addr) {
62      super(addr);
63    }
64  
65    public int nGens() {
66      return (int) nGensField.getValue(addr);
67    }
68  
69    public Generation getGen(int i) {
70      if (Assert.ASSERTS_ENABLED) {
71        Assert.that((i >= 0) && (i < nGens()), "Index " + i +
72                    " out of range (should be between 0 and " + nGens() + ")");
73      }
74  
75      if ((i < 0) || (i >= nGens())) {
76        return null;
77      }
78  
79      Address genAddr = addr.getAddressAt(gensOffset +
80                                          (i * VM.getVM().getAddressSize()));
81      return genFactory.newObject(addr.getAddressAt(gensOffset +
82                                                    (i * VM.getVM().getAddressSize())));
83    }
84  
85    public boolean isIn(Address a) {
86      for (int i = 0; i < nGens(); i++) {
87        Generation gen = getGen(i);
88        if (gen.isIn(a)) {
89          return true;
90        }
91      }
92  
93      return false;
94    }
95  
96    public long capacity() {
97      long capacity = 0;
98      for (int i = 0; i < nGens(); i++) {
99        capacity += getGen(i).capacity();
100     }
101     return capacity;
102   }
103 
104   public long used() {
105     long used = 0;
106     for (int i = 0; i < nGens(); i++) {
107       used += getGen(i).used();
108     }
109     return used;
110   }
111 
112   /** Package-private access to GenerationSpecs */
113   GenerationSpec spec(int level) {
114     if (Assert.ASSERTS_ENABLED) {
115       Assert.that((level >= 0) && (level < nGens()), "Index " + level +
116                   " out of range (should be between 0 and " + nGens() + ")");
117     }
118 
119     if ((level < 0) || (level >= nGens())) {
120       return null;
121     }
122 
123     Address ptrList = genSpecsField.getValue(addr);
124     if (ptrList == null) {
125       return null;
126     }
127     return (GenerationSpec)
128       VMObjectFactory.newObject(GenerationSpec.class,
129                                 ptrList.getAddressAt(level * VM.getVM().getAddressSize()));
130   }
131 
132   public CollectedHeapName kind() {
133     return CollectedHeapName.GEN_COLLECTED_HEAP;
134   }
135 
136   public void printOn(PrintStream tty) {
137     for (int i = 0; i < nGens(); i++) {
138       tty.print("Gen " + i + ": ");
139       getGen(i).printOn(tty);
140       tty.println("Invocations: " + getGen(i).invocations());
141       tty.println();
142     }
143   }
144 }