annotate src/share/vm/runtime/sweeper.hpp @ 13212:eb03a7335eb0

Use fixed instead of virtual register for target in far foreign call, since the register allocator does not support virtual registers to be used at call sites.
author Christian Wimmer <christian.wimmer@oracle.com>
date Mon, 02 Dec 2013 14:20:32 -0800
parents 78da3894b86f
children 86e6d691f2e1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10206
diff changeset
2 * Copyright (c) 1997, 2013, 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
12324
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12080
diff changeset
30 // - reclamation of nmethods
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12080
diff changeset
31 // Removing nmethods from the code cache includes two operations
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12080
diff changeset
32 // 1) mark active nmethods
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12080
diff changeset
33 // Is done in 'mark_active_nmethods()'. This function is called at a
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12080
diff changeset
34 // safepoint and marks all nmethods that are active on a thread's stack.
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12080
diff changeset
35 // 2) sweep nmethods
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12080
diff changeset
36 // Is done in sweep_code_cache(). This function is the only place in the
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12080
diff changeset
37 // sweeper where memory is reclaimed. Note that sweep_code_cache() is not
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12080
diff changeset
38 // called at a safepoint. However, sweep_code_cache() stops executing if
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12080
diff changeset
39 // another thread requests a safepoint. Consequently, 'mark_active_nmethods()'
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12080
diff changeset
40 // and sweep_code_cache() cannot execute at the same time.
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12080
diff changeset
41 // To reclaim memory, nmethods are first marked as 'not-entrant'. Methods can
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12080
diff changeset
42 // be made not-entrant by (i) the sweeper, (ii) deoptimization, (iii) dependency
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12080
diff changeset
43 // invalidation, and (iv) being replaced be a different method version (tiered
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12080
diff changeset
44 // compilation). Not-entrant nmethod cannot be called by Java threads, but they
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12080
diff changeset
45 // can still be active on the stack. To ensure that active nmethod are not reclaimed,
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12080
diff changeset
46 // we have to wait until the next marking phase has completed. If a not-entrant
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12080
diff changeset
47 // nmethod was NOT marked as active, it can be converted to 'zombie' state. To safely
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12080
diff changeset
48 // remove the nmethod, all inline caches (IC) that point to the the nmethod must be
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12080
diff changeset
49 // cleared. After that, the nmethod can be evicted from the code cache. Each nmethod's
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12080
diff changeset
50 // state change happens during separate sweeps. It may take at least 3 sweeps before an
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12080
diff changeset
51 // nmethod's space is freed. Sweeping is currently done by compiler threads between
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12080
diff changeset
52 // compilations or at least each 5 sec (NmethodSweepCheckInterval) when the code cache
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12080
diff changeset
53 // is full.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
54
a61af66fc99e Initial load
duke
parents:
diff changeset
55 class NMethodSweeper : public AllStatic {
13074
78da3894b86f 8027593: performance drop with constrained codecache starting with hs25 b111
anoll
parents: 12324
diff changeset
56 static long _traversals; // Stack scan count, also sweep ID.
78da3894b86f 8027593: performance drop with constrained codecache starting with hs25 b111
anoll
parents: 12324
diff changeset
57 static long _time_counter; // Virtual time used to periodically invoke sweeper
78da3894b86f 8027593: performance drop with constrained codecache starting with hs25 b111
anoll
parents: 12324
diff changeset
58 static long _last_sweep; // Value of _time_counter when the last sweep happened
78da3894b86f 8027593: performance drop with constrained codecache starting with hs25 b111
anoll
parents: 12324
diff changeset
59 static nmethod* _current; // Current nmethod
78da3894b86f 8027593: performance drop with constrained codecache starting with hs25 b111
anoll
parents: 12324
diff changeset
60 static int _seen; // Nof. nmethod we have currently processed in current pass of CodeCache
78da3894b86f 8027593: performance drop with constrained codecache starting with hs25 b111
anoll
parents: 12324
diff changeset
61 static int _flushed_count; // Nof. nmethods flushed in current sweep
78da3894b86f 8027593: performance drop with constrained codecache starting with hs25 b111
anoll
parents: 12324
diff changeset
62 static int _zombified_count; // Nof. nmethods made zombie in current sweep
78da3894b86f 8027593: performance drop with constrained codecache starting with hs25 b111
anoll
parents: 12324
diff changeset
63 static int _marked_for_reclamation_count; // Nof. nmethods marked for reclaim in current sweep
1644
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1615
diff changeset
64
13074
78da3894b86f 8027593: performance drop with constrained codecache starting with hs25 b111
anoll
parents: 12324
diff changeset
65 static volatile int _sweep_fractions_left; // Nof. invocations left until we are completed with this pass
78da3894b86f 8027593: performance drop with constrained codecache starting with hs25 b111
anoll
parents: 12324
diff changeset
66 static volatile int _sweep_started; // Flag to control conc sweeper
78da3894b86f 8027593: performance drop with constrained codecache starting with hs25 b111
anoll
parents: 12324
diff changeset
67 static volatile bool _should_sweep; // Indicates if we should invoke the sweeper
78da3894b86f 8027593: performance drop with constrained codecache starting with hs25 b111
anoll
parents: 12324
diff changeset
68 static volatile int _bytes_changed; // Counts the total nmethod size if the nmethod changed from:
78da3894b86f 8027593: performance drop with constrained codecache starting with hs25 b111
anoll
parents: 12324
diff changeset
69 // 1) alive -> not_entrant
78da3894b86f 8027593: performance drop with constrained codecache starting with hs25 b111
anoll
parents: 12324
diff changeset
70 // 2) not_entrant -> zombie
78da3894b86f 8027593: performance drop with constrained codecache starting with hs25 b111
anoll
parents: 12324
diff changeset
71 // 3) zombie -> marked_for_reclamation
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10206
diff changeset
72 // Stat counters
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10206
diff changeset
73 static int _total_nof_methods_reclaimed; // Accumulated nof methods flushed
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10206
diff changeset
74 static jlong _total_time_sweeping; // Accumulated time sweeping
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10206
diff changeset
75 static jlong _total_time_this_sweep; // Total time this sweep
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10206
diff changeset
76 static jlong _peak_sweep_time; // Peak time for a full sweep
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10206
diff changeset
77 static jlong _peak_sweep_fraction_time; // Peak time sweeping one fraction
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10206
diff changeset
78
12324
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12080
diff changeset
79 static int process_nmethod(nmethod *nm);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 3384
diff changeset
80 static void release_nmethod(nmethod* nm);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 3384
diff changeset
81
10206
0cfa93c2fcc4 8012547: Code cache flushing can get stuck reclaming of memory
neliasso
parents: 6725
diff changeset
82 static bool sweep_in_progress();
12324
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12080
diff changeset
83 static void sweep_code_cache();
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12080
diff changeset
84
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12080
diff changeset
85 static int _hotness_counter_reset_val;
1644
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1615
diff changeset
86
0
a61af66fc99e Initial load
duke
parents:
diff changeset
87 public:
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10206
diff changeset
88 static long traversal_count() { return _traversals; }
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10206
diff changeset
89 static int total_nof_methods_reclaimed() { return _total_nof_methods_reclaimed; }
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10206
diff changeset
90 static jlong total_time_sweeping() { return _total_time_sweeping; }
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10206
diff changeset
91 static jlong peak_sweep_time() { return _peak_sweep_time; }
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10206
diff changeset
92 static jlong peak_sweep_fraction_time() { return _peak_sweep_fraction_time; }
12324
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12080
diff changeset
93 static void log_sweep(const char* msg, const char* format = NULL, ...);
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12080
diff changeset
94
0
a61af66fc99e Initial load
duke
parents:
diff changeset
95
3384
f52ed367b66d 6996747: SIGSEGV in nmethod::cleanup_inline_caches / CompiledIC::verify
never
parents: 1972
diff changeset
96 #ifdef ASSERT
12080
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 10405
diff changeset
97 static bool is_sweeping(nmethod* which) { return _current == which; }
3384
f52ed367b66d 6996747: SIGSEGV in nmethod::cleanup_inline_caches / CompiledIC::verify
never
parents: 1972
diff changeset
98 // Keep track of sweeper activity in the ring buffer
f52ed367b66d 6996747: SIGSEGV in nmethod::cleanup_inline_caches / CompiledIC::verify
never
parents: 1972
diff changeset
99 static void record_sweep(nmethod* nm, int line);
f52ed367b66d 6996747: SIGSEGV in nmethod::cleanup_inline_caches / CompiledIC::verify
never
parents: 1972
diff changeset
100 static void report_events(int id, address entry);
f52ed367b66d 6996747: SIGSEGV in nmethod::cleanup_inline_caches / CompiledIC::verify
never
parents: 1972
diff changeset
101 static void report_events();
f52ed367b66d 6996747: SIGSEGV in nmethod::cleanup_inline_caches / CompiledIC::verify
never
parents: 1972
diff changeset
102 #endif
f52ed367b66d 6996747: SIGSEGV in nmethod::cleanup_inline_caches / CompiledIC::verify
never
parents: 1972
diff changeset
103
12324
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12080
diff changeset
104 static void mark_active_nmethods(); // Invoked at the end of each safepoint
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12080
diff changeset
105 static void possibly_sweep(); // Compiler threads call this to sweep
0
a61af66fc99e Initial load
duke
parents:
diff changeset
106
12324
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12080
diff changeset
107 static int sort_nmethods_by_hotness(nmethod** nm1, nmethod** nm2);
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12080
diff changeset
108 static int hotness_counter_reset_val();
13074
78da3894b86f 8027593: performance drop with constrained codecache starting with hs25 b111
anoll
parents: 12324
diff changeset
109 static void report_state_change(nmethod* nm);
78da3894b86f 8027593: performance drop with constrained codecache starting with hs25 b111
anoll
parents: 12324
diff changeset
110 static void possibly_enable_sweeper();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
111 };
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1644
diff changeset
112
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1644
diff changeset
113 #endif // SHARE_VM_RUNTIME_SWEEPER_HPP