hotspot/src/share/vm/runtime/sweeper.hpp
changeset 21575 6a9645992cee
parent 20290 2127dc70bce9
child 21767 41eaa9a17059
equal deleted inserted replaced
21574:d47713227456 21575:6a9645992cee
    51 //     nmethod's space is freed. Sweeping is currently done by compiler threads between
    51 //     nmethod's space is freed. Sweeping is currently done by compiler threads between
    52 //     compilations or at least each 5 sec (NmethodSweepCheckInterval) when the code cache
    52 //     compilations or at least each 5 sec (NmethodSweepCheckInterval) when the code cache
    53 //     is full.
    53 //     is full.
    54 
    54 
    55 class NMethodSweeper : public AllStatic {
    55 class NMethodSweeper : public AllStatic {
    56   static long      _traversals;      // Stack scan count, also sweep ID.
    56   static long      _traversals;                   // Stack scan count, also sweep ID.
    57   static nmethod*  _current;         // Current nmethod
    57   static long      _time_counter;                 // Virtual time used to periodically invoke sweeper
    58   static int       _seen;            // Nof. nmethod we have currently processed in current pass of CodeCache
    58   static long      _last_sweep;                   // Value of _time_counter when the last sweep happened
    59   static int       _flushed_count;   // Nof. nmethods flushed in current sweep
    59   static nmethod*  _current;                      // Current nmethod
    60   static int       _zombified_count; // Nof. nmethods made zombie in current sweep
    60   static int       _seen;                         // Nof. nmethod we have currently processed in current pass of CodeCache
    61   static int       _marked_count;    // Nof. nmethods marked for reclaim in current sweep
    61   static int       _flushed_count;                // Nof. nmethods flushed in current sweep
       
    62   static int       _zombified_count;              // Nof. nmethods made zombie in current sweep
       
    63   static int       _marked_for_reclamation_count; // Nof. nmethods marked for reclaim in current sweep
    62 
    64 
    63   static volatile int  _invocations;   // No. of invocations left until we are completed with this pass
    65   static volatile int  _sweep_fractions_left;     // Nof. invocations left until we are completed with this pass
    64   static volatile int  _sweep_started; // Flag to control conc sweeper
    66   static volatile int  _sweep_started;            // Flag to control conc sweeper
    65 
    67   static volatile bool _should_sweep;             // Indicates if we should invoke the sweeper
    66   //The following are reset in mark_active_nmethods and synchronized by the safepoint
    68   static volatile int _bytes_changed;             // Counts the total nmethod size if the nmethod changed from:
    67   static bool      _request_mark_phase;        // Indicates that a change has happend and we need another mark pahse,
    69                                                   //   1) alive       -> not_entrant
    68                                                // always checked and reset at a safepoint so memory will be in sync.
    70                                                   //   2) not_entrant -> zombie
    69   static int       _locked_seen;               // Number of locked nmethods encountered during the scan
    71                                                   //   3) zombie      -> marked_for_reclamation
    70   static int       _not_entrant_seen_on_stack; // Number of not entrant nmethod were are still on stack
       
    71 
       
    72   // Stat counters
    72   // Stat counters
    73   static int       _total_nof_methods_reclaimed;  // Accumulated nof methods flushed
    73   static int       _total_nof_methods_reclaimed;  // Accumulated nof methods flushed
    74   static jlong     _total_time_sweeping;          // Accumulated time sweeping
    74   static jlong     _total_time_sweeping;          // Accumulated time sweeping
    75   static jlong     _total_time_this_sweep;        // Total time this sweep
    75   static jlong     _total_time_this_sweep;        // Total time this sweep
    76   static jlong     _peak_sweep_time;              // Peak time for a full sweep
    76   static jlong     _peak_sweep_time;              // Peak time for a full sweep
    79   static int  process_nmethod(nmethod *nm);
    79   static int  process_nmethod(nmethod *nm);
    80   static void release_nmethod(nmethod* nm);
    80   static void release_nmethod(nmethod* nm);
    81 
    81 
    82   static bool sweep_in_progress();
    82   static bool sweep_in_progress();
    83   static void sweep_code_cache();
    83   static void sweep_code_cache();
    84   static void request_nmethod_marking() { _request_mark_phase = true; }
       
    85   static void reset_nmethod_marking()   { _request_mark_phase = false; }
       
    86   static bool need_marking_phase()      { return _request_mark_phase; }
       
    87 
    84 
    88   static int _hotness_counter_reset_val;
    85   static int _hotness_counter_reset_val;
    89 
    86 
    90  public:
    87  public:
    91   static long traversal_count()              { return _traversals; }
    88   static long traversal_count()              { return _traversals; }
   107   static void mark_active_nmethods();      // Invoked at the end of each safepoint
   104   static void mark_active_nmethods();      // Invoked at the end of each safepoint
   108   static void possibly_sweep();            // Compiler threads call this to sweep
   105   static void possibly_sweep();            // Compiler threads call this to sweep
   109 
   106 
   110   static int sort_nmethods_by_hotness(nmethod** nm1, nmethod** nm2);
   107   static int sort_nmethods_by_hotness(nmethod** nm1, nmethod** nm2);
   111   static int hotness_counter_reset_val();
   108   static int hotness_counter_reset_val();
   112 
   109   static void report_state_change(nmethod* nm);
   113   static void notify() {
   110   static void possibly_enable_sweeper();
   114     // Request a new sweep of the code cache from the beginning. No
       
   115     // need to synchronize the setting of this flag since it only
       
   116     // changes to false at safepoint so we can never overwrite it with false.
       
   117      request_nmethod_marking();
       
   118   }
       
   119 };
   111 };
   120 
   112 
   121 #endif // SHARE_VM_RUNTIME_SWEEPER_HPP
   113 #endif // SHARE_VM_RUNTIME_SWEEPER_HPP