annotate agent/src/share/classes/sun/jvm/hotspot/memory/CompactibleFreeListSpace.java @ 7950:6cf2530f7fd3

8005278: Serviceability Agent: jmap -heap and jstack -m fail Summary: BinaryTreeDictionary is typedef'ed as AFLBinaryTreeDictionary in vmStructs and in SA we still use old name for that. FreeList now is a template based class which is not reflect in SA type library. When SA does calculation of heap for CMS, the former will cause failure to retrieve BinaryTreeDictionary sine the rename. The later will fail wherever it is used in SA. Reviewed-by: dholmes, sla, coleenp Contributed-by: yunda.mly@taobao.com
author minqi
date Thu, 24 Jan 2013 23:30:45 -0800
parents da91efe96a93
children 49618582fc5b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
7950
6cf2530f7fd3 8005278: Serviceability Agent: jmap -heap and jstack -m fail
minqi
parents: 6725
diff changeset
2 * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 948
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 948
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 948
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
a61af66fc99e Initial load
duke
parents:
diff changeset
25 package sun.jvm.hotspot.memory;
a61af66fc99e Initial load
duke
parents:
diff changeset
26
a61af66fc99e Initial load
duke
parents:
diff changeset
27 import java.io.*;
a61af66fc99e Initial load
duke
parents:
diff changeset
28 import java.util.*;
a61af66fc99e Initial load
duke
parents:
diff changeset
29 import sun.jvm.hotspot.debugger.*;
a61af66fc99e Initial load
duke
parents:
diff changeset
30 import sun.jvm.hotspot.oops.*;
a61af66fc99e Initial load
duke
parents:
diff changeset
31 import sun.jvm.hotspot.runtime.*;
a61af66fc99e Initial load
duke
parents:
diff changeset
32 import sun.jvm.hotspot.types.*;
a61af66fc99e Initial load
duke
parents:
diff changeset
33 import sun.jvm.hotspot.utilities.*;
a61af66fc99e Initial load
duke
parents:
diff changeset
34
a61af66fc99e Initial load
duke
parents:
diff changeset
35 public class CompactibleFreeListSpace extends CompactibleSpace {
a61af66fc99e Initial load
duke
parents:
diff changeset
36 private static AddressField collectorField;
a61af66fc99e Initial load
duke
parents:
diff changeset
37
152
c70a245cad3a 6670684: 4/5 SA command universe did not print out CMS space information
dcubed
parents: 0
diff changeset
38 // for free size, three fields
c70a245cad3a 6670684: 4/5 SA command universe did not print out CMS space information
dcubed
parents: 0
diff changeset
39 // FreeBlockDictionary* _dictionary; // ptr to dictionary for large size blocks
c70a245cad3a 6670684: 4/5 SA command universe did not print out CMS space information
dcubed
parents: 0
diff changeset
40 // FreeList _indexedFreeList[IndexSetSize]; // indexed array for small size blocks
c70a245cad3a 6670684: 4/5 SA command universe did not print out CMS space information
dcubed
parents: 0
diff changeset
41 // LinearAllocBlock _smallLinearAllocBlock; // small linear alloc in TLAB
c70a245cad3a 6670684: 4/5 SA command universe did not print out CMS space information
dcubed
parents: 0
diff changeset
42 private static AddressField indexedFreeListField;
c70a245cad3a 6670684: 4/5 SA command universe did not print out CMS space information
dcubed
parents: 0
diff changeset
43 private static AddressField dictionaryField;
c70a245cad3a 6670684: 4/5 SA command universe did not print out CMS space information
dcubed
parents: 0
diff changeset
44 private static long smallLinearAllocBlockFieldOffset;
c70a245cad3a 6670684: 4/5 SA command universe did not print out CMS space information
dcubed
parents: 0
diff changeset
45 private static long indexedFreeListSizeOf;
c70a245cad3a 6670684: 4/5 SA command universe did not print out CMS space information
dcubed
parents: 0
diff changeset
46
c70a245cad3a 6670684: 4/5 SA command universe did not print out CMS space information
dcubed
parents: 0
diff changeset
47 private int heapWordSize; // 4 for 32bit, 8 for 64 bits
c70a245cad3a 6670684: 4/5 SA command universe did not print out CMS space information
dcubed
parents: 0
diff changeset
48 private int IndexSetStart; // for small indexed list
c70a245cad3a 6670684: 4/5 SA command universe did not print out CMS space information
dcubed
parents: 0
diff changeset
49 private int IndexSetSize;
c70a245cad3a 6670684: 4/5 SA command universe did not print out CMS space information
dcubed
parents: 0
diff changeset
50 private int IndexSetStride;
c70a245cad3a 6670684: 4/5 SA command universe did not print out CMS space information
dcubed
parents: 0
diff changeset
51
0
a61af66fc99e Initial load
duke
parents:
diff changeset
52 static {
a61af66fc99e Initial load
duke
parents:
diff changeset
53 VM.registerVMInitializedObserver(new Observer() {
a61af66fc99e Initial load
duke
parents:
diff changeset
54 public void update(Observable o, Object data) {
a61af66fc99e Initial load
duke
parents:
diff changeset
55 initialize(VM.getVM().getTypeDataBase());
a61af66fc99e Initial load
duke
parents:
diff changeset
56 }
a61af66fc99e Initial load
duke
parents:
diff changeset
57 });
a61af66fc99e Initial load
duke
parents:
diff changeset
58 }
a61af66fc99e Initial load
duke
parents:
diff changeset
59
a61af66fc99e Initial load
duke
parents:
diff changeset
60 private static synchronized void initialize(TypeDataBase db) {
a61af66fc99e Initial load
duke
parents:
diff changeset
61 long sizeofFreeChunk = db.lookupType("FreeChunk").getSize();
a61af66fc99e Initial load
duke
parents:
diff changeset
62 VM vm = VM.getVM();
a61af66fc99e Initial load
duke
parents:
diff changeset
63 MinChunkSizeInBytes = numQuanta(sizeofFreeChunk, vm.getMinObjAlignmentInBytes()) *
a61af66fc99e Initial load
duke
parents:
diff changeset
64 vm.getMinObjAlignmentInBytes();
a61af66fc99e Initial load
duke
parents:
diff changeset
65
a61af66fc99e Initial load
duke
parents:
diff changeset
66 Type type = db.lookupType("CompactibleFreeListSpace");
a61af66fc99e Initial load
duke
parents:
diff changeset
67 collectorField = type.getAddressField("_collector");
152
c70a245cad3a 6670684: 4/5 SA command universe did not print out CMS space information
dcubed
parents: 0
diff changeset
68 collectorField = type.getAddressField("_collector");
c70a245cad3a 6670684: 4/5 SA command universe did not print out CMS space information
dcubed
parents: 0
diff changeset
69 dictionaryField = type.getAddressField("_dictionary");
c70a245cad3a 6670684: 4/5 SA command universe did not print out CMS space information
dcubed
parents: 0
diff changeset
70 indexedFreeListField = type.getAddressField("_indexedFreeList[0]");
c70a245cad3a 6670684: 4/5 SA command universe did not print out CMS space information
dcubed
parents: 0
diff changeset
71 smallLinearAllocBlockFieldOffset = type.getField("_smallLinearAllocBlock").getOffset();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
72 }
a61af66fc99e Initial load
duke
parents:
diff changeset
73
a61af66fc99e Initial load
duke
parents:
diff changeset
74 public CompactibleFreeListSpace(Address addr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
75 super(addr);
1571
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 948
diff changeset
76 VM vm = VM.getVM();
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 948
diff changeset
77 heapWordSize = vm.getHeapWordSize();
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 948
diff changeset
78 IndexSetStart = vm.getMinObjAlignmentInBytes() / heapWordSize;
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 948
diff changeset
79 IndexSetStride = IndexSetStart;
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 948
diff changeset
80 IndexSetSize = 257;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
81 }
a61af66fc99e Initial load
duke
parents:
diff changeset
82
a61af66fc99e Initial load
duke
parents:
diff changeset
83 // Accessing block offset table
a61af66fc99e Initial load
duke
parents:
diff changeset
84 public CMSCollector collector() {
a61af66fc99e Initial load
duke
parents:
diff changeset
85 return (CMSCollector) VMObjectFactory.newObject(
a61af66fc99e Initial load
duke
parents:
diff changeset
86 CMSCollector.class,
a61af66fc99e Initial load
duke
parents:
diff changeset
87 collectorField.getValue(addr));
152
c70a245cad3a 6670684: 4/5 SA command universe did not print out CMS space information
dcubed
parents: 0
diff changeset
88 }
c70a245cad3a 6670684: 4/5 SA command universe did not print out CMS space information
dcubed
parents: 0
diff changeset
89
c70a245cad3a 6670684: 4/5 SA command universe did not print out CMS space information
dcubed
parents: 0
diff changeset
90 public long free0() {
c70a245cad3a 6670684: 4/5 SA command universe did not print out CMS space information
dcubed
parents: 0
diff changeset
91 return capacity() - used0();
c70a245cad3a 6670684: 4/5 SA command universe did not print out CMS space information
dcubed
parents: 0
diff changeset
92 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
93
a61af66fc99e Initial load
duke
parents:
diff changeset
94 public long used() {
152
c70a245cad3a 6670684: 4/5 SA command universe did not print out CMS space information
dcubed
parents: 0
diff changeset
95 return capacity() - free();
c70a245cad3a 6670684: 4/5 SA command universe did not print out CMS space information
dcubed
parents: 0
diff changeset
96 }
c70a245cad3a 6670684: 4/5 SA command universe did not print out CMS space information
dcubed
parents: 0
diff changeset
97
c70a245cad3a 6670684: 4/5 SA command universe did not print out CMS space information
dcubed
parents: 0
diff changeset
98 public long used0() {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
99 List regions = getLiveRegions();
a61af66fc99e Initial load
duke
parents:
diff changeset
100 long usedSize = 0L;
a61af66fc99e Initial load
duke
parents:
diff changeset
101 for (Iterator itr = regions.iterator(); itr.hasNext();) {
a61af66fc99e Initial load
duke
parents:
diff changeset
102 MemRegion mr = (MemRegion) itr.next();
a61af66fc99e Initial load
duke
parents:
diff changeset
103 usedSize += mr.byteSize();
a61af66fc99e Initial load
duke
parents:
diff changeset
104 }
a61af66fc99e Initial load
duke
parents:
diff changeset
105 return usedSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
106 }
a61af66fc99e Initial load
duke
parents:
diff changeset
107
a61af66fc99e Initial load
duke
parents:
diff changeset
108 public long free() {
152
c70a245cad3a 6670684: 4/5 SA command universe did not print out CMS space information
dcubed
parents: 0
diff changeset
109 // small chunks
c70a245cad3a 6670684: 4/5 SA command universe did not print out CMS space information
dcubed
parents: 0
diff changeset
110 long size = 0;
c70a245cad3a 6670684: 4/5 SA command universe did not print out CMS space information
dcubed
parents: 0
diff changeset
111 Address cur = addr.addOffsetTo( indexedFreeListField.getOffset() );
c70a245cad3a 6670684: 4/5 SA command universe did not print out CMS space information
dcubed
parents: 0
diff changeset
112 cur = cur.addOffsetTo(IndexSetStart*FreeList.sizeOf());
c70a245cad3a 6670684: 4/5 SA command universe did not print out CMS space information
dcubed
parents: 0
diff changeset
113 for (int i=IndexSetStart; i<IndexSetSize; i += IndexSetStride) {
c70a245cad3a 6670684: 4/5 SA command universe did not print out CMS space information
dcubed
parents: 0
diff changeset
114 FreeList freeList = (FreeList) VMObjectFactory.newObject(FreeList.class, cur);
c70a245cad3a 6670684: 4/5 SA command universe did not print out CMS space information
dcubed
parents: 0
diff changeset
115 size += i*freeList.count();
c70a245cad3a 6670684: 4/5 SA command universe did not print out CMS space information
dcubed
parents: 0
diff changeset
116 cur= cur.addOffsetTo(IndexSetStride*FreeList.sizeOf());
c70a245cad3a 6670684: 4/5 SA command universe did not print out CMS space information
dcubed
parents: 0
diff changeset
117 }
c70a245cad3a 6670684: 4/5 SA command universe did not print out CMS space information
dcubed
parents: 0
diff changeset
118
c70a245cad3a 6670684: 4/5 SA command universe did not print out CMS space information
dcubed
parents: 0
diff changeset
119 // large block
7950
6cf2530f7fd3 8005278: Serviceability Agent: jmap -heap and jstack -m fail
minqi
parents: 6725
diff changeset
120 AFLBinaryTreeDictionary aflbd = (AFLBinaryTreeDictionary) VMObjectFactory.newObject(AFLBinaryTreeDictionary.class,
152
c70a245cad3a 6670684: 4/5 SA command universe did not print out CMS space information
dcubed
parents: 0
diff changeset
121 dictionaryField.getValue(addr));
7950
6cf2530f7fd3 8005278: Serviceability Agent: jmap -heap and jstack -m fail
minqi
parents: 6725
diff changeset
122 size += aflbd.size();
152
c70a245cad3a 6670684: 4/5 SA command universe did not print out CMS space information
dcubed
parents: 0
diff changeset
123
c70a245cad3a 6670684: 4/5 SA command universe did not print out CMS space information
dcubed
parents: 0
diff changeset
124
c70a245cad3a 6670684: 4/5 SA command universe did not print out CMS space information
dcubed
parents: 0
diff changeset
125 // linear block in TLAB
c70a245cad3a 6670684: 4/5 SA command universe did not print out CMS space information
dcubed
parents: 0
diff changeset
126 LinearAllocBlock lab = (LinearAllocBlock) VMObjectFactory.newObject(LinearAllocBlock.class,
c70a245cad3a 6670684: 4/5 SA command universe did not print out CMS space information
dcubed
parents: 0
diff changeset
127 addr.addOffsetTo(smallLinearAllocBlockFieldOffset));
c70a245cad3a 6670684: 4/5 SA command universe did not print out CMS space information
dcubed
parents: 0
diff changeset
128 size += lab.word_size();
c70a245cad3a 6670684: 4/5 SA command universe did not print out CMS space information
dcubed
parents: 0
diff changeset
129
c70a245cad3a 6670684: 4/5 SA command universe did not print out CMS space information
dcubed
parents: 0
diff changeset
130 return size*heapWordSize;
c70a245cad3a 6670684: 4/5 SA command universe did not print out CMS space information
dcubed
parents: 0
diff changeset
131 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
132
a61af66fc99e Initial load
duke
parents:
diff changeset
133 public void printOn(PrintStream tty) {
a61af66fc99e Initial load
duke
parents:
diff changeset
134 tty.print("free-list-space");
152
c70a245cad3a 6670684: 4/5 SA command universe did not print out CMS space information
dcubed
parents: 0
diff changeset
135 tty.print("[ " + bottom() + " , " + end() + " ) ");
c70a245cad3a 6670684: 4/5 SA command universe did not print out CMS space information
dcubed
parents: 0
diff changeset
136 long cap = capacity();
c70a245cad3a 6670684: 4/5 SA command universe did not print out CMS space information
dcubed
parents: 0
diff changeset
137 long used_size = used();
c70a245cad3a 6670684: 4/5 SA command universe did not print out CMS space information
dcubed
parents: 0
diff changeset
138 long free_size = free();
c70a245cad3a 6670684: 4/5 SA command universe did not print out CMS space information
dcubed
parents: 0
diff changeset
139 int used_perc = (int)((double)used_size/cap*100);
c70a245cad3a 6670684: 4/5 SA command universe did not print out CMS space information
dcubed
parents: 0
diff changeset
140 tty.print("space capacity = " + cap + " used(" + used_perc + "%)= " + used_size + " ");
c70a245cad3a 6670684: 4/5 SA command universe did not print out CMS space information
dcubed
parents: 0
diff changeset
141 tty.print("free= " + free_size );
c70a245cad3a 6670684: 4/5 SA command universe did not print out CMS space information
dcubed
parents: 0
diff changeset
142 tty.print("\n");
c70a245cad3a 6670684: 4/5 SA command universe did not print out CMS space information
dcubed
parents: 0
diff changeset
143
0
a61af66fc99e Initial load
duke
parents:
diff changeset
144 }
a61af66fc99e Initial load
duke
parents:
diff changeset
145
a61af66fc99e Initial load
duke
parents:
diff changeset
146 public Address skipBlockSizeUsingPrintezisBits(Address pos) {
a61af66fc99e Initial load
duke
parents:
diff changeset
147 CMSCollector collector = collector();
a61af66fc99e Initial load
duke
parents:
diff changeset
148 long size = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
149 Address addr = null;
a61af66fc99e Initial load
duke
parents:
diff changeset
150
a61af66fc99e Initial load
duke
parents:
diff changeset
151 if (collector != null) {
a61af66fc99e Initial load
duke
parents:
diff changeset
152 size = collector.blockSizeUsingPrintezisBits(pos);
a61af66fc99e Initial load
duke
parents:
diff changeset
153 if (size >= 3) {
a61af66fc99e Initial load
duke
parents:
diff changeset
154 addr = pos.addOffsetTo(adjustObjectSizeInBytes(size));
a61af66fc99e Initial load
duke
parents:
diff changeset
155 }
a61af66fc99e Initial load
duke
parents:
diff changeset
156 }
a61af66fc99e Initial load
duke
parents:
diff changeset
157 return addr;
a61af66fc99e Initial load
duke
parents:
diff changeset
158 }
a61af66fc99e Initial load
duke
parents:
diff changeset
159
a61af66fc99e Initial load
duke
parents:
diff changeset
160 public List/*<MemRegion>*/ getLiveRegions() {
a61af66fc99e Initial load
duke
parents:
diff changeset
161 List res = new ArrayList(); // List<MemRegion>
a61af66fc99e Initial load
duke
parents:
diff changeset
162 VM vm = VM.getVM();
a61af66fc99e Initial load
duke
parents:
diff changeset
163 Debugger dbg = vm.getDebugger();
a61af66fc99e Initial load
duke
parents:
diff changeset
164 ObjectHeap heap = vm.getObjectHeap();
a61af66fc99e Initial load
duke
parents:
diff changeset
165 Address cur = bottom();
a61af66fc99e Initial load
duke
parents:
diff changeset
166 Address regionStart = cur;
a61af66fc99e Initial load
duke
parents:
diff changeset
167 Address limit = end();
a61af66fc99e Initial load
duke
parents:
diff changeset
168 final long addressSize = vm.getAddressSize();
a61af66fc99e Initial load
duke
parents:
diff changeset
169
a61af66fc99e Initial load
duke
parents:
diff changeset
170 for (; cur.lessThan(limit);) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2042
diff changeset
171 Address k = cur.getAddressAt(addressSize);
187
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 0
diff changeset
172 if (FreeChunk.indicatesFreeChunk(cur)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
173 if (! cur.equals(regionStart)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
174 res.add(new MemRegion(regionStart, cur));
a61af66fc99e Initial load
duke
parents:
diff changeset
175 }
a61af66fc99e Initial load
duke
parents:
diff changeset
176 FreeChunk fc = (FreeChunk) VMObjectFactory.newObject(FreeChunk.class, cur);
a61af66fc99e Initial load
duke
parents:
diff changeset
177 long chunkSize = fc.size();
a61af66fc99e Initial load
duke
parents:
diff changeset
178 if (Assert.ASSERTS_ENABLED) {
a61af66fc99e Initial load
duke
parents:
diff changeset
179 Assert.that(chunkSize > 0, "invalid FreeChunk size");
a61af66fc99e Initial load
duke
parents:
diff changeset
180 }
a61af66fc99e Initial load
duke
parents:
diff changeset
181 // note that fc.size() gives chunk size in heap words
a61af66fc99e Initial load
duke
parents:
diff changeset
182 cur = cur.addOffsetTo(chunkSize * addressSize);
a61af66fc99e Initial load
duke
parents:
diff changeset
183 regionStart = cur;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2042
diff changeset
184 } else if (k != null) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
185 Oop obj = heap.newOop(cur.addOffsetToAsOopHandle(0));
a61af66fc99e Initial load
duke
parents:
diff changeset
186 long objectSize = obj.getObjectSize();
a61af66fc99e Initial load
duke
parents:
diff changeset
187 cur = cur.addOffsetTo(adjustObjectSizeInBytes(objectSize));
904
ef671fb22f73 6868051: (SA) FreeChunk support for compressed oops is broken
never
parents: 196
diff changeset
188 } else {
ef671fb22f73 6868051: (SA) FreeChunk support for compressed oops is broken
never
parents: 196
diff changeset
189 // FIXME: need to do a better job here.
ef671fb22f73 6868051: (SA) FreeChunk support for compressed oops is broken
never
parents: 196
diff changeset
190 // can I use bitMap here?
ef671fb22f73 6868051: (SA) FreeChunk support for compressed oops is broken
never
parents: 196
diff changeset
191 //Find the object size using Printezis bits and skip over
ef671fb22f73 6868051: (SA) FreeChunk support for compressed oops is broken
never
parents: 196
diff changeset
192 long size = collector().blockSizeUsingPrintezisBits(cur);
ef671fb22f73 6868051: (SA) FreeChunk support for compressed oops is broken
never
parents: 196
diff changeset
193 if (size == -1) {
ef671fb22f73 6868051: (SA) FreeChunk support for compressed oops is broken
never
parents: 196
diff changeset
194 System.err.println("Printezis bits not set...");
ef671fb22f73 6868051: (SA) FreeChunk support for compressed oops is broken
never
parents: 196
diff changeset
195 break;
ef671fb22f73 6868051: (SA) FreeChunk support for compressed oops is broken
never
parents: 196
diff changeset
196 }
ef671fb22f73 6868051: (SA) FreeChunk support for compressed oops is broken
never
parents: 196
diff changeset
197 cur = cur.addOffsetTo(adjustObjectSizeInBytes(size));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
198 }
a61af66fc99e Initial load
duke
parents:
diff changeset
199 }
a61af66fc99e Initial load
duke
parents:
diff changeset
200 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
201 }
a61af66fc99e Initial load
duke
parents:
diff changeset
202
a61af66fc99e Initial load
duke
parents:
diff changeset
203 //-- Internals only below this point
a61af66fc99e Initial load
duke
parents:
diff changeset
204
a61af66fc99e Initial load
duke
parents:
diff changeset
205 // Unlike corresponding VM code, we operate on byte size rather than
a61af66fc99e Initial load
duke
parents:
diff changeset
206 // HeapWord size for convenience.
a61af66fc99e Initial load
duke
parents:
diff changeset
207
a61af66fc99e Initial load
duke
parents:
diff changeset
208 private static long numQuanta(long x, long y) {
a61af66fc99e Initial load
duke
parents:
diff changeset
209 return ((x+y-1)/y);
a61af66fc99e Initial load
duke
parents:
diff changeset
210 }
a61af66fc99e Initial load
duke
parents:
diff changeset
211
a61af66fc99e Initial load
duke
parents:
diff changeset
212 public static long adjustObjectSizeInBytes(long sizeInBytes) {
a61af66fc99e Initial load
duke
parents:
diff changeset
213 return Oop.alignObjectSize(Math.max(sizeInBytes, MinChunkSizeInBytes));
a61af66fc99e Initial load
duke
parents:
diff changeset
214 }
a61af66fc99e Initial load
duke
parents:
diff changeset
215
a61af66fc99e Initial load
duke
parents:
diff changeset
216 // FIXME: should I read this directly from VM?
a61af66fc99e Initial load
duke
parents:
diff changeset
217 private static long MinChunkSizeInBytes;
a61af66fc99e Initial load
duke
parents:
diff changeset
218 }