author | iklam |
Wed, 15 Aug 2018 11:19:57 -0700 | |
changeset 51429 | d9f6e3ee7fcb |
parent 51425 | 4e9667589c43 |
child 51467 | 12997ebbc0d8 |
permissions | -rw-r--r-- |
50951
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
1 |
/* |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
2 |
* Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
3 |
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
4 |
* |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
5 |
* This code is free software; you can redistribute it and/or modify it |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
6 |
* under the terms of the GNU General Public License version 2 only, as |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
7 |
* published by the Free Software Foundation. |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
8 |
* |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
9 |
* This code is distributed in the hope that it will be useful, but WITHOUT |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
10 |
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
11 |
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
12 |
* version 2 for more details (a copy is included in the LICENSE file that |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
13 |
* accompanied this code). |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
14 |
* |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
15 |
* You should have received a copy of the GNU General Public License version |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
16 |
* 2 along with this work; if not, write to the Free Software Foundation, |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
17 |
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
18 |
* |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
19 |
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
20 |
* or visit www.oracle.com if you need additional information or have any |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
21 |
* questions. |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
22 |
* |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
23 |
*/ |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
24 |
|
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
25 |
#include "precompiled.hpp" |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
26 |
#include "classfile/javaClasses.inline.hpp" |
51429
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
27 |
#include "classfile/symbolTable.hpp" |
50951
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
28 |
#include "classfile/vmSymbols.hpp" |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
29 |
#include "logging/log.hpp" |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
30 |
#include "logging/logMessage.hpp" |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
31 |
#include "logging/logStream.hpp" |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
32 |
#include "memory/heapShared.hpp" |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
33 |
#include "memory/iterator.inline.hpp" |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
34 |
#include "memory/metadataFactory.hpp" |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
35 |
#include "memory/metaspaceClosure.hpp" |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
36 |
#include "memory/metaspaceShared.hpp" |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
37 |
#include "memory/resourceArea.hpp" |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
38 |
#include "oops/compressedOops.inline.hpp" |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
39 |
#include "oops/oop.inline.hpp" |
51429
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
40 |
#include "runtime/fieldDescriptor.hpp" |
50951
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
41 |
|
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
42 |
#if INCLUDE_CDS_JAVA_HEAP |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
43 |
KlassSubGraphInfo* HeapShared::_subgraph_info_list = NULL; |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
44 |
int HeapShared::_num_archived_subgraph_info_records = 0; |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
45 |
Array<ArchivedKlassSubGraphInfoRecord>* HeapShared::_archived_subgraph_info_records = NULL; |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
46 |
|
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
47 |
// Currently there is only one class mirror (ArchivedModuleGraph) with archived |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
48 |
// sub-graphs. |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
49 |
KlassSubGraphInfo* HeapShared::find_subgraph_info(Klass* k) { |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
50 |
KlassSubGraphInfo* info = _subgraph_info_list; |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
51 |
while (info != NULL) { |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
52 |
if (info->klass() == k) { |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
53 |
return info; |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
54 |
} |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
55 |
info = info->next(); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
56 |
} |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
57 |
return NULL; |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
58 |
} |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
59 |
|
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
60 |
// Get the subgraph_info for Klass k. A new subgraph_info is created if |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
61 |
// there is no existing one for k. The subgraph_info records the relocated |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
62 |
// Klass* of the original k. |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
63 |
KlassSubGraphInfo* HeapShared::get_subgraph_info(Klass* k) { |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
64 |
Klass* relocated_k = MetaspaceShared::get_relocated_klass(k); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
65 |
KlassSubGraphInfo* info = find_subgraph_info(relocated_k); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
66 |
if (info != NULL) { |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
67 |
return info; |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
68 |
} |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
69 |
|
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
70 |
info = new KlassSubGraphInfo(relocated_k, _subgraph_info_list); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
71 |
_subgraph_info_list = info; |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
72 |
return info; |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
73 |
} |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
74 |
|
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
75 |
int HeapShared::num_of_subgraph_infos() { |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
76 |
int num = 0; |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
77 |
KlassSubGraphInfo* info = _subgraph_info_list; |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
78 |
while (info != NULL) { |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
79 |
num ++; |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
80 |
info = info->next(); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
81 |
} |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
82 |
return num; |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
83 |
} |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
84 |
|
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
85 |
// Add an entry field to the current KlassSubGraphInfo. |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
86 |
void KlassSubGraphInfo::add_subgraph_entry_field(int static_field_offset, oop v) { |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
87 |
assert(DumpSharedSpaces, "dump time only"); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
88 |
if (_subgraph_entry_fields == NULL) { |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
89 |
_subgraph_entry_fields = |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
90 |
new(ResourceObj::C_HEAP, mtClass) GrowableArray<juint>(10, true); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
91 |
} |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
92 |
_subgraph_entry_fields->append((juint)static_field_offset); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
93 |
_subgraph_entry_fields->append(CompressedOops::encode(v)); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
94 |
} |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
95 |
|
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
96 |
// Add the Klass* for an object in the current KlassSubGraphInfo's subgraphs. |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
97 |
// Only objects of boot classes can be included in sub-graph. |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
98 |
void KlassSubGraphInfo::add_subgraph_object_klass(Klass* orig_k, Klass *relocated_k) { |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
99 |
assert(DumpSharedSpaces, "dump time only"); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
100 |
assert(relocated_k == MetaspaceShared::get_relocated_klass(orig_k), |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
101 |
"must be the relocated Klass in the shared space"); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
102 |
|
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
103 |
if (_subgraph_object_klasses == NULL) { |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
104 |
_subgraph_object_klasses = |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
105 |
new(ResourceObj::C_HEAP, mtClass) GrowableArray<Klass*>(50, true); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
106 |
} |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
107 |
|
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
108 |
assert(relocated_k->is_shared(), "must be a shared class"); |
51371
3ab8b84e93cd
8207263: Store the Configuration for system modules into CDS archive.
jiangli
parents:
50951
diff
changeset
|
109 |
|
3ab8b84e93cd
8207263: Store the Configuration for system modules into CDS archive.
jiangli
parents:
50951
diff
changeset
|
110 |
if (_k == relocated_k) { |
3ab8b84e93cd
8207263: Store the Configuration for system modules into CDS archive.
jiangli
parents:
50951
diff
changeset
|
111 |
// Don't add the Klass containing the sub-graph to it's own klass |
3ab8b84e93cd
8207263: Store the Configuration for system modules into CDS archive.
jiangli
parents:
50951
diff
changeset
|
112 |
// initialization list. |
3ab8b84e93cd
8207263: Store the Configuration for system modules into CDS archive.
jiangli
parents:
50951
diff
changeset
|
113 |
return; |
3ab8b84e93cd
8207263: Store the Configuration for system modules into CDS archive.
jiangli
parents:
50951
diff
changeset
|
114 |
} |
3ab8b84e93cd
8207263: Store the Configuration for system modules into CDS archive.
jiangli
parents:
50951
diff
changeset
|
115 |
|
50951
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
116 |
if (relocated_k->is_instance_klass()) { |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
117 |
assert(InstanceKlass::cast(relocated_k)->is_shared_boot_class(), |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
118 |
"must be boot class"); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
119 |
// SystemDictionary::xxx_klass() are not updated, need to check |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
120 |
// the original Klass* |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
121 |
if (orig_k == SystemDictionary::String_klass() || |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
122 |
orig_k == SystemDictionary::Object_klass()) { |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
123 |
// Initialized early during VM initialization. No need to be added |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
124 |
// to the sub-graph object class list. |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
125 |
return; |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
126 |
} |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
127 |
} else if (relocated_k->is_objArray_klass()) { |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
128 |
Klass* abk = ObjArrayKlass::cast(relocated_k)->bottom_klass(); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
129 |
if (abk->is_instance_klass()) { |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
130 |
assert(InstanceKlass::cast(abk)->is_shared_boot_class(), |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
131 |
"must be boot class"); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
132 |
} |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
133 |
if (relocated_k == Universe::objectArrayKlassObj()) { |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
134 |
// Initialized early during Universe::genesis. No need to be added |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
135 |
// to the list. |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
136 |
return; |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
137 |
} |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
138 |
} else { |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
139 |
assert(relocated_k->is_typeArray_klass(), "must be"); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
140 |
// Primitive type arrays are created early during Universe::genesis. |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
141 |
return; |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
142 |
} |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
143 |
|
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
144 |
_subgraph_object_klasses->append_if_missing(relocated_k); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
145 |
} |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
146 |
|
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
147 |
// Initialize an archived subgraph_info_record from the given KlassSubGraphInfo. |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
148 |
void ArchivedKlassSubGraphInfoRecord::init(KlassSubGraphInfo* info) { |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
149 |
_k = info->klass(); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
150 |
_next = NULL; |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
151 |
_entry_field_records = NULL; |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
152 |
_subgraph_klasses = NULL; |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
153 |
|
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
154 |
// populate the entry fields |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
155 |
GrowableArray<juint>* entry_fields = info->subgraph_entry_fields(); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
156 |
if (entry_fields != NULL) { |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
157 |
int num_entry_fields = entry_fields->length(); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
158 |
assert(num_entry_fields % 2 == 0, "sanity"); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
159 |
_entry_field_records = |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
160 |
MetaspaceShared::new_ro_array<juint>(num_entry_fields); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
161 |
for (int i = 0 ; i < num_entry_fields; i++) { |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
162 |
_entry_field_records->at_put(i, entry_fields->at(i)); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
163 |
} |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
164 |
} |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
165 |
|
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
166 |
// the Klasses of the objects in the sub-graphs |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
167 |
GrowableArray<Klass*>* subgraph_klasses = info->subgraph_object_klasses(); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
168 |
if (subgraph_klasses != NULL) { |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
169 |
int num_subgraphs_klasses = subgraph_klasses->length(); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
170 |
_subgraph_klasses = |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
171 |
MetaspaceShared::new_ro_array<Klass*>(num_subgraphs_klasses); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
172 |
for (int i = 0; i < num_subgraphs_klasses; i++) { |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
173 |
Klass* subgraph_k = subgraph_klasses->at(i); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
174 |
if (log_is_enabled(Info, cds, heap)) { |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
175 |
ResourceMark rm; |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
176 |
log_info(cds, heap)( |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
177 |
"Archived object klass (%d): %s in %s sub-graphs", |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
178 |
i, subgraph_k->external_name(), _k->external_name()); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
179 |
} |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
180 |
_subgraph_klasses->at_put(i, subgraph_k); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
181 |
} |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
182 |
} |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
183 |
} |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
184 |
|
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
185 |
// Build the records of archived subgraph infos, which include: |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
186 |
// - Entry points to all subgraphs from the containing class mirror. The entry |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
187 |
// points are static fields in the mirror. For each entry point, the field |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
188 |
// offset and value are recorded in the sub-graph info. The value are stored |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
189 |
// back to the corresponding field at runtime. |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
190 |
// - A list of klasses that need to be loaded/initialized before archived |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
191 |
// java object sub-graph can be accessed at runtime. |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
192 |
// |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
193 |
// The records are saved in the archive file and reloaded at runtime. Currently |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
194 |
// there is only one class mirror (ArchivedModuleGraph) with archived sub-graphs. |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
195 |
// |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
196 |
// Layout of the archived subgraph info records: |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
197 |
// |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
198 |
// records_size | num_records | records* |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
199 |
// ArchivedKlassSubGraphInfoRecord | entry_fields | subgraph_object_klasses |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
200 |
size_t HeapShared::build_archived_subgraph_info_records(int num_records) { |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
201 |
// remember the start address |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
202 |
char* start_p = MetaspaceShared::read_only_space_top(); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
203 |
|
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
204 |
// now populate the archived subgraph infos, which will be saved in the |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
205 |
// archive file |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
206 |
_archived_subgraph_info_records = |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
207 |
MetaspaceShared::new_ro_array<ArchivedKlassSubGraphInfoRecord>(num_records); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
208 |
KlassSubGraphInfo* info = _subgraph_info_list; |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
209 |
int i = 0; |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
210 |
while (info != NULL) { |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
211 |
assert(i < _archived_subgraph_info_records->length(), "sanity"); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
212 |
ArchivedKlassSubGraphInfoRecord* record = |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
213 |
_archived_subgraph_info_records->adr_at(i); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
214 |
record->init(info); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
215 |
info = info->next(); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
216 |
i ++; |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
217 |
} |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
218 |
|
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
219 |
// _subgraph_info_list is no longer needed |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
220 |
delete _subgraph_info_list; |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
221 |
_subgraph_info_list = NULL; |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
222 |
|
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
223 |
char* end_p = MetaspaceShared::read_only_space_top(); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
224 |
size_t records_size = end_p - start_p; |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
225 |
return records_size; |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
226 |
} |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
227 |
|
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
228 |
// Write the subgraph info records in the shared _ro region |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
229 |
void HeapShared::write_archived_subgraph_infos() { |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
230 |
assert(DumpSharedSpaces, "dump time only"); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
231 |
|
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
232 |
Array<intptr_t>* records_header = MetaspaceShared::new_ro_array<intptr_t>(3); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
233 |
|
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
234 |
_num_archived_subgraph_info_records = num_of_subgraph_infos(); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
235 |
size_t records_size = build_archived_subgraph_info_records( |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
236 |
_num_archived_subgraph_info_records); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
237 |
|
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
238 |
// Now write the header information: |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
239 |
// records_size, num_records, _archived_subgraph_info_records |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
240 |
assert(records_header != NULL, "sanity"); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
241 |
intptr_t* p = (intptr_t*)(records_header->data()); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
242 |
*p = (intptr_t)records_size; |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
243 |
p ++; |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
244 |
*p = (intptr_t)_num_archived_subgraph_info_records; |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
245 |
p ++; |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
246 |
*p = (intptr_t)_archived_subgraph_info_records; |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
247 |
} |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
248 |
|
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
249 |
char* HeapShared::read_archived_subgraph_infos(char* buffer) { |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
250 |
Array<intptr_t>* records_header = (Array<intptr_t>*)buffer; |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
251 |
intptr_t* p = (intptr_t*)(records_header->data()); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
252 |
size_t records_size = (size_t)(*p); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
253 |
p ++; |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
254 |
_num_archived_subgraph_info_records = *p; |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
255 |
p ++; |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
256 |
_archived_subgraph_info_records = |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
257 |
(Array<ArchivedKlassSubGraphInfoRecord>*)(*p); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
258 |
|
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
259 |
buffer = (char*)_archived_subgraph_info_records + records_size; |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
260 |
return buffer; |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
261 |
} |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
262 |
|
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
263 |
void HeapShared::initialize_from_archived_subgraph(Klass* k) { |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
264 |
if (!MetaspaceShared::open_archive_heap_region_mapped()) { |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
265 |
return; // nothing to do |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
266 |
} |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
267 |
|
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
268 |
if (_num_archived_subgraph_info_records == 0) { |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
269 |
return; // no subgraph info records |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
270 |
} |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
271 |
|
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
272 |
// Initialize from archived data. Currently only ArchivedModuleGraph |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
273 |
// has archived object subgraphs, which is used during VM initialization |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
274 |
// time when bootstraping the system modules. No lock is needed. |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
275 |
Thread* THREAD = Thread::current(); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
276 |
for (int i = 0; i < _archived_subgraph_info_records->length(); i++) { |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
277 |
ArchivedKlassSubGraphInfoRecord* record = _archived_subgraph_info_records->adr_at(i); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
278 |
if (record->klass() == k) { |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
279 |
int i; |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
280 |
// Found the archived subgraph info record for the requesting klass. |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
281 |
// Load/link/initialize the klasses of the objects in the subgraph. |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
282 |
// NULL class loader is used. |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
283 |
Array<Klass*>* klasses = record->subgraph_klasses(); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
284 |
if (klasses != NULL) { |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
285 |
for (i = 0; i < klasses->length(); i++) { |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
286 |
Klass* obj_k = klasses->at(i); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
287 |
Klass* resolved_k = SystemDictionary::resolve_or_null( |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
288 |
(obj_k)->name(), THREAD); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
289 |
if (resolved_k != obj_k) { |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
290 |
return; |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
291 |
} |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
292 |
if ((obj_k)->is_instance_klass()) { |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
293 |
InstanceKlass* ik = InstanceKlass::cast(obj_k); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
294 |
ik->initialize(THREAD); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
295 |
} else if ((obj_k)->is_objArray_klass()) { |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
296 |
ObjArrayKlass* oak = ObjArrayKlass::cast(obj_k); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
297 |
oak->initialize(THREAD); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
298 |
} |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
299 |
} |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
300 |
} |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
301 |
|
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
302 |
if (HAS_PENDING_EXCEPTION) { |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
303 |
CLEAR_PENDING_EXCEPTION; |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
304 |
// None of the field value will be set if there was an exception. |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
305 |
// The java code will not see any of the archived objects in the |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
306 |
// subgraphs referenced from k in this case. |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
307 |
return; |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
308 |
} |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
309 |
|
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
310 |
// Load the subgraph entry fields from the record and store them back to |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
311 |
// the corresponding fields within the mirror. |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
312 |
oop m = k->java_mirror(); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
313 |
Array<juint>* entry_field_records = record->entry_field_records(); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
314 |
if (entry_field_records != NULL) { |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
315 |
int efr_len = entry_field_records->length(); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
316 |
assert(efr_len % 2 == 0, "sanity"); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
317 |
for (i = 0; i < efr_len;) { |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
318 |
int field_offset = entry_field_records->at(i); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
319 |
// The object refereced by the field becomes 'known' by GC from this |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
320 |
// point. All objects in the subgraph reachable from the object are |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
321 |
// also 'known' by GC. |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
322 |
oop v = MetaspaceShared::materialize_archived_object( |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
323 |
CompressedOops::decode(entry_field_records->at(i+1))); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
324 |
m->obj_field_put(field_offset, v); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
325 |
i += 2; |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
326 |
} |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
327 |
} |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
328 |
|
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
329 |
// Done. Java code can see the archived sub-graphs referenced from k's |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
330 |
// mirror after this point. |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
331 |
return; |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
332 |
} |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
333 |
} |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
334 |
} |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
335 |
|
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
336 |
class WalkOopAndArchiveClosure: public BasicOopIterateClosure { |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
337 |
int _level; |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
338 |
KlassSubGraphInfo* _subgraph_info; |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
339 |
oop _orig_referencing_obj; |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
340 |
oop _archived_referencing_obj; |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
341 |
public: |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
342 |
WalkOopAndArchiveClosure(int level, KlassSubGraphInfo* subgraph_info, |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
343 |
oop orig, oop archived) : _level(level), |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
344 |
_subgraph_info(subgraph_info), |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
345 |
_orig_referencing_obj(orig), |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
346 |
_archived_referencing_obj(archived) {} |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
347 |
void do_oop(narrowOop *p) { WalkOopAndArchiveClosure::do_oop_work(p); } |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
348 |
void do_oop( oop *p) { WalkOopAndArchiveClosure::do_oop_work(p); } |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
349 |
|
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
350 |
protected: |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
351 |
template <class T> void do_oop_work(T *p) { |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
352 |
oop obj = RawAccess<>::oop_load(p); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
353 |
if (!CompressedOops::is_null(obj)) { |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
354 |
// A java.lang.Class instance can not be included in an archived |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
355 |
// object sub-graph. |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
356 |
if (java_lang_Class::is_instance(obj)) { |
51425
4e9667589c43
8209389: SIGSEGV in WalkOopAndArchiveClosure::do_oop_work.
jiangli
parents:
51388
diff
changeset
|
357 |
log_error(cds, heap)("Unknown java.lang.Class object is in the archived sub-graph\n"); |
50951
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
358 |
vm_exit(1); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
359 |
} |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
360 |
|
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
361 |
LogTarget(Debug, cds, heap) log; |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
362 |
LogStream ls(log); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
363 |
outputStream* out = &ls; |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
364 |
{ |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
365 |
ResourceMark rm; |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
366 |
log.print("(%d) %s <--- referenced from: %s", |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
367 |
_level, obj->klass()->external_name(), |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
368 |
CompressedOops::is_null(_orig_referencing_obj) ? |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
369 |
"" : _orig_referencing_obj->klass()->external_name()); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
370 |
obj->print_on(out); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
371 |
} |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
372 |
|
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
373 |
if (MetaspaceShared::is_archive_object(obj)) { |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
374 |
// The current oop is an archived oop, nothing needs to be done |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
375 |
log.print("--- object is already archived ---"); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
376 |
return; |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
377 |
} |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
378 |
|
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
379 |
size_t field_delta = pointer_delta( |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
380 |
p, _orig_referencing_obj, sizeof(char)); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
381 |
T* new_p = (T*)(address(_archived_referencing_obj) + field_delta); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
382 |
oop archived = MetaspaceShared::find_archived_heap_object(obj); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
383 |
if (archived != NULL) { |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
384 |
// There is an archived copy existing, update reference to point |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
385 |
// to the archived copy |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
386 |
RawAccess<IS_NOT_NULL>::oop_store(new_p, archived); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
387 |
log.print( |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
388 |
"--- found existing archived copy, store archived " PTR_FORMAT " in " PTR_FORMAT, |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
389 |
p2i(archived), p2i(new_p)); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
390 |
return; |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
391 |
} |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
392 |
|
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
393 |
int l = _level + 1; |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
394 |
Thread* THREAD = Thread::current(); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
395 |
// Archive the current oop before iterating through its references |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
396 |
archived = MetaspaceShared::archive_heap_object(obj, THREAD); |
51425
4e9667589c43
8209389: SIGSEGV in WalkOopAndArchiveClosure::do_oop_work.
jiangli
parents:
51388
diff
changeset
|
397 |
if (archived == NULL) { |
4e9667589c43
8209389: SIGSEGV in WalkOopAndArchiveClosure::do_oop_work.
jiangli
parents:
51388
diff
changeset
|
398 |
ResourceMark rm; |
4e9667589c43
8209389: SIGSEGV in WalkOopAndArchiveClosure::do_oop_work.
jiangli
parents:
51388
diff
changeset
|
399 |
LogTarget(Error, cds, heap) log_err; |
4e9667589c43
8209389: SIGSEGV in WalkOopAndArchiveClosure::do_oop_work.
jiangli
parents:
51388
diff
changeset
|
400 |
LogStream ls_err(log_err); |
4e9667589c43
8209389: SIGSEGV in WalkOopAndArchiveClosure::do_oop_work.
jiangli
parents:
51388
diff
changeset
|
401 |
outputStream* out_err = &ls_err; |
4e9667589c43
8209389: SIGSEGV in WalkOopAndArchiveClosure::do_oop_work.
jiangli
parents:
51388
diff
changeset
|
402 |
log_err.print("Failed to archive %s object (" |
4e9667589c43
8209389: SIGSEGV in WalkOopAndArchiveClosure::do_oop_work.
jiangli
parents:
51388
diff
changeset
|
403 |
PTR_FORMAT "), size[" SIZE_FORMAT "] in sub-graph", |
4e9667589c43
8209389: SIGSEGV in WalkOopAndArchiveClosure::do_oop_work.
jiangli
parents:
51388
diff
changeset
|
404 |
obj->klass()->external_name(), p2i(obj), (size_t)obj->size()); |
4e9667589c43
8209389: SIGSEGV in WalkOopAndArchiveClosure::do_oop_work.
jiangli
parents:
51388
diff
changeset
|
405 |
obj->print_on(out_err); |
4e9667589c43
8209389: SIGSEGV in WalkOopAndArchiveClosure::do_oop_work.
jiangli
parents:
51388
diff
changeset
|
406 |
vm_exit(1); |
4e9667589c43
8209389: SIGSEGV in WalkOopAndArchiveClosure::do_oop_work.
jiangli
parents:
51388
diff
changeset
|
407 |
} |
50951
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
408 |
assert(MetaspaceShared::is_archive_object(archived), "must be archived"); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
409 |
log.print("=== archiving oop " PTR_FORMAT " ==> " PTR_FORMAT, |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
410 |
p2i(obj), p2i(archived)); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
411 |
|
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
412 |
// Following the references in the current oop and archive any |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
413 |
// encountered objects during the process |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
414 |
WalkOopAndArchiveClosure walker(l, _subgraph_info, obj, archived); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
415 |
obj->oop_iterate(&walker); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
416 |
|
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
417 |
// Update the reference in the archived copy of the referencing object |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
418 |
RawAccess<IS_NOT_NULL>::oop_store(new_p, archived); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
419 |
log.print("=== store archived " PTR_FORMAT " in " PTR_FORMAT, |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
420 |
p2i(archived), p2i(new_p)); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
421 |
|
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
422 |
// Add the klass to the list of classes that need to be loaded before |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
423 |
// module system initialization |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
424 |
Klass *orig_k = obj->klass(); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
425 |
Klass *relocated_k = archived->klass(); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
426 |
_subgraph_info->add_subgraph_object_klass(orig_k, relocated_k); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
427 |
} |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
428 |
} |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
429 |
}; |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
430 |
|
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
431 |
// |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
432 |
// Start from the given static field in a java mirror and archive the |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
433 |
// complete sub-graph of java heap objects that are reached directly |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
434 |
// or indirectly from the starting object by following references. |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
435 |
// Currently, only ArchivedModuleGraph class instance (mirror) has archived |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
436 |
// object subgraphs. Sub-graph archiving restrictions (current): |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
437 |
// |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
438 |
// - All classes of objects in the archived sub-graph (including the |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
439 |
// entry class) must be boot class only. |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
440 |
// - No java.lang.Class instance (java mirror) can be included inside |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
441 |
// an archived sub-graph. Mirror can only be the sub-graph entry object. |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
442 |
// |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
443 |
// The Java heap object sub-graph archiving process (see |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
444 |
// WalkOopAndArchiveClosure): |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
445 |
// |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
446 |
// 1) Java object sub-graph archiving starts from a given static field |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
447 |
// within a Class instance (java mirror). If the static field is a |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
448 |
// refererence field and points to a non-null java object, proceed to |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
449 |
// the next step. |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
450 |
// |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
451 |
// 2) Archives the referenced java object. If an archived copy of the |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
452 |
// current object already exists, updates the pointer in the archived |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
453 |
// copy of the referencing object to point to the current archived object. |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
454 |
// Otherwise, proceed to the next step. |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
455 |
// |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
456 |
// 3) Follows all references within the current java object and recursively |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
457 |
// archive the sub-graph of objects starting from each reference. |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
458 |
// |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
459 |
// 4) Updates the pointer in the archived copy of referencing object to |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
460 |
// point to the current archived object. |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
461 |
// |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
462 |
// 5) The Klass of the current java object is added to the list of Klasses |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
463 |
// for loading and initialzing before any object in the archived graph can |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
464 |
// be accessed at runtime. |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
465 |
// |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
466 |
void HeapShared::archive_reachable_objects_from_static_field(Klass *k, |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
467 |
int field_offset, |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
468 |
BasicType field_type, |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
469 |
TRAPS) { |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
470 |
assert(DumpSharedSpaces, "dump time only"); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
471 |
assert(k->is_instance_klass(), "sanity"); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
472 |
assert(InstanceKlass::cast(k)->is_shared_boot_class(), |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
473 |
"must be boot class"); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
474 |
|
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
475 |
oop m = k->java_mirror(); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
476 |
oop archived_m = MetaspaceShared::find_archived_heap_object(m); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
477 |
if (CompressedOops::is_null(archived_m)) { |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
478 |
return; |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
479 |
} |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
480 |
|
51429
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
481 |
if (field_type == T_OBJECT || field_type == T_ARRAY) { |
50951
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
482 |
// obtain k's subGraph Info |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
483 |
KlassSubGraphInfo* subgraph_info = get_subgraph_info(k); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
484 |
|
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
485 |
// get the object referenced by the field |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
486 |
oop f = m->obj_field(field_offset); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
487 |
if (!CompressedOops::is_null(f)) { |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
488 |
LogTarget(Debug, cds, heap) log; |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
489 |
LogStream ls(log); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
490 |
outputStream* out = &ls; |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
491 |
log.print("Start from: "); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
492 |
f->print_on(out); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
493 |
|
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
494 |
// get the archived copy of the field referenced object |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
495 |
oop af = MetaspaceShared::archive_heap_object(f, THREAD); |
51425
4e9667589c43
8209389: SIGSEGV in WalkOopAndArchiveClosure::do_oop_work.
jiangli
parents:
51388
diff
changeset
|
496 |
if (af == NULL) { |
4e9667589c43
8209389: SIGSEGV in WalkOopAndArchiveClosure::do_oop_work.
jiangli
parents:
51388
diff
changeset
|
497 |
// Skip archiving the sub-graph referenced from the current entry field. |
4e9667589c43
8209389: SIGSEGV in WalkOopAndArchiveClosure::do_oop_work.
jiangli
parents:
51388
diff
changeset
|
498 |
ResourceMark rm; |
4e9667589c43
8209389: SIGSEGV in WalkOopAndArchiveClosure::do_oop_work.
jiangli
parents:
51388
diff
changeset
|
499 |
log_info(cds, heap)( |
4e9667589c43
8209389: SIGSEGV in WalkOopAndArchiveClosure::do_oop_work.
jiangli
parents:
51388
diff
changeset
|
500 |
"Cannot archive the sub-graph referenced from %s object (" |
4e9667589c43
8209389: SIGSEGV in WalkOopAndArchiveClosure::do_oop_work.
jiangli
parents:
51388
diff
changeset
|
501 |
PTR_FORMAT ") size[" SIZE_FORMAT "], skipped.", |
4e9667589c43
8209389: SIGSEGV in WalkOopAndArchiveClosure::do_oop_work.
jiangli
parents:
51388
diff
changeset
|
502 |
f->klass()->external_name(), p2i(f), (size_t)f->size()); |
4e9667589c43
8209389: SIGSEGV in WalkOopAndArchiveClosure::do_oop_work.
jiangli
parents:
51388
diff
changeset
|
503 |
return; |
4e9667589c43
8209389: SIGSEGV in WalkOopAndArchiveClosure::do_oop_work.
jiangli
parents:
51388
diff
changeset
|
504 |
} |
50951
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
505 |
if (!MetaspaceShared::is_archive_object(f)) { |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
506 |
WalkOopAndArchiveClosure walker(1, subgraph_info, f, af); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
507 |
f->oop_iterate(&walker); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
508 |
} |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
509 |
|
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
510 |
// The field value is not preserved in the archived mirror. |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
511 |
// Record the field as a new subGraph entry point. The recorded |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
512 |
// information is restored from the archive at runtime. |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
513 |
subgraph_info->add_subgraph_entry_field(field_offset, af); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
514 |
Klass *relocated_k = af->klass(); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
515 |
Klass *orig_k = f->klass(); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
516 |
subgraph_info->add_subgraph_object_klass(orig_k, relocated_k); |
51425
4e9667589c43
8209389: SIGSEGV in WalkOopAndArchiveClosure::do_oop_work.
jiangli
parents:
51388
diff
changeset
|
517 |
ResourceMark rm; |
4e9667589c43
8209389: SIGSEGV in WalkOopAndArchiveClosure::do_oop_work.
jiangli
parents:
51388
diff
changeset
|
518 |
log_info(cds, heap)( |
4e9667589c43
8209389: SIGSEGV in WalkOopAndArchiveClosure::do_oop_work.
jiangli
parents:
51388
diff
changeset
|
519 |
"Archived the sub-graph referenced from %s object " PTR_FORMAT, |
4e9667589c43
8209389: SIGSEGV in WalkOopAndArchiveClosure::do_oop_work.
jiangli
parents:
51388
diff
changeset
|
520 |
f->klass()->external_name(), p2i(f)); |
50951
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
521 |
} else { |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
522 |
// The field contains null, we still need to record the entry point, |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
523 |
// so it can be restored at runtime. |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
524 |
subgraph_info->add_subgraph_entry_field(field_offset, NULL); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
525 |
} |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
526 |
} else { |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
527 |
ShouldNotReachHere(); |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
528 |
} |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
529 |
} |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
530 |
|
51429
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
531 |
struct ArchivableStaticFieldInfo { |
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
532 |
const char* class_name; |
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
533 |
const char* field_name; |
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
534 |
InstanceKlass* klass; |
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
535 |
int offset; |
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
536 |
BasicType type; |
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
537 |
}; |
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
538 |
|
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
539 |
// If you add new entries to this table, you should know what you're doing! |
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
540 |
static ArchivableStaticFieldInfo archivable_static_fields[] = { |
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
541 |
{"jdk/internal/module/ArchivedModuleGraph", "archivedSystemModules"}, |
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
542 |
{"jdk/internal/module/ArchivedModuleGraph", "archivedModuleFinder"}, |
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
543 |
{"jdk/internal/module/ArchivedModuleGraph", "archivedMainModule"}, |
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
544 |
{"jdk/internal/module/ArchivedModuleGraph", "archivedConfiguration"}, |
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
545 |
{"java/util/ImmutableCollections$ListN", "EMPTY_LIST"}, |
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
546 |
{"java/util/ImmutableCollections$MapN", "EMPTY_MAP"}, |
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
547 |
{"java/util/ImmutableCollections$SetN", "EMPTY_SET"}, |
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
548 |
{"java/lang/Integer$IntegerCache", "archivedCache"}, |
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
549 |
{"java/lang/module/Configuration", "EMPTY_CONFIGURATION"}, |
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
550 |
}; |
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
551 |
|
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
552 |
const static int num_archivable_static_fields = sizeof(archivable_static_fields) / sizeof(ArchivableStaticFieldInfo); |
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
553 |
|
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
554 |
class ArchivableStaticFieldFinder: public FieldClosure { |
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
555 |
InstanceKlass* _ik; |
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
556 |
Symbol* _field_name; |
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
557 |
bool _found; |
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
558 |
int _offset; |
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
559 |
BasicType _type; |
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
560 |
public: |
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
561 |
ArchivableStaticFieldFinder(InstanceKlass* ik, Symbol* field_name) : |
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
562 |
_ik(ik), _field_name(field_name), _found(false), _offset(-1), _type(T_ILLEGAL) {} |
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
563 |
|
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
564 |
virtual void do_field(fieldDescriptor* fd) { |
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
565 |
if (fd->name() == _field_name) { |
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
566 |
assert(!_found, "fields cannot be overloaded"); |
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
567 |
_found = true; |
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
568 |
_offset = fd->offset(); |
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
569 |
_type = fd->field_type(); |
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
570 |
assert(_type == T_OBJECT || _type == T_ARRAY, "can archive only obj or array fields"); |
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
571 |
} |
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
572 |
} |
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
573 |
bool found() { return _found; } |
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
574 |
int offset() { return _offset; } |
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
575 |
BasicType type() { return _type; } |
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
576 |
}; |
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
577 |
|
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
578 |
void HeapShared::init_archivable_static_fields(Thread* THREAD) { |
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
579 |
for (int i = 0; i < num_archivable_static_fields; i++) { |
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
580 |
ArchivableStaticFieldInfo* info = &archivable_static_fields[i]; |
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
581 |
TempNewSymbol class_name = SymbolTable::new_symbol(info->class_name, THREAD); |
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
582 |
TempNewSymbol field_name = SymbolTable::new_symbol(info->field_name, THREAD); |
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
583 |
|
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
584 |
Klass* k = SystemDictionary::resolve_or_null(class_name, THREAD); |
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
585 |
assert(k != NULL && !HAS_PENDING_EXCEPTION, "class must exist"); |
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
586 |
InstanceKlass* ik = InstanceKlass::cast(k); |
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
587 |
|
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
588 |
ArchivableStaticFieldFinder finder(ik, field_name); |
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
589 |
ik->do_local_static_fields(&finder); |
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
590 |
assert(finder.found(), "field must exist"); |
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
591 |
|
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
592 |
info->klass = ik; |
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
593 |
info->offset = finder.offset(); |
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
594 |
info->type = finder.type(); |
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
595 |
} |
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
596 |
} |
50951
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
597 |
|
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
598 |
void HeapShared::archive_module_graph_objects(Thread* THREAD) { |
51429
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
599 |
for (int i = 0; i < num_archivable_static_fields; i++) { |
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
600 |
ArchivableStaticFieldInfo* info = &archivable_static_fields[i]; |
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
601 |
archive_reachable_objects_from_static_field(info->klass, info->offset, info->type, CHECK); |
d9f6e3ee7fcb
8209545: Simplify HeapShared::archive_module_graph_objects
iklam
parents:
51425
diff
changeset
|
602 |
} |
50951
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
603 |
} |
b96466cdfc45
8202035: Archive the set of ModuleDescriptor and ModuleReference objects for observable system modules with unnamed initial module.
jiangli
parents:
diff
changeset
|
604 |
#endif // INCLUDE_CDS_JAVA_HEAP |