1 /*
2 * Copyright (c) 2001, 2018, 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 *
620 // Support for parallelizing survivor space rescan
621 if ((CMSParallelRemarkEnabled && CMSParallelSurvivorRemarkEnabled) || CMSParallelInitialMarkEnabled) {
622 const size_t max_plab_samples =
623 _young_gen->max_survivor_size() / (PLAB::min_size() * HeapWordSize);
624
625 _survivor_plab_array = NEW_C_HEAP_ARRAY(ChunkArray, ParallelGCThreads, mtGC);
626 _survivor_chunk_array = NEW_C_HEAP_ARRAY(HeapWord*, max_plab_samples, mtGC);
627 _cursor = NEW_C_HEAP_ARRAY(size_t, ParallelGCThreads, mtGC);
628 _survivor_chunk_capacity = max_plab_samples;
629 for (uint i = 0; i < ParallelGCThreads; i++) {
630 HeapWord** vec = NEW_C_HEAP_ARRAY(HeapWord*, max_plab_samples, mtGC);
631 ChunkArray* cur = ::new (&_survivor_plab_array[i]) ChunkArray(vec, max_plab_samples);
632 assert(cur->end() == 0, "Should be 0");
633 assert(cur->array() == vec, "Should be vec");
634 assert(cur->capacity() == max_plab_samples, "Error");
635 }
636 }
637
638 NOT_PRODUCT(_overflow_counter = CMSMarkStackOverflowInterval;)
639 _gc_counters = new CollectorCounters("CMS", 1);
640 _cgc_counters = new CollectorCounters("CMS stop-the-world phases", 2);
641 _completed_initialization = true;
642 _inter_sweep_timer.start(); // start of time
643 }
644
645 const char* ConcurrentMarkSweepGeneration::name() const {
646 return "concurrent mark-sweep generation";
647 }
648 void ConcurrentMarkSweepGeneration::update_counters() {
649 if (UsePerfData) {
650 _space_counters->update_all();
651 _gen_counters->update_all();
652 }
653 }
654
655 // this is an optimized version of update_counters(). it takes the
656 // used value as a parameter rather than computing it.
657 //
658 void ConcurrentMarkSweepGeneration::update_counters(size_t used) {
659 if (UsePerfData) {
660 _space_counters->update_used(used);
|
1 /*
2 * Copyright (c) 2001, 2019, 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 *
620 // Support for parallelizing survivor space rescan
621 if ((CMSParallelRemarkEnabled && CMSParallelSurvivorRemarkEnabled) || CMSParallelInitialMarkEnabled) {
622 const size_t max_plab_samples =
623 _young_gen->max_survivor_size() / (PLAB::min_size() * HeapWordSize);
624
625 _survivor_plab_array = NEW_C_HEAP_ARRAY(ChunkArray, ParallelGCThreads, mtGC);
626 _survivor_chunk_array = NEW_C_HEAP_ARRAY(HeapWord*, max_plab_samples, mtGC);
627 _cursor = NEW_C_HEAP_ARRAY(size_t, ParallelGCThreads, mtGC);
628 _survivor_chunk_capacity = max_plab_samples;
629 for (uint i = 0; i < ParallelGCThreads; i++) {
630 HeapWord** vec = NEW_C_HEAP_ARRAY(HeapWord*, max_plab_samples, mtGC);
631 ChunkArray* cur = ::new (&_survivor_plab_array[i]) ChunkArray(vec, max_plab_samples);
632 assert(cur->end() == 0, "Should be 0");
633 assert(cur->array() == vec, "Should be vec");
634 assert(cur->capacity() == max_plab_samples, "Error");
635 }
636 }
637
638 NOT_PRODUCT(_overflow_counter = CMSMarkStackOverflowInterval;)
639 _gc_counters = new CollectorCounters("CMS", 1);
640 _cgc_counters = new CollectorCounters("CMS concurrent cycle pauses", 2);
641 _completed_initialization = true;
642 _inter_sweep_timer.start(); // start of time
643 }
644
645 const char* ConcurrentMarkSweepGeneration::name() const {
646 return "concurrent mark-sweep generation";
647 }
648 void ConcurrentMarkSweepGeneration::update_counters() {
649 if (UsePerfData) {
650 _space_counters->update_all();
651 _gen_counters->update_all();
652 }
653 }
654
655 // this is an optimized version of update_counters(). it takes the
656 // used value as a parameter rather than computing it.
657 //
658 void ConcurrentMarkSweepGeneration::update_counters(size_t used) {
659 if (UsePerfData) {
660 _space_counters->update_used(used);
|