author | stefank |
Tue, 19 Feb 2019 10:04:28 +0100 | |
changeset 53815 | 46ce458df412 |
parent 53813 | d90512958e44 |
permissions | -rw-r--r-- |
50525
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
1 |
/* |
53813
d90512958e44
8218746: SA: Implement discontiguous bitmap for ZGC
stefank
parents:
50525
diff
changeset
|
2 |
* Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved. |
50525
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
3 |
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
4 |
* |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
5 |
* This code is free software; you can redistribute it and/or modify it |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
6 |
* under the terms of the GNU General Public License version 2 only, as |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
7 |
* published by the Free Software Foundation. |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
8 |
* |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
9 |
* This code is distributed in the hope that it will be useful, but WITHOUT |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
10 |
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
11 |
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
12 |
* version 2 for more details (a copy is included in the LICENSE file that |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
13 |
* accompanied this code). |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
14 |
* |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
15 |
* You should have received a copy of the GNU General Public License version |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
16 |
* 2 along with this work; if not, write to the Free Software Foundation, |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
17 |
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
18 |
* |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
19 |
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
20 |
* or visit www.oracle.com if you need additional information or have any |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
21 |
* questions. |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
22 |
* |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
23 |
*/ |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
24 |
|
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
25 |
package sun.jvm.hotspot.gc.z; |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
26 |
|
53815
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
27 |
import java.util.ArrayList; |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
28 |
import java.util.List; |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
29 |
|
50525
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
30 |
import sun.jvm.hotspot.debugger.Address; |
53815
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
31 |
import sun.jvm.hotspot.debugger.OopHandle; |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
32 |
import sun.jvm.hotspot.gc.shared.LiveRegionsProvider; |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
33 |
import sun.jvm.hotspot.memory.MemRegion; |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
34 |
import sun.jvm.hotspot.oops.Oop; |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
35 |
import sun.jvm.hotspot.oops.UnknownOopException; |
50525
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
36 |
import sun.jvm.hotspot.runtime.VM; |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
37 |
import sun.jvm.hotspot.runtime.VMObject; |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
38 |
import sun.jvm.hotspot.runtime.VMObjectFactory; |
53815
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
39 |
import sun.jvm.hotspot.types.AddressField; |
50525
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
40 |
import sun.jvm.hotspot.types.CIntegerField; |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
41 |
import sun.jvm.hotspot.types.Type; |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
42 |
import sun.jvm.hotspot.types.TypeDataBase; |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
43 |
|
53815
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
44 |
public class ZPage extends VMObject implements LiveRegionsProvider { |
50525
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
45 |
private static CIntegerField typeField; |
53815
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
46 |
private static CIntegerField seqnumField; |
50525
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
47 |
private static long virtualFieldOffset; |
53815
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
48 |
private static AddressField topField; |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
49 |
private static CIntegerField refcountField; |
50525
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
50 |
private static long forwardingFieldOffset; |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
51 |
|
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
52 |
static { |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
53 |
VM.registerVMInitializedObserver((o, d) -> initialize(VM.getVM().getTypeDataBase())); |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
54 |
} |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
55 |
|
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
56 |
static private synchronized void initialize(TypeDataBase db) { |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
57 |
Type type = db.lookupType("ZPage"); |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
58 |
|
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
59 |
typeField = type.getCIntegerField("_type"); |
53815
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
60 |
seqnumField = type.getCIntegerField("_seqnum"); |
50525
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
61 |
virtualFieldOffset = type.getField("_virtual").getOffset(); |
53815
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
62 |
topField = type.getAddressField("_top"); |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
63 |
refcountField = type.getCIntegerField("_refcount"); |
50525
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
64 |
forwardingFieldOffset = type.getField("_forwarding").getOffset(); |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
65 |
} |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
66 |
|
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
67 |
public ZPage(Address addr) { |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
68 |
super(addr); |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
69 |
} |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
70 |
|
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
71 |
private byte type() { |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
72 |
return typeField.getJByte(addr); |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
73 |
} |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
74 |
|
53815
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
75 |
private int seqnum() { |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
76 |
return seqnumField.getJInt(addr); |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
77 |
} |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
78 |
|
50525
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
79 |
private ZVirtualMemory virtual() { |
53815
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
80 |
return VMObjectFactory.newObject(ZVirtualMemory.class, addr.addOffsetTo(virtualFieldOffset)); |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
81 |
} |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
82 |
|
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
83 |
private Address top() { |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
84 |
return topField.getValue(addr); |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
85 |
} |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
86 |
|
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
87 |
private int refcount() { |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
88 |
// refcount is uint32_t so need to be cautious when using this field. |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
89 |
return refcountField.getJInt(addr); |
50525
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
90 |
} |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
91 |
|
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
92 |
private ZForwardingTable forwarding() { |
53815
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
93 |
return VMObjectFactory.newObject(ZForwardingTable.class, addr.addOffsetTo(forwardingFieldOffset)); |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
94 |
} |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
95 |
|
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
96 |
private boolean is_forwarding() { |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
97 |
return forwarding().table() != null; |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
98 |
} |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
99 |
|
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
100 |
private boolean is_relocatable() { |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
101 |
return is_active() && seqnum() < ZGlobals.ZGlobalSeqNum(); |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
102 |
} |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
103 |
|
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
104 |
private boolean isPageRelocating() { |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
105 |
assert(is_active()); |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
106 |
// is_forwarding(): Has a (relocation) forwarding table |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
107 |
// is_relocatable(): Has not been freed yet |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
108 |
return is_forwarding() && is_relocatable(); |
50525
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
109 |
} |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
110 |
|
53813
d90512958e44
8218746: SA: Implement discontiguous bitmap for ZGC
stefank
parents:
50525
diff
changeset
|
111 |
long start() { |
50525
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
112 |
return virtual().start(); |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
113 |
} |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
114 |
|
53813
d90512958e44
8218746: SA: Implement discontiguous bitmap for ZGC
stefank
parents:
50525
diff
changeset
|
115 |
long size() { |
d90512958e44
8218746: SA: Implement discontiguous bitmap for ZGC
stefank
parents:
50525
diff
changeset
|
116 |
return virtual().end() - virtual().start(); |
d90512958e44
8218746: SA: Implement discontiguous bitmap for ZGC
stefank
parents:
50525
diff
changeset
|
117 |
} |
d90512958e44
8218746: SA: Implement discontiguous bitmap for ZGC
stefank
parents:
50525
diff
changeset
|
118 |
|
50525
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
119 |
Address forward_object(Address from) { |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
120 |
// Lookup address in forwarding table |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
121 |
long from_offset = ZAddress.offset(from); |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
122 |
long from_index = (from_offset - start()) >> object_alignment_shift(); |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
123 |
ZForwardingTableEntry entry = forwarding().find(from_index); |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
124 |
assert(!entry.is_empty()); |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
125 |
assert(entry.from_index() == from_index); |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
126 |
|
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
127 |
return ZAddress.good(entry.to_offset()); |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
128 |
} |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
129 |
|
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
130 |
Address relocate_object(Address from) { |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
131 |
// Lookup address in forwarding table |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
132 |
long from_offset = ZAddress.offset(from); |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
133 |
long from_index = (from_offset - start()) >> object_alignment_shift(); |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
134 |
ZForwardingTableEntry entry = forwarding().find(from_index); |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
135 |
if (!entry.is_empty() && entry.from_index() == from_index) { |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
136 |
return ZAddress.good(entry.to_offset()); |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
137 |
} |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
138 |
|
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
139 |
// There's no relocate operation in the SA. |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
140 |
// Mimic object pinning and return the good view of the from object. |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
141 |
return ZAddress.good(from); |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
142 |
} |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
143 |
|
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
144 |
long object_alignment_shift() { |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
145 |
if (type() == ZGlobals.ZPageTypeSmall) { |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
146 |
return ZGlobals.ZObjectAlignmentSmallShift(); |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
147 |
} else if (type() == ZGlobals.ZPageTypeMedium) { |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
148 |
return ZGlobals.ZObjectAlignmentMediumShift; |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
149 |
} else { |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
150 |
assert(type() == ZGlobals.ZPageTypeLarge); |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
151 |
return ZGlobals.ZObjectAlignmentLargeShift; |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
152 |
} |
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
153 |
} |
53815
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
154 |
|
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
155 |
long objectAlignmentSize() { |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
156 |
return 1 << object_alignment_shift(); |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
157 |
} |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
158 |
|
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
159 |
public boolean is_active() { |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
160 |
return refcount() != 0; |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
161 |
} |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
162 |
|
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
163 |
private long getObjectSize(Address good) { |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
164 |
OopHandle handle = good.addOffsetToAsOopHandle(0); |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
165 |
Oop obj = null; |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
166 |
|
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
167 |
try { |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
168 |
obj = VM.getVM().getObjectHeap().newOop(handle); |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
169 |
} catch (UnknownOopException exp) { |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
170 |
throw new RuntimeException(" UnknownOopException " + exp); |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
171 |
} |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
172 |
|
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
173 |
return VM.getVM().alignUp(obj.getObjectSize(), objectAlignmentSize()); |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
174 |
} |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
175 |
|
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
176 |
private void addNotRelocatedRegions(List<MemRegion> regions) { |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
177 |
MemRegion mr = null; |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
178 |
|
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
179 |
// Some objects have already been forwarded to new locations. |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
180 |
long topValue = top().asLongValue(); |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
181 |
for (long offsetValue = start(); offsetValue < topValue;) { |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
182 |
Address from = ZAddress.good(ZUtils.longToAddress(offsetValue)); |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
183 |
|
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
184 |
Address to = relocate_object(from); |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
185 |
|
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
186 |
long byteSize; |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
187 |
try { |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
188 |
byteSize = getObjectSize(to); |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
189 |
} catch (Exception e) { |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
190 |
// Parsing the ZHeap is inherently unsafe |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
191 |
// when classes have been unloaded. Dead objects |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
192 |
// might have stale Klass pointers, and there's |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
193 |
// no way to get the size of the dead object. |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
194 |
// |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
195 |
// If possible, run with -XX:-ClassUnloading |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
196 |
// to ensure that all Klasses are kept alive. |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
197 |
System.err.println("Unparsable regions found. Skipping: " |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
198 |
+ from |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
199 |
+ " " |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
200 |
+ from.addOffsetTo(topValue - offsetValue)); |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
201 |
|
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
202 |
// Can't proceed further. Just return the collected regions. |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
203 |
return; |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
204 |
} |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
205 |
|
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
206 |
if (from.equals(to)) { |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
207 |
// Not relocated - add region |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
208 |
if (mr == null) { |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
209 |
mr = new MemRegion(from, 0 /* wordSize */); |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
210 |
regions.add(mr); |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
211 |
} |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
212 |
|
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
213 |
long wordSize = byteSize / VM.getVM().getBytesPerWord(); |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
214 |
mr.setWordSize(mr.wordSize() + wordSize); |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
215 |
} else { |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
216 |
// Forwarded somewhere else, split region. |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
217 |
mr = null; |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
218 |
} |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
219 |
|
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
220 |
offsetValue += byteSize; |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
221 |
} |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
222 |
} |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
223 |
|
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
224 |
public List<MemRegion> getLiveRegions() { |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
225 |
List<MemRegion> res = new ArrayList<>(); |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
226 |
|
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
227 |
if (isPageRelocating()) { |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
228 |
addNotRelocatedRegions(res); |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
229 |
} else { |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
230 |
Address start = ZAddress.good(ZUtils.longToAddress(start())); |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
231 |
|
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
232 |
// Can't convert top() to a "good" address because it might |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
233 |
// be at the top of the "offset" range, and therefore also |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
234 |
// looks like one of the color bits. Instead use the "good" |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
235 |
// address and add the size. |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
236 |
long size = top().asLongValue() - start(); |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
237 |
Address end = start.addOffsetTo(size); |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
238 |
|
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
239 |
res.add(new MemRegion(start, end)); |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
240 |
} |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
241 |
|
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
242 |
return res; |
46ce458df412
8218922: SA: Enable best-effort implementation of live regions iteration for ZGC
stefank
parents:
53813
diff
changeset
|
243 |
} |
50525
767cdb97f103
8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff
changeset
|
244 |
} |