28 import sun.jvm.hotspot.debugger.Address;
29 import sun.jvm.hotspot.runtime.VM;
30 import sun.jvm.hotspot.runtime.VMObjectFactory;
31 import sun.jvm.hotspot.types.Type;
32 import sun.jvm.hotspot.types.TypeDataBase;
33 import sun.jvm.hotspot.memory.MemRegion;
34 import sun.jvm.hotspot.types.CIntegerField;
35 import sun.jvm.hotspot.types.JLongField;
36 import sun.jvm.hotspot.types.AddressField;
37 import sun.jvm.hotspot.memory.SpaceClosure;
38 import java.io.PrintStream;
39 import java.util.Iterator;
40 import java.util.Observable;
41 import java.util.Observer;
42
43 public class ShenandoahHeap extends CollectedHeap {
44 static private CIntegerField numRegions;
45 static private JLongField usedRegions;
46 static private CIntegerField committedRegions;
47 static private AddressField regionsField;
48
49 static {
50 VM.registerVMInitializedObserver(new Observer() {
51 public void update(Observable o, Object data) {
52 initialize(VM.getVM().getTypeDataBase());
53 }
54 });
55 }
56
57 static private synchronized void initialize(TypeDataBase db) {
58 Type type = db.lookupType("ShenandoahHeap");
59 numRegions = type.getCIntegerField("_num_regions");
60 usedRegions = type.getJLongField("_used");
61 committedRegions = type.getCIntegerField("_committed");
62
63 regionsField = type.getAddressField("_regions");
64 }
65
66 @Override
67 public CollectedHeapName kind() {
68 return CollectedHeapName.SHENANDOAH_HEAP;
69 }
70
71 public long numOfRegions() {
72 return numRegions.getValue(addr);
73 }
74
75 public long used() {
76 return usedRegions.getValue(addr);
77 }
78
79 public long committed() {
80 return committedRegions.getValue(addr);
81 }
82 public void heapRegionIterate(SpaceClosure scl) {
83 ShenandoahHeapRegionSet regionSet = regions();
84 for (long index = 0; index < regionSet.activeRegions(); index ++) {
85 ShenandoahHeapRegion r = regionSet.getRegion(index);
86
87 // Walk live regions
88 if (!r.isTrash() && !r.isUncommitted() && !r.isEmpty()) {
89 scl.doSpace(r);
90 }
91 }
92 }
93
94 public int oop_extra_words() {
95 return 1;
96 }
97
98 public int oop_region_offset_words() {
99 return 1;
100 }
101
102 @Override
103 public void printOn(PrintStream tty) {
104 MemRegion mr = reservedRegion();
105 tty.print("Shenandoah heap");
106 tty.print(" [" + mr.start() + ", " + mr.end() + "]");
107 tty.println(" region size " + ShenandoahHeapRegion.regionSizeBytes() / 1024 + " K");
108 }
109
110 private ShenandoahHeapRegionSet regions() {
111 Address regsAddr = regionsField.getValue(addr);
112 return (ShenandoahHeapRegionSet) VMObjectFactory.newObject(ShenandoahHeapRegionSet.class,
113 regsAddr);
114 }
115
116 public ShenandoahHeap(Address addr) {
117 super(addr);
118 }
119 }
|
28 import sun.jvm.hotspot.debugger.Address;
29 import sun.jvm.hotspot.runtime.VM;
30 import sun.jvm.hotspot.runtime.VMObjectFactory;
31 import sun.jvm.hotspot.types.Type;
32 import sun.jvm.hotspot.types.TypeDataBase;
33 import sun.jvm.hotspot.memory.MemRegion;
34 import sun.jvm.hotspot.types.CIntegerField;
35 import sun.jvm.hotspot.types.JLongField;
36 import sun.jvm.hotspot.types.AddressField;
37 import sun.jvm.hotspot.memory.SpaceClosure;
38 import java.io.PrintStream;
39 import java.util.Iterator;
40 import java.util.Observable;
41 import java.util.Observer;
42
43 public class ShenandoahHeap extends CollectedHeap {
44 static private CIntegerField numRegions;
45 static private JLongField usedRegions;
46 static private CIntegerField committedRegions;
47 static private AddressField regionsField;
48 static {
49 VM.registerVMInitializedObserver(new Observer() {
50 public void update(Observable o, Object data) {
51 initialize(VM.getVM().getTypeDataBase());
52 }
53 });
54 }
55
56 static private synchronized void initialize(TypeDataBase db) {
57 Type type = db.lookupType("ShenandoahHeap");
58 numRegions = type.getCIntegerField("_num_regions");
59 usedRegions = type.getJLongField("_used");
60 committedRegions = type.getCIntegerField("_committed");
61
62 regionsField = type.getAddressField("_regions");
63 }
64
65 @Override
66 public CollectedHeapName kind() {
67 return CollectedHeapName.SHENANDOAH_HEAP;
68 }
69
70 public long numOfRegions() {
71 return numRegions.getValue(addr);
72 }
73
74 public long used() {
75 return usedRegions.getValue(addr);
76 }
77
78 public long committed() {
79 return committedRegions.getValue(addr);
80 }
81 public void heapRegionIterate(SpaceClosure scl) {
82 int numRgns = (int)numRegions.getValue(addr);
83 for (int index = 0; index < numRgns; index ++) {
84 ShenandoahHeapRegion r = getRegion(index);
85
86 // Walk live regions
87 if (!r.isTrash() && !r.isUncommitted() && !r.isEmpty()) {
88 scl.doSpace(r);
89 }
90 }
91 }
92
93 public int oop_extra_words() {
94 return 1;
95 }
96
97 public int oop_region_offset_words() {
98 return 1;
99 }
100
101 @Override
102 public void printOn(PrintStream tty) {
103 MemRegion mr = reservedRegion();
104 tty.print("Shenandoah heap");
105 tty.print(" [" + mr.start() + ", " + mr.end() + "]");
106 tty.println(" region size " + ShenandoahHeapRegion.regionSizeBytes() / 1024 + " K");
107 }
108
109 private ShenandoahHeapRegion getRegion(int index) {
110 Address regsAddr = regionsField.getValue(addr);
111 return (ShenandoahHeapRegion) VMObjectFactory.newObject(ShenandoahHeapRegion.class,
112 regsAddr.getAddressAt(index * VM.getVM().getAddressSize()));
113 }
114
115 public ShenandoahHeap(Address addr) {
116 super(addr);
117 }
118 }
|