Mercurial > hg > truffle
comparison src/share/vm/runtime/sweeper.hpp @ 18058:54bc75c144b0
Merge
author | asaha |
---|---|
date | Thu, 29 May 2014 13:14:25 -0700 |
parents | 78bbf4d43a14 |
children | 52b4284cb496 |
comparison
equal
deleted
inserted
replaced
18055:1fa005fb28f5 | 18058:54bc75c144b0 |
---|---|
1 /* | 1 /* |
2 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. | 2 * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | 4 * |
5 * This code is free software; you can redistribute it and/or modify it | 5 * This code is free software; you can redistribute it and/or modify it |
6 * under the terms of the GNU General Public License version 2 only, as | 6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
52 // nmethod's space is freed. Sweeping is currently done by compiler threads between | 52 // nmethod's space is freed. Sweeping is currently done by compiler threads between |
53 // compilations or at least each 5 sec (NmethodSweepCheckInterval) when the code cache | 53 // compilations or at least each 5 sec (NmethodSweepCheckInterval) when the code cache |
54 // is full. | 54 // is full. |
55 | 55 |
56 class NMethodSweeper : public AllStatic { | 56 class NMethodSweeper : public AllStatic { |
57 static long _traversals; // Stack scan count, also sweep ID. | 57 static long _traversals; // Stack scan count, also sweep ID. |
58 static long _time_counter; // Virtual time used to periodically invoke sweeper | 58 static long _total_nof_code_cache_sweeps; // Total number of full sweeps of the code cache |
59 static long _last_sweep; // Value of _time_counter when the last sweep happened | 59 static long _time_counter; // Virtual time used to periodically invoke sweeper |
60 static nmethod* _current; // Current nmethod | 60 static long _last_sweep; // Value of _time_counter when the last sweep happened |
61 static int _seen; // Nof. nmethod we have currently processed in current pass of CodeCache | 61 static nmethod* _current; // Current nmethod |
62 static int _flushed_count; // Nof. nmethods flushed in current sweep | 62 static int _seen; // Nof. nmethod we have currently processed in current pass of CodeCache |
63 static int _zombified_count; // Nof. nmethods made zombie in current sweep | 63 static int _flushed_count; // Nof. nmethods flushed in current sweep |
64 static int _marked_for_reclamation_count; // Nof. nmethods marked for reclaim in current sweep | 64 static int _zombified_count; // Nof. nmethods made zombie in current sweep |
65 static int _marked_for_reclamation_count; // Nof. nmethods marked for reclaim in current sweep | |
65 | 66 |
66 static volatile int _sweep_fractions_left; // Nof. invocations left until we are completed with this pass | 67 static volatile int _sweep_fractions_left; // Nof. invocations left until we are completed with this pass |
67 static volatile int _sweep_started; // Flag to control conc sweeper | 68 static volatile int _sweep_started; // Flag to control conc sweeper |
68 static volatile bool _should_sweep; // Indicates if we should invoke the sweeper | 69 static volatile bool _should_sweep; // Indicates if we should invoke the sweeper |
69 static volatile int _bytes_changed; // Counts the total nmethod size if the nmethod changed from: | 70 static volatile int _bytes_changed; // Counts the total nmethod size if the nmethod changed from: |
70 // 1) alive -> not_entrant | 71 // 1) alive -> not_entrant |
71 // 2) not_entrant -> zombie | 72 // 2) not_entrant -> zombie |
72 // 3) zombie -> marked_for_reclamation | 73 // 3) zombie -> marked_for_reclamation |
73 // Stat counters | 74 // Stat counters |
74 static int _total_nof_methods_reclaimed; // Accumulated nof methods flushed | 75 static long _total_nof_methods_reclaimed; // Accumulated nof methods flushed |
75 static Tickspan _total_time_sweeping; // Accumulated time sweeping | 76 static long _total_nof_c2_methods_reclaimed; // Accumulated nof C2-compiled methods flushed |
76 static Tickspan _total_time_this_sweep; // Total time this sweep | 77 static size_t _total_flushed_size; // Total size of flushed methods |
77 static Tickspan _peak_sweep_time; // Peak time for a full sweep | 78 static int _hotness_counter_reset_val; |
78 static Tickspan _peak_sweep_fraction_time; // Peak time sweeping one fraction | 79 |
80 static Tickspan _total_time_sweeping; // Accumulated time sweeping | |
81 static Tickspan _total_time_this_sweep; // Total time this sweep | |
82 static Tickspan _peak_sweep_time; // Peak time for a full sweep | |
83 static Tickspan _peak_sweep_fraction_time; // Peak time sweeping one fraction | |
79 | 84 |
80 static int process_nmethod(nmethod *nm); | 85 static int process_nmethod(nmethod *nm); |
81 static void release_nmethod(nmethod* nm); | 86 static void release_nmethod(nmethod* nm); |
82 | 87 |
83 static bool sweep_in_progress(); | 88 static bool sweep_in_progress(); |
84 static void sweep_code_cache(); | 89 static void sweep_code_cache(); |
85 | 90 |
86 static int _hotness_counter_reset_val; | |
87 | |
88 public: | 91 public: |
89 static long traversal_count() { return _traversals; } | 92 static long traversal_count() { return _traversals; } |
90 static int total_nof_methods_reclaimed() { return _total_nof_methods_reclaimed; } | 93 static int total_nof_methods_reclaimed() { return _total_nof_methods_reclaimed; } |
91 static const Tickspan total_time_sweeping() { return _total_time_sweeping; } | 94 static const Tickspan total_time_sweeping() { return _total_time_sweeping; } |
92 static const Tickspan peak_sweep_time() { return _peak_sweep_time; } | 95 static const Tickspan peak_sweep_time() { return _peak_sweep_time; } |
93 static const Tickspan peak_sweep_fraction_time() { return _peak_sweep_fraction_time; } | 96 static const Tickspan peak_sweep_fraction_time() { return _peak_sweep_fraction_time; } |
94 static void log_sweep(const char* msg, const char* format = NULL, ...); | 97 static void log_sweep(const char* msg, const char* format = NULL, ...) ATTRIBUTE_PRINTF(2, 3); |
95 | 98 |
96 | 99 |
97 #ifdef ASSERT | 100 #ifdef ASSERT |
98 static bool is_sweeping(nmethod* which) { return _current == which; } | 101 static bool is_sweeping(nmethod* which) { return _current == which; } |
99 // Keep track of sweeper activity in the ring buffer | 102 // Keep track of sweeper activity in the ring buffer |
103 #endif | 106 #endif |
104 | 107 |
105 static void mark_active_nmethods(); // Invoked at the end of each safepoint | 108 static void mark_active_nmethods(); // Invoked at the end of each safepoint |
106 static void possibly_sweep(); // Compiler threads call this to sweep | 109 static void possibly_sweep(); // Compiler threads call this to sweep |
107 | 110 |
108 static int sort_nmethods_by_hotness(nmethod** nm1, nmethod** nm2); | |
109 static int hotness_counter_reset_val(); | 111 static int hotness_counter_reset_val(); |
110 static void report_state_change(nmethod* nm); | 112 static void report_state_change(nmethod* nm); |
111 static void possibly_enable_sweeper(); | 113 static void possibly_enable_sweeper(); |
114 static void print(); // Printing/debugging | |
112 }; | 115 }; |
113 | 116 |
114 #endif // SHARE_VM_RUNTIME_SWEEPER_HPP | 117 #endif // SHARE_VM_RUNTIME_SWEEPER_HPP |