annotate src/share/vm/gc_implementation/g1/g1CodeCacheRemSet.cpp @ 24234:ea6f94ab283b default tip

Added tag jvmci-0.36 for changeset 8128b98d4736
author Gilles Duboscq <gilles.m.duboscq@oracle.com>
date Mon, 18 Sep 2017 18:49:45 +0200
parents 58925d1f325e
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
17753
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
1 /*
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
2 * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
4 *
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
7 * published by the Free Software Foundation.
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
8 *
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
13 * accompanied this code).
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
14 *
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
18 *
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
21 * questions.
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
22 *
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
23 */
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
24
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
25 #include "precompiled.hpp"
20494
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
26 #include "code/codeCache.hpp"
17753
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
27 #include "code/nmethod.hpp"
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
28 #include "gc_implementation/g1/g1CodeCacheRemSet.hpp"
20494
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
29 #include "gc_implementation/g1/heapRegion.hpp"
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
30 #include "memory/heap.hpp"
17753
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
31 #include "memory/iterator.hpp"
20494
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
32 #include "oops/oop.inline.hpp"
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
33 #include "utilities/hashtable.inline.hpp"
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
34 #include "utilities/stack.inline.hpp"
17753
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
35
17937
78bbf4d43a14 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 17753
diff changeset
36 PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC
78bbf4d43a14 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 17753
diff changeset
37
20494
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
38 class CodeRootSetTable : public Hashtable<nmethod*, mtGC> {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
39 friend class G1CodeRootSetTest;
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
40 typedef HashtableEntry<nmethod*, mtGC> Entry;
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
41
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
42 static CodeRootSetTable* volatile _purge_list;
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
43
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
44 CodeRootSetTable* _purge_next;
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
45
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
46 unsigned int compute_hash(nmethod* nm) {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
47 uintptr_t hash = (uintptr_t)nm;
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
48 return hash ^ (hash >> 7); // code heap blocks are 128byte aligned
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
49 }
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
50
20495
58925d1f325e 8057722: G1: Code root hashtable updated incorrectly when evacuation failed
mgerdin
parents: 20494
diff changeset
51 void remove_entry(Entry* e, Entry* previous);
20494
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
52 Entry* new_entry(nmethod* nm);
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
53
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
54 public:
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
55 CodeRootSetTable(int size) : Hashtable<nmethod*, mtGC>(size, sizeof(Entry)), _purge_next(NULL) {}
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
56 ~CodeRootSetTable();
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
57
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
58 // Needs to be protected locks
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
59 bool add(nmethod* nm);
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
60 bool remove(nmethod* nm);
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
61
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
62 // Can be called without locking
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
63 bool contains(nmethod* nm);
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
64
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
65 int entry_size() const { return BasicHashtable<mtGC>::entry_size(); }
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
66
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
67 void copy_to(CodeRootSetTable* new_table);
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
68 void nmethods_do(CodeBlobClosure* blk);
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
69
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
70 template<typename CB>
20495
58925d1f325e 8057722: G1: Code root hashtable updated incorrectly when evacuation failed
mgerdin
parents: 20494
diff changeset
71 int remove_if(CB& should_remove);
20494
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
72
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
73 static void purge_list_append(CodeRootSetTable* tbl);
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
74 static void purge();
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
75
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
76 static size_t static_mem_size() {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
77 return sizeof(_purge_list);
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
78 }
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
79 };
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
80
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
81 CodeRootSetTable* volatile CodeRootSetTable::_purge_list = NULL;
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
82
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
83 CodeRootSetTable::Entry* CodeRootSetTable::new_entry(nmethod* nm) {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
84 unsigned int hash = compute_hash(nm);
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
85 Entry* entry = (Entry*) new_entry_free_list();
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
86 if (entry == NULL) {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
87 entry = (Entry*) NEW_C_HEAP_ARRAY2(char, entry_size(), mtGC, CURRENT_PC);
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
88 }
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
89 entry->set_next(NULL);
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
90 entry->set_hash(hash);
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
91 entry->set_literal(nm);
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
92 return entry;
17753
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
93 }
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
94
20495
58925d1f325e 8057722: G1: Code root hashtable updated incorrectly when evacuation failed
mgerdin
parents: 20494
diff changeset
95 void CodeRootSetTable::remove_entry(Entry* e, Entry* previous) {
58925d1f325e 8057722: G1: Code root hashtable updated incorrectly when evacuation failed
mgerdin
parents: 20494
diff changeset
96 int index = hash_to_index(e->hash());
58925d1f325e 8057722: G1: Code root hashtable updated incorrectly when evacuation failed
mgerdin
parents: 20494
diff changeset
97 assert((e == bucket(index)) == (previous == NULL), "if e is the first entry then previous should be null");
58925d1f325e 8057722: G1: Code root hashtable updated incorrectly when evacuation failed
mgerdin
parents: 20494
diff changeset
98
58925d1f325e 8057722: G1: Code root hashtable updated incorrectly when evacuation failed
mgerdin
parents: 20494
diff changeset
99 if (previous == NULL) {
58925d1f325e 8057722: G1: Code root hashtable updated incorrectly when evacuation failed
mgerdin
parents: 20494
diff changeset
100 set_entry(index, e->next());
58925d1f325e 8057722: G1: Code root hashtable updated incorrectly when evacuation failed
mgerdin
parents: 20494
diff changeset
101 } else {
58925d1f325e 8057722: G1: Code root hashtable updated incorrectly when evacuation failed
mgerdin
parents: 20494
diff changeset
102 previous->set_next(e->next());
58925d1f325e 8057722: G1: Code root hashtable updated incorrectly when evacuation failed
mgerdin
parents: 20494
diff changeset
103 }
58925d1f325e 8057722: G1: Code root hashtable updated incorrectly when evacuation failed
mgerdin
parents: 20494
diff changeset
104 free_entry(e);
58925d1f325e 8057722: G1: Code root hashtable updated incorrectly when evacuation failed
mgerdin
parents: 20494
diff changeset
105 }
58925d1f325e 8057722: G1: Code root hashtable updated incorrectly when evacuation failed
mgerdin
parents: 20494
diff changeset
106
20494
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
107 CodeRootSetTable::~CodeRootSetTable() {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
108 for (int index = 0; index < table_size(); ++index) {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
109 for (Entry* e = bucket(index); e != NULL; ) {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
110 Entry* to_remove = e;
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
111 // read next before freeing.
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
112 e = e->next();
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
113 unlink_entry(to_remove);
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
114 FREE_C_HEAP_ARRAY(char, to_remove, mtGC);
20278
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20218
diff changeset
115 }
20494
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
116 }
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
117 assert(number_of_entries() == 0, "should have removed all entries");
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
118 free_buckets();
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
119 for (BasicHashtableEntry<mtGC>* e = new_entry_free_list(); e != NULL; e = new_entry_free_list()) {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
120 FREE_C_HEAP_ARRAY(char, e, mtGC);
17753
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
121 }
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
122 }
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
123
20494
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
124 bool CodeRootSetTable::add(nmethod* nm) {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
125 if (!contains(nm)) {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
126 Entry* e = new_entry(nm);
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
127 int index = hash_to_index(e->hash());
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
128 add_entry(index, e);
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
129 return true;
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
130 }
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
131 return false;
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
132 }
20278
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20218
diff changeset
133
20494
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
134 bool CodeRootSetTable::contains(nmethod* nm) {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
135 int index = hash_to_index(compute_hash(nm));
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
136 for (Entry* e = bucket(index); e != NULL; e = e->next()) {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
137 if (e->literal() == nm) {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
138 return true;
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
139 }
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
140 }
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
141 return false;
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
142 }
20278
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20218
diff changeset
143
20494
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
144 bool CodeRootSetTable::remove(nmethod* nm) {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
145 int index = hash_to_index(compute_hash(nm));
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
146 Entry* previous = NULL;
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
147 for (Entry* e = bucket(index); e != NULL; previous = e, e = e->next()) {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
148 if (e->literal() == nm) {
20495
58925d1f325e 8057722: G1: Code root hashtable updated incorrectly when evacuation failed
mgerdin
parents: 20494
diff changeset
149 remove_entry(e, previous);
20278
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20218
diff changeset
150 return true;
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20218
diff changeset
151 }
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20218
diff changeset
152 }
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20218
diff changeset
153 return false;
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20218
diff changeset
154 }
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20218
diff changeset
155
20494
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
156 void CodeRootSetTable::copy_to(CodeRootSetTable* new_table) {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
157 for (int index = 0; index < table_size(); ++index) {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
158 for (Entry* e = bucket(index); e != NULL; e = e->next()) {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
159 new_table->add(e->literal());
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
160 }
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
161 }
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
162 new_table->copy_freelist(this);
17753
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
163 }
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
164
20494
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
165 void CodeRootSetTable::nmethods_do(CodeBlobClosure* blk) {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
166 for (int index = 0; index < table_size(); ++index) {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
167 for (Entry* e = bucket(index); e != NULL; e = e->next()) {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
168 blk->do_code_blob(e->literal());
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
169 }
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
170 }
17753
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
171 }
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
172
20494
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
173 template<typename CB>
20495
58925d1f325e 8057722: G1: Code root hashtable updated incorrectly when evacuation failed
mgerdin
parents: 20494
diff changeset
174 int CodeRootSetTable::remove_if(CB& should_remove) {
58925d1f325e 8057722: G1: Code root hashtable updated incorrectly when evacuation failed
mgerdin
parents: 20494
diff changeset
175 int num_removed = 0;
20494
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
176 for (int index = 0; index < table_size(); ++index) {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
177 Entry* previous = NULL;
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
178 Entry* e = bucket(index);
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
179 while (e != NULL) {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
180 Entry* next = e->next();
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
181 if (should_remove(e->literal())) {
20495
58925d1f325e 8057722: G1: Code root hashtable updated incorrectly when evacuation failed
mgerdin
parents: 20494
diff changeset
182 remove_entry(e, previous);
58925d1f325e 8057722: G1: Code root hashtable updated incorrectly when evacuation failed
mgerdin
parents: 20494
diff changeset
183 ++num_removed;
20494
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
184 } else {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
185 previous = e;
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
186 }
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
187 e = next;
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
188 }
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
189 }
20495
58925d1f325e 8057722: G1: Code root hashtable updated incorrectly when evacuation failed
mgerdin
parents: 20494
diff changeset
190 return num_removed;
20494
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
191 }
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
192
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
193 G1CodeRootSet::~G1CodeRootSet() {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
194 delete _table;
20211
82693fb204a5 8038930: G1CodeRootSet::test fails with assert(_num_chunks_handed_out == 0) failed: No elements must have been handed out yet
tschatzl
parents: 17937
diff changeset
195 }
17753
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
196
20494
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
197 CodeRootSetTable* G1CodeRootSet::load_acquire_table() {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
198 return (CodeRootSetTable*) OrderAccess::load_ptr_acquire(&_table);
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
199 }
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
200
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
201 void G1CodeRootSet::allocate_small_table() {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
202 _table = new CodeRootSetTable(SmallSize);
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
203 }
17753
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
204
20494
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
205 void CodeRootSetTable::purge_list_append(CodeRootSetTable* table) {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
206 for (;;) {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
207 table->_purge_next = _purge_list;
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
208 CodeRootSetTable* old = (CodeRootSetTable*) Atomic::cmpxchg_ptr(table, &_purge_list, table->_purge_next);
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
209 if (old == table->_purge_next) {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
210 break;
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
211 }
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
212 }
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
213 }
17753
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
214
20494
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
215 void CodeRootSetTable::purge() {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
216 CodeRootSetTable* table = _purge_list;
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
217 _purge_list = NULL;
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
218 while (table != NULL) {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
219 CodeRootSetTable* to_purge = table;
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
220 table = table->_purge_next;
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
221 delete to_purge;
17753
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
222 }
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
223 }
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
224
20494
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
225 void G1CodeRootSet::move_to_large() {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
226 CodeRootSetTable* temp = new CodeRootSetTable(LargeSize);
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
227
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
228 _table->copy_to(temp);
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
229
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
230 CodeRootSetTable::purge_list_append(_table);
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
231
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
232 OrderAccess::release_store_ptr(&_table, temp);
20211
82693fb204a5 8038930: G1CodeRootSet::test fails with assert(_num_chunks_handed_out == 0) failed: No elements must have been handed out yet
tschatzl
parents: 17937
diff changeset
233 }
82693fb204a5 8038930: G1CodeRootSet::test fails with assert(_num_chunks_handed_out == 0) failed: No elements must have been handed out yet
tschatzl
parents: 17937
diff changeset
234
82693fb204a5 8038930: G1CodeRootSet::test fails with assert(_num_chunks_handed_out == 0) failed: No elements must have been handed out yet
tschatzl
parents: 17937
diff changeset
235
20494
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
236 void G1CodeRootSet::purge() {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
237 CodeRootSetTable::purge();
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
238 }
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
239
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
240 size_t G1CodeRootSet::static_mem_size() {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
241 return CodeRootSetTable::static_mem_size();
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
242 }
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
243
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
244 void G1CodeRootSet::add(nmethod* method) {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
245 bool added = false;
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
246 if (is_empty()) {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
247 allocate_small_table();
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
248 }
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
249 added = _table->add(method);
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
250 if (_length == Threshold) {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
251 move_to_large();
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
252 }
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
253 if (added) {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
254 ++_length;
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
255 }
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
256 }
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
257
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
258 bool G1CodeRootSet::remove(nmethod* method) {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
259 bool removed = false;
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
260 if (_table != NULL) {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
261 removed = _table->remove(method);
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
262 }
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
263 if (removed) {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
264 _length--;
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
265 if (_length == 0) {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
266 clear();
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
267 }
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
268 }
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
269 return removed;
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
270 }
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
271
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
272 bool G1CodeRootSet::contains(nmethod* method) {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
273 CodeRootSetTable* table = load_acquire_table();
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
274 if (table != NULL) {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
275 return table->contains(method);
20211
82693fb204a5 8038930: G1CodeRootSet::test fails with assert(_num_chunks_handed_out == 0) failed: No elements must have been handed out yet
tschatzl
parents: 17937
diff changeset
276 }
20494
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
277 return false;
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
278 }
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
279
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
280 void G1CodeRootSet::clear() {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
281 delete _table;
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
282 _table = NULL;
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
283 _length = 0;
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
284 }
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
285
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
286 size_t G1CodeRootSet::mem_size() {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
287 return sizeof(*this) +
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
288 (_table != NULL ? sizeof(CodeRootSetTable) + _table->entry_size() * _length : 0);
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
289 }
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
290
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
291 void G1CodeRootSet::nmethods_do(CodeBlobClosure* blk) const {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
292 if (_table != NULL) {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
293 _table->nmethods_do(blk);
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
294 }
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
295 }
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
296
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
297 class CleanCallback : public StackObj {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
298 class PointsIntoHRDetectionClosure : public OopClosure {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
299 HeapRegion* _hr;
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
300 public:
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
301 bool _points_into;
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
302 PointsIntoHRDetectionClosure(HeapRegion* hr) : _hr(hr), _points_into(false) {}
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
303
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
304 void do_oop(narrowOop* o) {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
305 do_oop_work(o);
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
306 }
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
307
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
308 void do_oop(oop* o) {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
309 do_oop_work(o);
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
310 }
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
311
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
312 template <typename T>
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
313 void do_oop_work(T* p) {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
314 if (_hr->is_in(oopDesc::load_decode_heap_oop(p))) {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
315 _points_into = true;
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
316 }
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
317 }
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
318 };
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
319
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
320 PointsIntoHRDetectionClosure _detector;
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
321 CodeBlobToOopClosure _blobs;
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
322
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
323 public:
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
324 CleanCallback(HeapRegion* hr) : _detector(hr), _blobs(&_detector, !CodeBlobToOopClosure::FixRelocations) {}
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
325
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
326 bool operator() (nmethod* nm) {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
327 _detector._points_into = false;
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
328 _blobs.do_code_blob(nm);
20495
58925d1f325e 8057722: G1: Code root hashtable updated incorrectly when evacuation failed
mgerdin
parents: 20494
diff changeset
329 return !_detector._points_into;
20494
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
330 }
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
331 };
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
332
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
333 void G1CodeRootSet::clean(HeapRegion* owner) {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
334 CleanCallback should_clean(owner);
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
335 if (_table != NULL) {
20495
58925d1f325e 8057722: G1: Code root hashtable updated incorrectly when evacuation failed
mgerdin
parents: 20494
diff changeset
336 int removed = _table->remove_if(should_clean);
58925d1f325e 8057722: G1: Code root hashtable updated incorrectly when evacuation failed
mgerdin
parents: 20494
diff changeset
337 assert((size_t)removed <= _length, "impossible");
58925d1f325e 8057722: G1: Code root hashtable updated incorrectly when evacuation failed
mgerdin
parents: 20494
diff changeset
338 _length -= removed;
58925d1f325e 8057722: G1: Code root hashtable updated incorrectly when evacuation failed
mgerdin
parents: 20494
diff changeset
339 }
58925d1f325e 8057722: G1: Code root hashtable updated incorrectly when evacuation failed
mgerdin
parents: 20494
diff changeset
340 if (_length == 0) {
58925d1f325e 8057722: G1: Code root hashtable updated incorrectly when evacuation failed
mgerdin
parents: 20494
diff changeset
341 clear();
20494
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
342 }
20211
82693fb204a5 8038930: G1CodeRootSet::test fails with assert(_num_chunks_handed_out == 0) failed: No elements must have been handed out yet
tschatzl
parents: 17937
diff changeset
343 }
82693fb204a5 8038930: G1CodeRootSet::test fails with assert(_num_chunks_handed_out == 0) failed: No elements must have been handed out yet
tschatzl
parents: 17937
diff changeset
344
82693fb204a5 8038930: G1CodeRootSet::test fails with assert(_num_chunks_handed_out == 0) failed: No elements must have been handed out yet
tschatzl
parents: 17937
diff changeset
345 #ifndef PRODUCT
82693fb204a5 8038930: G1CodeRootSet::test fails with assert(_num_chunks_handed_out == 0) failed: No elements must have been handed out yet
tschatzl
parents: 17937
diff changeset
346
20494
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
347 class G1CodeRootSetTest {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
348 public:
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
349 static void test() {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
350 {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
351 G1CodeRootSet set1;
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
352 assert(set1.is_empty(), "Code root set must be initially empty but is not.");
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
353
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
354 assert(G1CodeRootSet::static_mem_size() == sizeof(void*),
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
355 err_msg("The code root set's static memory usage is incorrect, "SIZE_FORMAT" bytes", G1CodeRootSet::static_mem_size()));
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
356
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
357 set1.add((nmethod*)1);
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
358 assert(set1.length() == 1, err_msg("Added exactly one element, but set contains "
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
359 SIZE_FORMAT" elements", set1.length()));
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
360
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
361 const size_t num_to_add = (size_t)G1CodeRootSet::Threshold + 1;
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
362
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
363 for (size_t i = 1; i <= num_to_add; i++) {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
364 set1.add((nmethod*)1);
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
365 }
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
366 assert(set1.length() == 1,
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
367 err_msg("Duplicate detection should not have increased the set size but "
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
368 "is "SIZE_FORMAT, set1.length()));
17753
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
diff changeset
369
20494
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
370 for (size_t i = 2; i <= num_to_add; i++) {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
371 set1.add((nmethod*)(uintptr_t)(i));
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
372 }
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
373 assert(set1.length() == num_to_add,
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
374 err_msg("After adding in total "SIZE_FORMAT" distinct code roots, they "
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
375 "need to be in the set, but there are only "SIZE_FORMAT,
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
376 num_to_add, set1.length()));
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
377
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
378 assert(CodeRootSetTable::_purge_list != NULL, "should have grown to large hashtable");
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
379
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
380 size_t num_popped = 0;
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
381 for (size_t i = 1; i <= num_to_add; i++) {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
382 bool removed = set1.remove((nmethod*)i);
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
383 if (removed) {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
384 num_popped += 1;
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
385 } else {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
386 break;
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
387 }
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
388 }
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
389 assert(num_popped == num_to_add,
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
390 err_msg("Managed to pop "SIZE_FORMAT" code roots, but only "SIZE_FORMAT" "
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
391 "were added", num_popped, num_to_add));
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
392 assert(CodeRootSetTable::_purge_list != NULL, "should have grown to large hashtable");
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
393
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
394 G1CodeRootSet::purge();
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
395
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
396 assert(CodeRootSetTable::_purge_list == NULL, "should have purged old small tables");
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
397
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
398 }
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
399
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
400 }
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
401 };
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
402
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
403 void TestCodeCacheRemSet_test() {
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20279
diff changeset
404 G1CodeRootSetTest::test();
20211
82693fb204a5 8038930: G1CodeRootSet::test fails with assert(_num_chunks_handed_out == 0) failed: No elements must have been handed out yet
tschatzl
parents: 17937
diff changeset
405 }
82693fb204a5 8038930: G1CodeRootSet::test fails with assert(_num_chunks_handed_out == 0) failed: No elements must have been handed out yet
tschatzl
parents: 17937
diff changeset
406
82693fb204a5 8038930: G1CodeRootSet::test fails with assert(_num_chunks_handed_out == 0) failed: No elements must have been handed out yet
tschatzl
parents: 17937
diff changeset
407 #endif