< prev index next >

src/share/vm/gc/parallel/psCompactionManager.hpp

Print this page
rev 9846 : [mq]: par-scav-patch
rev 9847 : 8146987: Improve Parallel GC Full GC by caching results of live_words_in_range()
Summary: A large part of time in the parallel scavenge collector is spent finding out the amount of live words within memory ranges to find out where to move an object to. Try to incrementally calculate this value.
Reviewed-by: tschatzl, mgerdin
Contributed-by: ray alex <sky1young@gmail.com>
   1 /*
   2  * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   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
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *


  92   // stacks for use during compaction task stealing.  If a thread
  93   // gets a second draining task, it pushed its current region stack
  94   // index into the array _recycled_stack_index and gets a new
  95   // region stack from the task.  A thread that is executing a
  96   // compaction stealing task without ever having executing a
  97   // draining task, will get a region stack from _recycled_stack_index.
  98   //
  99   // Array of indexes into the array of region stacks.
 100   static uint*                    _recycled_stack_index;
 101   // The index into _recycled_stack_index of the last region stack index
 102   // pushed.  If -1, there are no entries into _recycled_stack_index.
 103   static int                      _recycled_top;
 104   // The index into _recycled_stack_index of the last region stack index
 105   // popped.  If -1, there has not been any entry popped.
 106   static int                      _recycled_bottom;
 107 
 108   static ParMarkBitMap* _mark_bitmap;
 109 
 110   Action _action;
 111 




 112   static PSOldGen* old_gen()             { return _old_gen; }
 113   static ObjectStartArray* start_array() { return _start_array; }
 114   static OopTaskQueueSet* stack_array()  { return _stack_array; }
 115 
 116   static void initialize(ParMarkBitMap* mbm);
 117 
 118  protected:
 119   // Array of tasks.  Needed by the ParallelTaskTerminator.
 120   static RegionTaskQueueSet* region_array()      { return _region_array; }
 121   OverflowTaskQueue<oop, mtGC>*  marking_stack()       { return &_marking_stack; }
 122 
 123   // Pushes onto the marking stack.  If the marking stack is full,
 124   // pushes onto the overflow stack.
 125   void stack_push(oop obj);
 126   // Do not implement an equivalent stack_pop.  Deal with the
 127   // marking stack and overflow stack directly.
 128 
 129  public:
 130   Action action() { return _action; }
 131   void set_action(Action v) { _action = v; }











 132 
 133   RegionTaskQueue* region_stack()                { return _region_stack; }
 134   void set_region_stack(RegionTaskQueue* v)       { _region_stack = v; }
 135 
 136   inline static ParCompactionManager* manager_array(uint index);
 137 
 138   inline static RegionTaskQueue* region_list(int index) {
 139     return _region_list[index];
 140   }
 141 
 142   uint region_stack_index() { return _region_stack_index; }
 143   void set_region_stack_index(uint v) { _region_stack_index = v; }
 144 
 145   // Pop and push unique reusable stack index
 146   static int pop_recycled_stack_index();
 147   static void push_recycled_stack_index(uint v);
 148   static void reset_recycled_stack_index() {
 149     _recycled_bottom = _recycled_top = -1;
 150   }
 151 


   1 /*
   2  * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   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
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *


  92   // stacks for use during compaction task stealing.  If a thread
  93   // gets a second draining task, it pushed its current region stack
  94   // index into the array _recycled_stack_index and gets a new
  95   // region stack from the task.  A thread that is executing a
  96   // compaction stealing task without ever having executing a
  97   // draining task, will get a region stack from _recycled_stack_index.
  98   //
  99   // Array of indexes into the array of region stacks.
 100   static uint*                    _recycled_stack_index;
 101   // The index into _recycled_stack_index of the last region stack index
 102   // pushed.  If -1, there are no entries into _recycled_stack_index.
 103   static int                      _recycled_top;
 104   // The index into _recycled_stack_index of the last region stack index
 105   // popped.  If -1, there has not been any entry popped.
 106   static int                      _recycled_bottom;
 107 
 108   static ParMarkBitMap* _mark_bitmap;
 109 
 110   Action _action;
 111 
 112   HeapWord* _last_query_beg;
 113   oop _last_query_obj;
 114   size_t _last_query_ret;
 115 
 116   static PSOldGen* old_gen()             { return _old_gen; }
 117   static ObjectStartArray* start_array() { return _start_array; }
 118   static OopTaskQueueSet* stack_array()  { return _stack_array; }
 119 
 120   static void initialize(ParMarkBitMap* mbm);
 121 
 122  protected:
 123   // Array of tasks.  Needed by the ParallelTaskTerminator.
 124   static RegionTaskQueueSet* region_array()      { return _region_array; }
 125   OverflowTaskQueue<oop, mtGC>*  marking_stack()       { return &_marking_stack; }
 126 
 127   // Pushes onto the marking stack.  If the marking stack is full,
 128   // pushes onto the overflow stack.
 129   void stack_push(oop obj);
 130   // Do not implement an equivalent stack_pop.  Deal with the
 131   // marking stack and overflow stack directly.
 132 
 133  public:
 134   Action action() { return _action; }
 135   void set_action(Action v) { _action = v; }
 136 
 137   // Bitmap query support, cache last query and result
 138   HeapWord* last_query_begin() { return _last_query_beg; }
 139   oop last_query_object() { return _last_query_obj; }
 140   size_t last_query_return() { return _last_query_ret; }
 141 
 142   void set_last_query_begin(HeapWord *new_beg) { _last_query_beg = new_beg; }
 143   void set_last_query_object(oop new_obj) { _last_query_obj = new_obj; }
 144   void set_last_query_return(size_t new_ret) { _last_query_ret = new_ret; }
 145 
 146   static void reset_cache_for_bitmap();
 147 
 148   RegionTaskQueue* region_stack()                { return _region_stack; }
 149   void set_region_stack(RegionTaskQueue* v)       { _region_stack = v; }
 150 
 151   inline static ParCompactionManager* manager_array(uint index);
 152 
 153   inline static RegionTaskQueue* region_list(int index) {
 154     return _region_list[index];
 155   }
 156 
 157   uint region_stack_index() { return _region_stack_index; }
 158   void set_region_stack_index(uint v) { _region_stack_index = v; }
 159 
 160   // Pop and push unique reusable stack index
 161   static int pop_recycled_stack_index();
 162   static void push_recycled_stack_index(uint v);
 163   static void reset_recycled_stack_index() {
 164     _recycled_bottom = _recycled_top = -1;
 165   }
 166 


< prev index next >