1 /*
2 * Copyright (c) 2017, Red Hat, Inc. and/or its affiliates.
3 *
4 * This code is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License version 2 only, as
6 * published by the Free Software Foundation.
7 *
8 * This code is distributed in the hope that it will be useful, but WITHOUT
9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
11 * version 2 for more details (a copy is included in the LICENSE file that
12 * accompanied this code).
13 *
14 * You should have received a copy of the GNU General Public License version
15 * 2 along with this work; if not, write to the Free Software Foundation,
16 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
17 *
18 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
19 * or visit www.oracle.com if you need additional information or have any
20 * questions.
21 *
22 */
23
24 package sun.jvm.hotspot.gc_implementation.shenandoah;
25
26 import sun.jvm.hotspot.gc_interface.CollectedHeap;
27 import sun.jvm.hotspot.gc_interface.CollectedHeapName;
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 }
|
1 /*
2 * Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved.
3 *
4 * This code is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License version 2 only, as
6 * published by the Free Software Foundation.
7 *
8 * This code is distributed in the hope that it will be useful, but WITHOUT
9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
11 * version 2 for more details (a copy is included in the LICENSE file that
12 * accompanied this code).
13 *
14 * You should have received a copy of the GNU General Public License version
15 * 2 along with this work; if not, write to the Free Software Foundation,
16 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
17 *
18 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
19 * or visit www.oracle.com if you need additional information or have any
20 * questions.
21 *
22 */
23
24 package sun.jvm.hotspot.gc_implementation.shenandoah;
25
26 import sun.jvm.hotspot.gc_interface.CollectedHeap;
27 import sun.jvm.hotspot.gc_interface.CollectedHeapName;
28 import sun.jvm.hotspot.debugger.Address;
29 import sun.jvm.hotspot.runtime.VM;
30 import sun.jvm.hotspot.types.Type;
31 import sun.jvm.hotspot.types.TypeDataBase;
32 import sun.jvm.hotspot.memory.MemRegion;
33 import sun.jvm.hotspot.types.CIntegerField;
34 import sun.jvm.hotspot.types.JLongField;
35 import java.io.PrintStream;
36 import java.util.Observable;
37 import java.util.Observer;
38
39 public class ShenandoahHeap extends CollectedHeap {
40 static private CIntegerField numRegions;
41 static private JLongField used;
42 static private CIntegerField committed;
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 static private synchronized void initialize(TypeDataBase db) {
52 Type type = db.lookupType("ShenandoahHeap");
53 numRegions = type.getCIntegerField("_num_regions");
54 used = type.getJLongField("_used");
55 committed = type.getCIntegerField("_committed");
56 }
57
58 @Override
59 public CollectedHeapName kind() {
60 return CollectedHeapName.SHENANDOAH_HEAP;
61 }
62
63 public long numOfRegions() {
64 return numRegions.getValue(addr);
65 }
66
67 @Override
68 public long used() {
69 return used.getValue(addr);
70 }
71
72 public long committed() {
73 return committed.getValue(addr);
74 }
75
76 @Override
77 public void printOn(PrintStream tty) {
78 MemRegion mr = reservedRegion();
79 tty.print("Shenandoah heap");
80 tty.print(" [" + mr.start() + ", " + mr.end() + "]");
81 tty.println(" region size " + ShenandoahHeapRegion.regionSizeBytes() / 1024 + " K");
82 }
83
84 public ShenandoahHeap(Address addr) {
85 super(addr);
86 }
87 }
|