comparison src/share/vm/gc_implementation/parallelScavenge/psPromotionManager.cpp @ 10405:f2110083203d

8005849: JEP 167: Event-Based JVM Tracing Reviewed-by: acorn, coleenp, sla Contributed-by: Karen Kinnear <karen.kinnear@oracle.com>, Bengt Rutisson <bengt.rutisson@oracle.com>, Calvin Cheung <calvin.cheung@oracle.com>, Erik Gahlin <erik.gahlin@oracle.com>, Erik Helin <erik.helin@oracle.com>, Jesper Wilhelmsson <jesper.wilhelmsson@oracle.com>, Keith McGuigan <keith.mcguigan@oracle.com>, Mattias Tobiasson <mattias.tobiasson@oracle.com>, Markus Gronlund <markus.gronlund@oracle.com>, Mikael Auno <mikael.auno@oracle.com>, Nils Eliasson <nils.eliasson@oracle.com>, Nils Loodin <nils.loodin@oracle.com>, Rickard Backman <rickard.backman@oracle.com>, Staffan Larsen <staffan.larsen@oracle.com>, Stefan Karlsson <stefan.karlsson@oracle.com>, Yekaterina Kantserova <yekaterina.kantserova@oracle.com>
author sla
date Mon, 10 Jun 2013 11:30:51 +0200
parents da91efe96a93
children 9766f73e770d
comparison
equal deleted inserted replaced
10404:d0add7016434 10405:f2110083203d
1 /* 1 /*
2 * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. 2 * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 * 4 *
5 * This code is free software; you can redistribute it and/or modify it 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 6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. 7 * published by the Free Software Foundation.
25 #include "precompiled.hpp" 25 #include "precompiled.hpp"
26 #include "gc_implementation/parallelScavenge/parallelScavengeHeap.hpp" 26 #include "gc_implementation/parallelScavenge/parallelScavengeHeap.hpp"
27 #include "gc_implementation/parallelScavenge/psOldGen.hpp" 27 #include "gc_implementation/parallelScavenge/psOldGen.hpp"
28 #include "gc_implementation/parallelScavenge/psPromotionManager.inline.hpp" 28 #include "gc_implementation/parallelScavenge/psPromotionManager.inline.hpp"
29 #include "gc_implementation/parallelScavenge/psScavenge.inline.hpp" 29 #include "gc_implementation/parallelScavenge/psScavenge.inline.hpp"
30 #include "gc_implementation/shared/gcTrace.hpp"
30 #include "gc_implementation/shared/mutableSpace.hpp" 31 #include "gc_implementation/shared/mutableSpace.hpp"
31 #include "memory/memRegion.hpp" 32 #include "memory/memRegion.hpp"
32 #include "oops/oop.inline.hpp" 33 #include "oops/oop.inline.hpp"
33 #include "oops/oop.psgc.inline.hpp" 34 #include "oops/oop.psgc.inline.hpp"
34 35
47 assert(_manager_array == NULL, "Attempt to initialize twice"); 48 assert(_manager_array == NULL, "Attempt to initialize twice");
48 _manager_array = NEW_C_HEAP_ARRAY(PSPromotionManager*, ParallelGCThreads+1, mtGC); 49 _manager_array = NEW_C_HEAP_ARRAY(PSPromotionManager*, ParallelGCThreads+1, mtGC);
49 guarantee(_manager_array != NULL, "Could not initialize promotion manager"); 50 guarantee(_manager_array != NULL, "Could not initialize promotion manager");
50 51
51 _stack_array_depth = new OopStarTaskQueueSet(ParallelGCThreads); 52 _stack_array_depth = new OopStarTaskQueueSet(ParallelGCThreads);
52 guarantee(_stack_array_depth != NULL, "Cound not initialize promotion manager"); 53 guarantee(_stack_array_depth != NULL, "Could not initialize promotion manager");
53 54
54 // Create and register the PSPromotionManager(s) for the worker threads. 55 // Create and register the PSPromotionManager(s) for the worker threads.
55 for(uint i=0; i<ParallelGCThreads; i++) { 56 for(uint i=0; i<ParallelGCThreads; i++) {
56 _manager_array[i] = new PSPromotionManager(); 57 _manager_array[i] = new PSPromotionManager();
57 guarantee(_manager_array[i] != NULL, "Could not create PSPromotionManager"); 58 guarantee(_manager_array[i] != NULL, "Could not create PSPromotionManager");
84 for(uint i=0; i<ParallelGCThreads+1; i++) { 85 for(uint i=0; i<ParallelGCThreads+1; i++) {
85 manager_array(i)->reset(); 86 manager_array(i)->reset();
86 } 87 }
87 } 88 }
88 89
89 void PSPromotionManager::post_scavenge() { 90 bool PSPromotionManager::post_scavenge(YoungGCTracer& gc_tracer) {
91 bool promotion_failure_occurred = false;
92
90 TASKQUEUE_STATS_ONLY(if (PrintGCDetails && ParallelGCVerbose) print_stats()); 93 TASKQUEUE_STATS_ONLY(if (PrintGCDetails && ParallelGCVerbose) print_stats());
91 for (uint i = 0; i < ParallelGCThreads + 1; i++) { 94 for (uint i = 0; i < ParallelGCThreads + 1; i++) {
92 PSPromotionManager* manager = manager_array(i); 95 PSPromotionManager* manager = manager_array(i);
93 assert(manager->claimed_stack_depth()->is_empty(), "should be empty"); 96 assert(manager->claimed_stack_depth()->is_empty(), "should be empty");
97 if (manager->_promotion_failed_info.has_failed()) {
98 gc_tracer.report_promotion_failed(manager->_promotion_failed_info);
99 promotion_failure_occurred = true;
100 }
94 manager->flush_labs(); 101 manager->flush_labs();
95 } 102 }
103 return promotion_failure_occurred;
96 } 104 }
97 105
98 #if TASKQUEUE_STATS 106 #if TASKQUEUE_STATS
99 void 107 void
100 PSPromotionManager::print_taskqueue_stats(uint i) const { 108 PSPromotionManager::print_taskqueue_stats(uint i) const {
184 _young_gen_is_full = false; 192 _young_gen_is_full = false;
185 193
186 lab_base = old_gen()->object_space()->top(); 194 lab_base = old_gen()->object_space()->top();
187 _old_lab.initialize(MemRegion(lab_base, (size_t)0)); 195 _old_lab.initialize(MemRegion(lab_base, (size_t)0));
188 _old_gen_is_full = false; 196 _old_gen_is_full = false;
197
198 _promotion_failed_info.reset();
189 199
190 TASKQUEUE_STATS_ONLY(reset_stats()); 200 TASKQUEUE_STATS_ONLY(reset_stats());
191 } 201 }
192 202
193 203
303 // it. 313 // it.
304 if (obj->cas_forward_to(obj, obj_mark)) { 314 if (obj->cas_forward_to(obj, obj_mark)) {
305 // We won any races, we "own" this object. 315 // We won any races, we "own" this object.
306 assert(obj == obj->forwardee(), "Sanity"); 316 assert(obj == obj->forwardee(), "Sanity");
307 317
318 _promotion_failed_info.register_copy_failure(obj->size());
319
308 obj->push_contents(this); 320 obj->push_contents(this);
309 321
310 // Save the mark if needed 322 // Save the mark if needed
311 PSScavenge::oop_promotion_failed(obj, obj_mark); 323 PSScavenge::oop_promotion_failed(obj, obj_mark);
312 } else { 324 } else {