annotate src/share/vm/memory/restore.cpp @ 1091:6aa7255741f3

6906727: UseCompressedOops: some card-marking fixes related to object arrays Summary: Introduced a new write_ref_array(HeapWords* start, size_t count) method that does the requisite MemRegion range calculation so (some of the) clients of the erstwhile write_ref_array(MemRegion mr) do not need to worry. This removed all external uses of array_size(), which was also simplified and made private. Asserts were added to catch other possible issues. Further, less essential, fixes stemming from this investigation are deferred to CR 6904516 (to follow shortly in hs17). Reviewed-by: kvn, coleenp, jmasa
author ysr
date Thu, 03 Dec 2009 15:01:57 -0800
parents d1605aabd0a1
children c18cbe5936b8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
196
d1605aabd0a1 6719955: Update copyright year
xdono
parents: 113
diff changeset
2 * Copyright 2003-2008 Sun Microsystems, Inc. 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 *
a61af66fc99e Initial load
duke
parents:
diff changeset
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
a61af66fc99e Initial load
duke
parents:
diff changeset
20 * CA 95054 USA or visit www.sun.com if you need additional information or
a61af66fc99e Initial load
duke
parents:
diff changeset
21 * have any questions.
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 # include "incls/_precompiled.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
26 # include "incls/_restore.cpp.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
27
a61af66fc99e Initial load
duke
parents:
diff changeset
28
a61af66fc99e Initial load
duke
parents:
diff changeset
29 // Closure for serializing initialization data in from a data area
a61af66fc99e Initial load
duke
parents:
diff changeset
30 // (oop_array) read from the shared file.
a61af66fc99e Initial load
duke
parents:
diff changeset
31
a61af66fc99e Initial load
duke
parents:
diff changeset
32 class ReadClosure : public SerializeOopClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
33 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
34 oop** _oop_array;
a61af66fc99e Initial load
duke
parents:
diff changeset
35
a61af66fc99e Initial load
duke
parents:
diff changeset
36 inline oop nextOop() {
a61af66fc99e Initial load
duke
parents:
diff changeset
37 return *(*_oop_array)++;
a61af66fc99e Initial load
duke
parents:
diff changeset
38 }
a61af66fc99e Initial load
duke
parents:
diff changeset
39
a61af66fc99e Initial load
duke
parents:
diff changeset
40 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
41 ReadClosure(oop** oop_array) { _oop_array = oop_array; }
a61af66fc99e Initial load
duke
parents:
diff changeset
42
a61af66fc99e Initial load
duke
parents:
diff changeset
43 void do_oop(oop* p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
44 assert(SharedSkipVerify || *p == NULL || *p == Universe::klassKlassObj(),
a61af66fc99e Initial load
duke
parents:
diff changeset
45 "initializing previously initialized oop.");
a61af66fc99e Initial load
duke
parents:
diff changeset
46 oop obj = nextOop();
a61af66fc99e Initial load
duke
parents:
diff changeset
47 assert(SharedSkipVerify || (intptr_t)obj >= 0 || (intptr_t)obj < -100,
a61af66fc99e Initial load
duke
parents:
diff changeset
48 "hit tag while initializing oops.");
a61af66fc99e Initial load
duke
parents:
diff changeset
49 assert(SharedSkipVerify || obj->is_oop_or_null(), "invalid oop");
a61af66fc99e Initial load
duke
parents:
diff changeset
50 *p = obj;
a61af66fc99e Initial load
duke
parents:
diff changeset
51 }
a61af66fc99e Initial load
duke
parents:
diff changeset
52
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
53 void do_oop(narrowOop* p) { ShouldNotReachHere(); }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
54
0
a61af66fc99e Initial load
duke
parents:
diff changeset
55 void do_ptr(void** p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
56 assert(*p == NULL, "initializing previous initialized pointer.");
a61af66fc99e Initial load
duke
parents:
diff changeset
57 void* obj = nextOop();
a61af66fc99e Initial load
duke
parents:
diff changeset
58 assert((intptr_t)obj >= 0 || (intptr_t)obj < -100,
a61af66fc99e Initial load
duke
parents:
diff changeset
59 "hit tag while initializing ptrs.");
a61af66fc99e Initial load
duke
parents:
diff changeset
60 *p = obj;
a61af66fc99e Initial load
duke
parents:
diff changeset
61 }
a61af66fc99e Initial load
duke
parents:
diff changeset
62
a61af66fc99e Initial load
duke
parents:
diff changeset
63 void do_ptr(HeapWord** p) { do_ptr((void **) p); }
a61af66fc99e Initial load
duke
parents:
diff changeset
64
a61af66fc99e Initial load
duke
parents:
diff changeset
65 void do_int(int* p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
66 *p = (int)(intptr_t)nextOop();
a61af66fc99e Initial load
duke
parents:
diff changeset
67 }
a61af66fc99e Initial load
duke
parents:
diff changeset
68
a61af66fc99e Initial load
duke
parents:
diff changeset
69 void do_size_t(size_t* p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
70 // Assumes that size_t and pointers are the same size.
a61af66fc99e Initial load
duke
parents:
diff changeset
71 *p = (size_t)nextOop();
a61af66fc99e Initial load
duke
parents:
diff changeset
72 }
a61af66fc99e Initial load
duke
parents:
diff changeset
73
a61af66fc99e Initial load
duke
parents:
diff changeset
74 void do_tag(int tag) {
a61af66fc99e Initial load
duke
parents:
diff changeset
75 int old_tag;
a61af66fc99e Initial load
duke
parents:
diff changeset
76 do_int(&old_tag);
a61af66fc99e Initial load
duke
parents:
diff changeset
77 FileMapInfo::assert_mark(tag == old_tag);
a61af66fc99e Initial load
duke
parents:
diff changeset
78 }
a61af66fc99e Initial load
duke
parents:
diff changeset
79
a61af66fc99e Initial load
duke
parents:
diff changeset
80 void do_region(u_char* start, size_t size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
81 assert((intptr_t)start % sizeof(oop) == 0, "bad alignment");
a61af66fc99e Initial load
duke
parents:
diff changeset
82 assert(size % sizeof(oop) == 0, "bad size");
a61af66fc99e Initial load
duke
parents:
diff changeset
83 do_tag((int)size);
a61af66fc99e Initial load
duke
parents:
diff changeset
84 while (size > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
85 *(oop*)start = nextOop();
a61af66fc99e Initial load
duke
parents:
diff changeset
86 start += sizeof(oop);
a61af66fc99e Initial load
duke
parents:
diff changeset
87 size -= sizeof(oop);
a61af66fc99e Initial load
duke
parents:
diff changeset
88 }
a61af66fc99e Initial load
duke
parents:
diff changeset
89 }
a61af66fc99e Initial load
duke
parents:
diff changeset
90
a61af66fc99e Initial load
duke
parents:
diff changeset
91 bool reading() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
92 };
a61af66fc99e Initial load
duke
parents:
diff changeset
93
a61af66fc99e Initial load
duke
parents:
diff changeset
94
a61af66fc99e Initial load
duke
parents:
diff changeset
95 // Read the oop and miscellaneous data from the shared file, and
a61af66fc99e Initial load
duke
parents:
diff changeset
96 // serialize it out to its various destinations.
a61af66fc99e Initial load
duke
parents:
diff changeset
97
a61af66fc99e Initial load
duke
parents:
diff changeset
98 void CompactingPermGenGen::initialize_oops() {
a61af66fc99e Initial load
duke
parents:
diff changeset
99 FileMapInfo *mapinfo = FileMapInfo::current_info();
a61af66fc99e Initial load
duke
parents:
diff changeset
100
a61af66fc99e Initial load
duke
parents:
diff changeset
101 char* buffer = mapinfo->region_base(md);
a61af66fc99e Initial load
duke
parents:
diff changeset
102
a61af66fc99e Initial load
duke
parents:
diff changeset
103 // Skip over (reserve space for) a list of addresses of C++ vtables
a61af66fc99e Initial load
duke
parents:
diff changeset
104 // for Klass objects. They get filled in later.
a61af66fc99e Initial load
duke
parents:
diff changeset
105
a61af66fc99e Initial load
duke
parents:
diff changeset
106 // Skip over (reserve space for) dummy C++ vtables Klass objects.
a61af66fc99e Initial load
duke
parents:
diff changeset
107 // They are used as is.
a61af66fc99e Initial load
duke
parents:
diff changeset
108
a61af66fc99e Initial load
duke
parents:
diff changeset
109 void** vtbl_list = (void**)buffer;
a61af66fc99e Initial load
duke
parents:
diff changeset
110 buffer += vtbl_list_size * sizeof(void*);
a61af66fc99e Initial load
duke
parents:
diff changeset
111 intptr_t vtable_size = *(intptr_t*)buffer;
a61af66fc99e Initial load
duke
parents:
diff changeset
112 buffer += sizeof(intptr_t);
a61af66fc99e Initial load
duke
parents:
diff changeset
113 buffer += vtable_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
114
a61af66fc99e Initial load
duke
parents:
diff changeset
115 // Create the symbol table using the bucket array at this spot in the
a61af66fc99e Initial load
duke
parents:
diff changeset
116 // misc data space. Since the symbol table is often modified, this
a61af66fc99e Initial load
duke
parents:
diff changeset
117 // region (of mapped pages) will be copy-on-write.
a61af66fc99e Initial load
duke
parents:
diff changeset
118
a61af66fc99e Initial load
duke
parents:
diff changeset
119 int symbolTableLen = *(intptr_t*)buffer;
a61af66fc99e Initial load
duke
parents:
diff changeset
120 buffer += sizeof(intptr_t);
a61af66fc99e Initial load
duke
parents:
diff changeset
121 int number_of_entries = *(intptr_t*)buffer;
a61af66fc99e Initial load
duke
parents:
diff changeset
122 buffer += sizeof(intptr_t);
a61af66fc99e Initial load
duke
parents:
diff changeset
123 SymbolTable::create_table((HashtableBucket*)buffer, symbolTableLen,
a61af66fc99e Initial load
duke
parents:
diff changeset
124 number_of_entries);
a61af66fc99e Initial load
duke
parents:
diff changeset
125 buffer += symbolTableLen;
a61af66fc99e Initial load
duke
parents:
diff changeset
126
a61af66fc99e Initial load
duke
parents:
diff changeset
127 // Create the string table using the bucket array at this spot in the
a61af66fc99e Initial load
duke
parents:
diff changeset
128 // misc data space. Since the string table is often modified, this
a61af66fc99e Initial load
duke
parents:
diff changeset
129 // region (of mapped pages) will be copy-on-write.
a61af66fc99e Initial load
duke
parents:
diff changeset
130
a61af66fc99e Initial load
duke
parents:
diff changeset
131 int stringTableLen = *(intptr_t*)buffer;
a61af66fc99e Initial load
duke
parents:
diff changeset
132 buffer += sizeof(intptr_t);
a61af66fc99e Initial load
duke
parents:
diff changeset
133 number_of_entries = *(intptr_t*)buffer;
a61af66fc99e Initial load
duke
parents:
diff changeset
134 buffer += sizeof(intptr_t);
a61af66fc99e Initial load
duke
parents:
diff changeset
135 StringTable::create_table((HashtableBucket*)buffer, stringTableLen,
a61af66fc99e Initial load
duke
parents:
diff changeset
136 number_of_entries);
a61af66fc99e Initial load
duke
parents:
diff changeset
137 buffer += stringTableLen;
a61af66fc99e Initial load
duke
parents:
diff changeset
138
a61af66fc99e Initial load
duke
parents:
diff changeset
139 // Create the shared dictionary using the bucket array at this spot in
a61af66fc99e Initial load
duke
parents:
diff changeset
140 // the misc data space. Since the shared dictionary table is never
a61af66fc99e Initial load
duke
parents:
diff changeset
141 // modified, this region (of mapped pages) will be (effectively, if
a61af66fc99e Initial load
duke
parents:
diff changeset
142 // not explicitly) read-only.
a61af66fc99e Initial load
duke
parents:
diff changeset
143
a61af66fc99e Initial load
duke
parents:
diff changeset
144 int sharedDictionaryLen = *(intptr_t*)buffer;
a61af66fc99e Initial load
duke
parents:
diff changeset
145 buffer += sizeof(intptr_t);
a61af66fc99e Initial load
duke
parents:
diff changeset
146 number_of_entries = *(intptr_t*)buffer;
a61af66fc99e Initial load
duke
parents:
diff changeset
147 buffer += sizeof(intptr_t);
a61af66fc99e Initial load
duke
parents:
diff changeset
148 SystemDictionary::set_shared_dictionary((HashtableBucket*)buffer,
a61af66fc99e Initial load
duke
parents:
diff changeset
149 sharedDictionaryLen,
a61af66fc99e Initial load
duke
parents:
diff changeset
150 number_of_entries);
a61af66fc99e Initial load
duke
parents:
diff changeset
151 buffer += sharedDictionaryLen;
a61af66fc99e Initial load
duke
parents:
diff changeset
152
a61af66fc99e Initial load
duke
parents:
diff changeset
153 // Create the package info table using the bucket array at this spot in
a61af66fc99e Initial load
duke
parents:
diff changeset
154 // the misc data space. Since the package info table is never
a61af66fc99e Initial load
duke
parents:
diff changeset
155 // modified, this region (of mapped pages) will be (effectively, if
a61af66fc99e Initial load
duke
parents:
diff changeset
156 // not explicitly) read-only.
a61af66fc99e Initial load
duke
parents:
diff changeset
157
a61af66fc99e Initial load
duke
parents:
diff changeset
158 int pkgInfoLen = *(intptr_t*)buffer;
a61af66fc99e Initial load
duke
parents:
diff changeset
159 buffer += sizeof(intptr_t);
a61af66fc99e Initial load
duke
parents:
diff changeset
160 number_of_entries = *(intptr_t*)buffer;
a61af66fc99e Initial load
duke
parents:
diff changeset
161 buffer += sizeof(intptr_t);
a61af66fc99e Initial load
duke
parents:
diff changeset
162 ClassLoader::create_package_info_table((HashtableBucket*)buffer, pkgInfoLen,
a61af66fc99e Initial load
duke
parents:
diff changeset
163 number_of_entries);
a61af66fc99e Initial load
duke
parents:
diff changeset
164 buffer += pkgInfoLen;
a61af66fc99e Initial load
duke
parents:
diff changeset
165 ClassLoader::verify();
a61af66fc99e Initial load
duke
parents:
diff changeset
166
a61af66fc99e Initial load
duke
parents:
diff changeset
167 // The following data in the shared misc data region are the linked
a61af66fc99e Initial load
duke
parents:
diff changeset
168 // list elements (HashtableEntry objects) for the symbol table, string
a61af66fc99e Initial load
duke
parents:
diff changeset
169 // table, and shared dictionary. The heap objects refered to by the
a61af66fc99e Initial load
duke
parents:
diff changeset
170 // symbol table, string table, and shared dictionary are permanent and
a61af66fc99e Initial load
duke
parents:
diff changeset
171 // unmovable. Since new entries added to the string and symbol tables
a61af66fc99e Initial load
duke
parents:
diff changeset
172 // are always added at the beginning of the linked lists, THESE LINKED
a61af66fc99e Initial load
duke
parents:
diff changeset
173 // LIST ELEMENTS ARE READ-ONLY.
a61af66fc99e Initial load
duke
parents:
diff changeset
174
a61af66fc99e Initial load
duke
parents:
diff changeset
175 int len = *(intptr_t*)buffer; // skip over symbol table entries
a61af66fc99e Initial load
duke
parents:
diff changeset
176 buffer += sizeof(intptr_t);
a61af66fc99e Initial load
duke
parents:
diff changeset
177 buffer += len;
a61af66fc99e Initial load
duke
parents:
diff changeset
178
a61af66fc99e Initial load
duke
parents:
diff changeset
179 len = *(intptr_t*)buffer; // skip over string table entries
a61af66fc99e Initial load
duke
parents:
diff changeset
180 buffer += sizeof(intptr_t);
a61af66fc99e Initial load
duke
parents:
diff changeset
181 buffer += len;
a61af66fc99e Initial load
duke
parents:
diff changeset
182
a61af66fc99e Initial load
duke
parents:
diff changeset
183 len = *(intptr_t*)buffer; // skip over shared dictionary entries
a61af66fc99e Initial load
duke
parents:
diff changeset
184 buffer += sizeof(intptr_t);
a61af66fc99e Initial load
duke
parents:
diff changeset
185 buffer += len;
a61af66fc99e Initial load
duke
parents:
diff changeset
186
a61af66fc99e Initial load
duke
parents:
diff changeset
187 len = *(intptr_t*)buffer; // skip over package info table entries
a61af66fc99e Initial load
duke
parents:
diff changeset
188 buffer += sizeof(intptr_t);
a61af66fc99e Initial load
duke
parents:
diff changeset
189 buffer += len;
a61af66fc99e Initial load
duke
parents:
diff changeset
190
a61af66fc99e Initial load
duke
parents:
diff changeset
191 len = *(intptr_t*)buffer; // skip over package info table char[] arrays.
a61af66fc99e Initial load
duke
parents:
diff changeset
192 buffer += sizeof(intptr_t);
a61af66fc99e Initial load
duke
parents:
diff changeset
193 buffer += len;
a61af66fc99e Initial load
duke
parents:
diff changeset
194
a61af66fc99e Initial load
duke
parents:
diff changeset
195 oop* oop_array = (oop*)buffer;
a61af66fc99e Initial load
duke
parents:
diff changeset
196 ReadClosure rc(&oop_array);
a61af66fc99e Initial load
duke
parents:
diff changeset
197 serialize_oops(&rc);
a61af66fc99e Initial load
duke
parents:
diff changeset
198 }