Mercurial > hg > truffle
annotate agent/src/share/classes/sun/jvm/hotspot/memory/CompactibleFreeListSpace.java @ 3945:8ed53447f690
Merge
author | iveresov |
---|---|
date | Thu, 15 Sep 2011 12:44:09 -0700 |
parents | 0a8e0d4345b3 |
children | da91efe96a93 |
rev | line source |
---|---|
0 | 1 /* |
2042
0a8e0d4345b3
7010068: Update all 2010 Oracle-changed OpenJDK files to have the proper copyright dates - first pass
trims
parents:
1579
diff
changeset
|
2 * Copyright (c) 2003, 2010, 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 |
c70a245cad3a
6670684: 4/5 SA command universe did not print out CMS space information
dcubed
parents:
0
diff
changeset
|
120 BinaryTreeDictionary bfbd = (BinaryTreeDictionary) VMObjectFactory.newObject(BinaryTreeDictionary.class, |
c70a245cad3a
6670684: 4/5 SA command universe did not print out CMS space information
dcubed
parents:
0
diff
changeset
|
121 dictionaryField.getValue(addr)); |
c70a245cad3a
6670684: 4/5 SA command universe did not print out CMS space information
dcubed
parents:
0
diff
changeset
|
122 size += bfbd.size(); |
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);) { | |
171 Address klassOop = 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; | |
184 } else if (klassOop != null) { | |
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 } |