annotate src/share/vm/runtime/sweeper.hpp @ 3979:4dfb2df418f2

6484982: G1: process references during evacuation pauses Summary: G1 now uses two reference processors - one is used by concurrent marking and the other is used by STW GCs (both full and incremental evacuation pauses). In an evacuation pause, the reference processor is embedded into the closures used to scan objects. Doing so causes causes reference objects to be 'discovered' by the reference processor. At the end of the evacuation pause, these discovered reference objects are processed - preserving (and copying) referent objects (and their reachable graphs) as appropriate. Reviewed-by: ysr, jwilhelm, brutisso, stefank, tonyp
author johnc
date Thu, 22 Sep 2011 10:57:37 -0700
parents f52ed367b66d
children da91efe96a93
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
1644
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1615
diff changeset
2 * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1538
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1538
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1538
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1644
diff changeset
25 #ifndef SHARE_VM_RUNTIME_SWEEPER_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1644
diff changeset
26 #define SHARE_VM_RUNTIME_SWEEPER_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1644
diff changeset
27
0
a61af66fc99e Initial load
duke
parents:
diff changeset
28 // An NmethodSweeper is an incremental cleaner for:
a61af66fc99e Initial load
duke
parents:
diff changeset
29 // - cleanup inline caches
a61af66fc99e Initial load
duke
parents:
diff changeset
30 // - reclamation of unreferences zombie nmethods
a61af66fc99e Initial load
duke
parents:
diff changeset
31 //
a61af66fc99e Initial load
duke
parents:
diff changeset
32
a61af66fc99e Initial load
duke
parents:
diff changeset
33 class NMethodSweeper : public AllStatic {
a61af66fc99e Initial load
duke
parents:
diff changeset
34 static long _traversals; // Stack traversal count
1615
ff38d05ea86f 6956958: assert(is_clean() || is_call_to_compiled() || is_call_to_interpreted() || is_optimized() || is_megam
never
parents: 1552
diff changeset
35 static nmethod* _current; // Current nmethod
0
a61af66fc99e Initial load
duke
parents:
diff changeset
36 static int _seen; // Nof. nmethod we have currently processed in current pass of CodeCache
1644
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1615
diff changeset
37
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1615
diff changeset
38 static volatile int _invocations; // No. of invocations left until we are completed with this pass
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1615
diff changeset
39 static volatile int _sweep_started; // Flag to control conc sweeper
0
a61af66fc99e Initial load
duke
parents:
diff changeset
40
a61af66fc99e Initial load
duke
parents:
diff changeset
41 static bool _rescan; // Indicates that we should do a full rescan of the
a61af66fc99e Initial load
duke
parents:
diff changeset
42 // of the code cache looking for work to do.
1538
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1202
diff changeset
43 static bool _do_sweep; // Flag to skip the conc sweep if no stack scan happened
0
a61af66fc99e Initial load
duke
parents:
diff changeset
44 static int _locked_seen; // Number of locked nmethods encountered during the scan
a61af66fc99e Initial load
duke
parents:
diff changeset
45 static int _not_entrant_seen_on_stack; // Number of not entrant nmethod were are still on stack
a61af66fc99e Initial load
duke
parents:
diff changeset
46
1202
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 0
diff changeset
47 static bool _was_full; // remember if we did emergency unloading
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 0
diff changeset
48 static jint _advise_to_sweep; // flag to indicate code cache getting full
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 0
diff changeset
49 static jlong _last_was_full; // timestamp of last emergency unloading
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 0
diff changeset
50 static uint _highest_marked; // highest compile id dumped at last emergency unloading
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 0
diff changeset
51 static long _was_full_traversal; // trav number at last emergency unloading
0
a61af66fc99e Initial load
duke
parents:
diff changeset
52
a61af66fc99e Initial load
duke
parents:
diff changeset
53 static void process_nmethod(nmethod *nm);
1644
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1615
diff changeset
54
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1615
diff changeset
55 static void log_sweep(const char* msg, const char* format = NULL, ...);
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1615
diff changeset
56
0
a61af66fc99e Initial load
duke
parents:
diff changeset
57 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
58 static long traversal_count() { return _traversals; }
a61af66fc99e Initial load
duke
parents:
diff changeset
59
3384
f52ed367b66d 6996747: SIGSEGV in nmethod::cleanup_inline_caches / CompiledIC::verify
never
parents: 1972
diff changeset
60 #ifdef ASSERT
f52ed367b66d 6996747: SIGSEGV in nmethod::cleanup_inline_caches / CompiledIC::verify
never
parents: 1972
diff changeset
61 // Keep track of sweeper activity in the ring buffer
f52ed367b66d 6996747: SIGSEGV in nmethod::cleanup_inline_caches / CompiledIC::verify
never
parents: 1972
diff changeset
62 static void record_sweep(nmethod* nm, int line);
f52ed367b66d 6996747: SIGSEGV in nmethod::cleanup_inline_caches / CompiledIC::verify
never
parents: 1972
diff changeset
63 static void report_events(int id, address entry);
f52ed367b66d 6996747: SIGSEGV in nmethod::cleanup_inline_caches / CompiledIC::verify
never
parents: 1972
diff changeset
64 static void report_events();
f52ed367b66d 6996747: SIGSEGV in nmethod::cleanup_inline_caches / CompiledIC::verify
never
parents: 1972
diff changeset
65 #endif
f52ed367b66d 6996747: SIGSEGV in nmethod::cleanup_inline_caches / CompiledIC::verify
never
parents: 1972
diff changeset
66
1538
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1202
diff changeset
67 static void scan_stacks(); // Invoked at the end of each safepoint
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1202
diff changeset
68 static void sweep_code_cache(); // Concurrent part of sweep job
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1202
diff changeset
69 static void possibly_sweep(); // Compiler threads call this to sweep
0
a61af66fc99e Initial load
duke
parents:
diff changeset
70
a61af66fc99e Initial load
duke
parents:
diff changeset
71 static void notify(nmethod* nm) {
a61af66fc99e Initial load
duke
parents:
diff changeset
72 // Perform a full scan of the code cache from the beginning. No
a61af66fc99e Initial load
duke
parents:
diff changeset
73 // need to synchronize the setting of this flag since it only
a61af66fc99e Initial load
duke
parents:
diff changeset
74 // changes to false at safepoint so we can never overwrite it with false.
a61af66fc99e Initial load
duke
parents:
diff changeset
75 _rescan = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
76 }
1202
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 0
diff changeset
77
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 0
diff changeset
78 static void handle_full_code_cache(bool is_full); // Called by compilers who fail to allocate
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 0
diff changeset
79 static void speculative_disconnect_nmethods(bool was_full); // Called by vm op to deal with alloc failure
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 0
diff changeset
80
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 0
diff changeset
81 static void set_was_full(bool state) { _was_full = state; }
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 0
diff changeset
82 static bool was_full() { return _was_full; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
83 };
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1644
diff changeset
84
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1644
diff changeset
85 #endif // SHARE_VM_RUNTIME_SWEEPER_HPP