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 *
23 */
24
25 #include "precompiled.hpp"
26 #include "gc/shared/ageTable.hpp"
27 #include "gc/shared/collectedHeap.hpp"
28 #include "gc/shared/collectorPolicy.hpp"
29 #include "gc/shared/gcPolicyCounters.hpp"
30 #include "memory/resourceArea.hpp"
31 #include "logging/log.hpp"
32 #include "utilities/copy.hpp"
33
34 /* Copyright (c) 1992, 2015, Oracle and/or its affiliates, and Stanford University.
35 See the LICENSE file for license information. */
36
37 ageTable::ageTable(bool global) {
38
39 clear();
40
41 if (UsePerfData && global) {
42
43 ResourceMark rm;
44 EXCEPTION_MARK;
45
46 const char* agetable_ns = "generation.0.agetable";
47 const char* bytes_ns = PerfDataManager::name_space(agetable_ns, "bytes");
48
49 for(int age = 0; age < table_size; age ++) {
50 char age_name[10];
51 jio_snprintf(age_name, sizeof(age_name), "%2.2d", age);
52 const char* cname = PerfDataManager::counter_name(bytes_ns, age_name);
53 _perf_sizes[age] = PerfDataManager::create_variable(SUN_GC, cname,
54 PerfData::U_Bytes,
55 CHECK);
56 }
57
58 const char* cname = PerfDataManager::counter_name(agetable_ns, "size");
59 PerfDataManager::create_constant(SUN_GC, cname, PerfData::U_None,
60 table_size, CHECK);
61 }
62 }
63
64 void ageTable::clear() {
65 for (size_t* p = sizes; p < sizes + table_size; ++p) {
66 *p = 0;
67 }
68 }
69
70 void ageTable::merge(ageTable* subTable) {
71 for (int i = 0; i < table_size; i++) {
72 sizes[i]+= subTable->sizes[i];
73 }
74 }
75
76 uint ageTable::compute_tenuring_threshold(size_t survivor_capacity, GCPolicyCounters* gc_counters) {
77 size_t desired_survivor_size = (size_t)((((double) survivor_capacity)*TargetSurvivorRatio)/100);
78 uint result;
79
80 if (AlwaysTenure || NeverTenure) {
81 assert(MaxTenuringThreshold == 0 || MaxTenuringThreshold == markOopDesc::max_age + 1,
82 "MaxTenuringThreshold should be 0 or markOopDesc::max_age + 1, but is " UINTX_FORMAT, MaxTenuringThreshold);
83 result = MaxTenuringThreshold;
84 } else {
85 size_t total = 0;
86 uint age = 1;
87 assert(sizes[0] == 0, "no objects with age zero should be recorded");
|
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 *
23 */
24
25 #include "precompiled.hpp"
26 #include "gc/shared/ageTable.hpp"
27 #include "gc/shared/collectedHeap.hpp"
28 #include "gc/shared/collectorPolicy.hpp"
29 #include "gc/shared/gcPolicyCounters.hpp"
30 #include "memory/resourceArea.hpp"
31 #include "logging/log.hpp"
32 #include "oops/oop.inline.hpp"
33 #include "utilities/copy.hpp"
34
35 /* Copyright (c) 1992, 2015, Oracle and/or its affiliates, and Stanford University.
36 See the LICENSE file for license information. */
37
38 ageTable::ageTable(bool global) {
39
40 clear();
41
42 if (UsePerfData && global) {
43
44 ResourceMark rm;
45 EXCEPTION_MARK;
46
47 const char* agetable_ns = "generation.0.agetable";
48 const char* bytes_ns = PerfDataManager::name_space(agetable_ns, "bytes");
49
50 for(int age = 0; age < table_size; age ++) {
51 char age_name[10];
52 jio_snprintf(age_name, sizeof(age_name), "%2.2d", age);
53 const char* cname = PerfDataManager::counter_name(bytes_ns, age_name);
54 _perf_sizes[age] = PerfDataManager::create_variable(SUN_GC, cname,
55 PerfData::U_Bytes,
56 CHECK);
57 }
58
59 const char* cname = PerfDataManager::counter_name(agetable_ns, "size");
60 PerfDataManager::create_constant(SUN_GC, cname, PerfData::U_None,
61 table_size, CHECK);
62 }
63 }
64
65 void ageTable::clear() {
66 for (size_t* p = sizes; p < sizes + table_size; ++p) {
67 *p = 0;
68 }
69 }
70
71 // add entry
72 void ageTable::add(oop p, size_t oop_size) {
73 add(p->age(), oop_size);
74 }
75
76 void ageTable::merge(ageTable* subTable) {
77 for (int i = 0; i < table_size; i++) {
78 sizes[i]+= subTable->sizes[i];
79 }
80 }
81
82 uint ageTable::compute_tenuring_threshold(size_t survivor_capacity, GCPolicyCounters* gc_counters) {
83 size_t desired_survivor_size = (size_t)((((double) survivor_capacity)*TargetSurvivorRatio)/100);
84 uint result;
85
86 if (AlwaysTenure || NeverTenure) {
87 assert(MaxTenuringThreshold == 0 || MaxTenuringThreshold == markOopDesc::max_age + 1,
88 "MaxTenuringThreshold should be 0 or markOopDesc::max_age + 1, but is " UINTX_FORMAT, MaxTenuringThreshold);
89 result = MaxTenuringThreshold;
90 } else {
91 size_t total = 0;
92 uint age = 1;
93 assert(sizes[0] == 0, "no objects with age zero should be recorded");
|