953
954 class ShenandoahEvacuationTask : public AbstractGangTask {
955 private:
956 ShenandoahHeap* const _sh;
957 ShenandoahCollectionSet* const _cs;
958 bool _concurrent;
959 public:
960 ShenandoahEvacuationTask(ShenandoahHeap* sh,
961 ShenandoahCollectionSet* cs,
962 bool concurrent) :
963 AbstractGangTask("Parallel Evacuation Task"),
964 _sh(sh),
965 _cs(cs),
966 _concurrent(concurrent)
967 {}
968
969 void work(uint worker_id) {
970 if (_concurrent) {
971 ShenandoahConcurrentWorkerSession worker_session(worker_id);
972 ShenandoahSuspendibleThreadSetJoiner stsj(ShenandoahSuspendibleWorkers);
973 ShenandoahEvacOOMScope oom_evac_scope;
974 do_work();
975 } else {
976 ShenandoahParallelWorkerSession worker_session(worker_id);
977 ShenandoahEvacOOMScope oom_evac_scope;
978 do_work();
979 }
980 }
981
982 private:
983 void do_work() {
984 ShenandoahConcurrentEvacuateRegionObjectClosure cl(_sh);
985 ShenandoahHeapRegion* r;
986 while ((r =_cs->claim_next()) != NULL) {
987 assert(r->has_live(), "Region " SIZE_FORMAT " should have been reclaimed early", r->index());
988 _sh->marked_object_iterate(r, &cl);
989
990 if (ShenandoahPacing) {
991 _sh->pacer()->report_evac(r->used() >> LogHeapWordSize);
992 }
993
994 if (_sh->check_cancelled_gc_and_yield(_concurrent)) {
995 break;
996 }
997 }
3001 _memory_pool = new ShenandoahMemoryPool(this);
3002 _cycle_memory_manager.add_pool(_memory_pool);
3003 _stw_memory_manager.add_pool(_memory_pool);
3004 }
3005
3006 GrowableArray<GCMemoryManager*> ShenandoahHeap::memory_managers() {
3007 GrowableArray<GCMemoryManager*> memory_managers(2);
3008 memory_managers.append(&_cycle_memory_manager);
3009 memory_managers.append(&_stw_memory_manager);
3010 return memory_managers;
3011 }
3012
3013 GrowableArray<MemoryPool*> ShenandoahHeap::memory_pools() {
3014 GrowableArray<MemoryPool*> memory_pools(1);
3015 memory_pools.append(_memory_pool);
3016 return memory_pools;
3017 }
3018
3019 MemoryUsage ShenandoahHeap::memory_usage() {
3020 return _memory_pool->get_memory_usage();
3021 }
3022
3023 void ShenandoahHeap::enter_evacuation() {
3024 _oom_evac_handler.enter_evacuation();
3025 }
3026
3027 void ShenandoahHeap::leave_evacuation() {
3028 _oom_evac_handler.leave_evacuation();
3029 }
3030
3031 ShenandoahRegionIterator::ShenandoahRegionIterator() :
3032 _heap(ShenandoahHeap::heap()),
3033 _index(0) {}
3034
3035 ShenandoahRegionIterator::ShenandoahRegionIterator(ShenandoahHeap* heap) :
3036 _heap(heap),
3037 _index(0) {}
3038
3039 void ShenandoahRegionIterator::reset() {
3040 _index = 0;
3041 }
3042
3043 bool ShenandoahRegionIterator::has_next() const {
3044 return _index < _heap->num_regions();
3045 }
3046
3047 char ShenandoahHeap::gc_state() const {
3048 return _gc_state.raw_value();
|
953
954 class ShenandoahEvacuationTask : public AbstractGangTask {
955 private:
956 ShenandoahHeap* const _sh;
957 ShenandoahCollectionSet* const _cs;
958 bool _concurrent;
959 public:
960 ShenandoahEvacuationTask(ShenandoahHeap* sh,
961 ShenandoahCollectionSet* cs,
962 bool concurrent) :
963 AbstractGangTask("Parallel Evacuation Task"),
964 _sh(sh),
965 _cs(cs),
966 _concurrent(concurrent)
967 {}
968
969 void work(uint worker_id) {
970 if (_concurrent) {
971 ShenandoahConcurrentWorkerSession worker_session(worker_id);
972 ShenandoahSuspendibleThreadSetJoiner stsj(ShenandoahSuspendibleWorkers);
973 ShenandoahEvacOOMScope oom_evac_scope(_sh);
974 do_work();
975 } else {
976 ShenandoahParallelWorkerSession worker_session(worker_id);
977 ShenandoahEvacOOMScope oom_evac_scope(_sh);
978 do_work();
979 }
980 }
981
982 private:
983 void do_work() {
984 ShenandoahConcurrentEvacuateRegionObjectClosure cl(_sh);
985 ShenandoahHeapRegion* r;
986 while ((r =_cs->claim_next()) != NULL) {
987 assert(r->has_live(), "Region " SIZE_FORMAT " should have been reclaimed early", r->index());
988 _sh->marked_object_iterate(r, &cl);
989
990 if (ShenandoahPacing) {
991 _sh->pacer()->report_evac(r->used() >> LogHeapWordSize);
992 }
993
994 if (_sh->check_cancelled_gc_and_yield(_concurrent)) {
995 break;
996 }
997 }
3001 _memory_pool = new ShenandoahMemoryPool(this);
3002 _cycle_memory_manager.add_pool(_memory_pool);
3003 _stw_memory_manager.add_pool(_memory_pool);
3004 }
3005
3006 GrowableArray<GCMemoryManager*> ShenandoahHeap::memory_managers() {
3007 GrowableArray<GCMemoryManager*> memory_managers(2);
3008 memory_managers.append(&_cycle_memory_manager);
3009 memory_managers.append(&_stw_memory_manager);
3010 return memory_managers;
3011 }
3012
3013 GrowableArray<MemoryPool*> ShenandoahHeap::memory_pools() {
3014 GrowableArray<MemoryPool*> memory_pools(1);
3015 memory_pools.append(_memory_pool);
3016 return memory_pools;
3017 }
3018
3019 MemoryUsage ShenandoahHeap::memory_usage() {
3020 return _memory_pool->get_memory_usage();
3021 }
3022
3023 ShenandoahRegionIterator::ShenandoahRegionIterator() :
3024 _heap(ShenandoahHeap::heap()),
3025 _index(0) {}
3026
3027 ShenandoahRegionIterator::ShenandoahRegionIterator(ShenandoahHeap* heap) :
3028 _heap(heap),
3029 _index(0) {}
3030
3031 void ShenandoahRegionIterator::reset() {
3032 _index = 0;
3033 }
3034
3035 bool ShenandoahRegionIterator::has_next() const {
3036 return _index < _heap->num_regions();
3037 }
3038
3039 char ShenandoahHeap::gc_state() const {
3040 return _gc_state.raw_value();
|