Mercurial > hg > truffle
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 |
rev | line source |
---|---|
0 | 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 | 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 * | |
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 | 22 * |
23 */ | |
24 | |
25 package sun.jvm.hotspot.memory; | |
26 | |
27 import java.io.*; | |
28 import java.util.*; | |
29 import sun.jvm.hotspot.debugger.*; | |
30 import sun.jvm.hotspot.oops.*; | |
31 import sun.jvm.hotspot.runtime.*; | |
32 import sun.jvm.hotspot.types.*; | |
33 import sun.jvm.hotspot.utilities.*; | |
34 | |
35 public class CompactibleFreeListSpace extends CompactibleSpace { | |
36 private static AddressField collectorField; | |
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 | 52 static { |
53 VM.registerVMInitializedObserver(new Observer() { | |
54 public void update(Observable o, Object data) { | |
55 initialize(VM.getVM().getTypeDataBase()); | |
56 } | |
57 }); | |
58 } | |
59 | |
60 private static synchronized void initialize(TypeDataBase db) { | |
61 long sizeofFreeChunk = db.lookupType("FreeChunk").getSize(); | |
62 VM vm = VM.getVM(); | |
63 MinChunkSizeInBytes = numQuanta(sizeofFreeChunk, vm.getMinObjAlignmentInBytes()) * | |
64 vm.getMinObjAlignmentInBytes(); | |
65 | |
66 Type type = db.lookupType("CompactibleFreeListSpace"); | |
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 | 72 } |
73 | |
74 public CompactibleFreeListSpace(Address addr) { | |
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 | 81 } |
82 | |
83 // Accessing block offset table | |
84 public CMSCollector collector() { | |
85 return (CMSCollector) VMObjectFactory.newObject( | |
86 CMSCollector.class, | |
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 | 93 |
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 | 99 List regions = getLiveRegions(); |
100 long usedSize = 0L; | |
101 for (Iterator itr = regions.iterator(); itr.hasNext();) { | |
102 MemRegion mr = (MemRegion) itr.next(); | |
103 usedSize += mr.byteSize(); | |
104 } | |
105 return usedSize; | |
106 } | |
107 | |
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 | 132 |
133 public void printOn(PrintStream tty) { | |
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 | 144 } |
145 | |
146 public Address skipBlockSizeUsingPrintezisBits(Address pos) { | |
147 CMSCollector collector = collector(); | |
148 long size = 0; | |
149 Address addr = null; | |
150 | |
151 if (collector != null) { | |
152 size = collector.blockSizeUsingPrintezisBits(pos); | |
153 if (size >= 3) { | |
154 addr = pos.addOffsetTo(adjustObjectSizeInBytes(size)); | |
155 } | |
156 } | |
157 return addr; | |
158 } | |
159 | |
160 public List/*<MemRegion>*/ getLiveRegions() { | |
161 List res = new ArrayList(); // List<MemRegion> | |
162 VM vm = VM.getVM(); | |
163 Debugger dbg = vm.getDebugger(); | |
164 ObjectHeap heap = vm.getObjectHeap(); | |
165 Address cur = bottom(); | |
166 Address regionStart = cur; | |
167 Address limit = end(); | |
168 final long addressSize = vm.getAddressSize(); | |
169 | |
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 | 172 if (FreeChunk.indicatesFreeChunk(cur)) { |
0 | 173 if (! cur.equals(regionStart)) { |
174 res.add(new MemRegion(regionStart, cur)); | |
175 } | |
176 FreeChunk fc = (FreeChunk) VMObjectFactory.newObject(FreeChunk.class, cur); | |
177 long chunkSize = fc.size(); | |
178 if (Assert.ASSERTS_ENABLED) { | |
179 Assert.that(chunkSize > 0, "invalid FreeChunk size"); | |
180 } | |
181 // note that fc.size() gives chunk size in heap words | |
182 cur = cur.addOffsetTo(chunkSize * addressSize); | |
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 | 185 Oop obj = heap.newOop(cur.addOffsetToAsOopHandle(0)); |
186 long objectSize = obj.getObjectSize(); | |
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 | 198 } |
199 } | |
200 return res; | |
201 } | |
202 | |
203 //-- Internals only below this point | |
204 | |
205 // Unlike corresponding VM code, we operate on byte size rather than | |
206 // HeapWord size for convenience. | |
207 | |
208 private static long numQuanta(long x, long y) { | |
209 return ((x+y-1)/y); | |
210 } | |
211 | |
212 public static long adjustObjectSizeInBytes(long sizeInBytes) { | |
213 return Oop.alignObjectSize(Math.max(sizeInBytes, MinChunkSizeInBytes)); | |
214 } | |
215 | |
216 // FIXME: should I read this directly from VM? | |
217 private static long MinChunkSizeInBytes; | |
218 } |