comparison src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp @ 1836:894b1d7c7e01

6423256: GC stacks should use a better data structure 6942771: SEGV in ParScanThreadState::take_from_overflow_stack Reviewed-by: apetrusenko, ysr, pbk
author jcoomes
date Tue, 28 Sep 2010 15:56:15 -0700
parents 8b10f48633dc
children c99c53f07c14
comparison
equal deleted inserted replaced
1835:4805b9f4779e 1836:894b1d7c7e01
538 _span(cmsGen->reserved()._union(permGen->reserved())), 538 _span(cmsGen->reserved()._union(permGen->reserved())),
539 // Construct the is_alive_closure with _span & markBitMap 539 // Construct the is_alive_closure with _span & markBitMap
540 _is_alive_closure(_span, &_markBitMap), 540 _is_alive_closure(_span, &_markBitMap),
541 _restart_addr(NULL), 541 _restart_addr(NULL),
542 _overflow_list(NULL), 542 _overflow_list(NULL),
543 _preserved_oop_stack(NULL),
544 _preserved_mark_stack(NULL),
545 _stats(cmsGen), 543 _stats(cmsGen),
546 _eden_chunk_array(NULL), // may be set in ctor body 544 _eden_chunk_array(NULL), // may be set in ctor body
547 _eden_chunk_capacity(0), // -- ditto -- 545 _eden_chunk_capacity(0), // -- ditto --
548 _eden_chunk_index(0), // -- ditto -- 546 _eden_chunk_index(0), // -- ditto --
549 _survivor_plab_array(NULL), // -- ditto -- 547 _survivor_plab_array(NULL), // -- ditto --
8905 // the caller may be able to recover from a failure; code in 8903 // the caller may be able to recover from a failure; code in
8906 // the VM can then be changed, incrementally, to deal with such 8904 // the VM can then be changed, incrementally, to deal with such
8907 // failures where possible, thus, incrementally hardening the VM 8905 // failures where possible, thus, incrementally hardening the VM
8908 // in such low resource situations. 8906 // in such low resource situations.
8909 void CMSCollector::preserve_mark_work(oop p, markOop m) { 8907 void CMSCollector::preserve_mark_work(oop p, markOop m) {
8910 if (_preserved_oop_stack == NULL) { 8908 _preserved_oop_stack.push(p);
8911 assert(_preserved_mark_stack == NULL, 8909 _preserved_mark_stack.push(m);
8912 "bijection with preserved_oop_stack");
8913 // Allocate the stacks
8914 _preserved_oop_stack = new (ResourceObj::C_HEAP)
8915 GrowableArray<oop>(PreserveMarkStackSize, true);
8916 _preserved_mark_stack = new (ResourceObj::C_HEAP)
8917 GrowableArray<markOop>(PreserveMarkStackSize, true);
8918 if (_preserved_oop_stack == NULL || _preserved_mark_stack == NULL) {
8919 vm_exit_out_of_memory(2* PreserveMarkStackSize * sizeof(oop) /* punt */,
8920 "Preserved Mark/Oop Stack for CMS (C-heap)");
8921 }
8922 }
8923 _preserved_oop_stack->push(p);
8924 _preserved_mark_stack->push(m);
8925 assert(m == p->mark(), "Mark word changed"); 8910 assert(m == p->mark(), "Mark word changed");
8926 assert(_preserved_oop_stack->length() == _preserved_mark_stack->length(), 8911 assert(_preserved_oop_stack.size() == _preserved_mark_stack.size(),
8927 "bijection"); 8912 "bijection");
8928 } 8913 }
8929 8914
8930 // Single threaded 8915 // Single threaded
8931 void CMSCollector::preserve_mark_if_necessary(oop p) { 8916 void CMSCollector::preserve_mark_if_necessary(oop p) {
8963 // need for this in the future. Stack overflow should 8948 // need for this in the future. Stack overflow should
8964 // be so rare in practice and, when it happens, its 8949 // be so rare in practice and, when it happens, its
8965 // effect on performance so great that this will 8950 // effect on performance so great that this will
8966 // likely just be in the noise anyway. 8951 // likely just be in the noise anyway.
8967 void CMSCollector::restore_preserved_marks_if_any() { 8952 void CMSCollector::restore_preserved_marks_if_any() {
8968 if (_preserved_oop_stack == NULL) {
8969 assert(_preserved_mark_stack == NULL,
8970 "bijection with preserved_oop_stack");
8971 return;
8972 }
8973
8974 assert(SafepointSynchronize::is_at_safepoint(), 8953 assert(SafepointSynchronize::is_at_safepoint(),
8975 "world should be stopped"); 8954 "world should be stopped");
8976 assert(Thread::current()->is_ConcurrentGC_thread() || 8955 assert(Thread::current()->is_ConcurrentGC_thread() ||
8977 Thread::current()->is_VM_thread(), 8956 Thread::current()->is_VM_thread(),
8978 "should be single-threaded"); 8957 "should be single-threaded");
8979 8958 assert(_preserved_oop_stack.size() == _preserved_mark_stack.size(),
8980 int length = _preserved_oop_stack->length(); 8959 "bijection");
8981 assert(_preserved_mark_stack->length() == length, "bijection"); 8960
8982 for (int i = 0; i < length; i++) { 8961 while (!_preserved_oop_stack.is_empty()) {
8983 oop p = _preserved_oop_stack->at(i); 8962 oop p = _preserved_oop_stack.pop();
8984 assert(p->is_oop(), "Should be an oop"); 8963 assert(p->is_oop(), "Should be an oop");
8985 assert(_span.contains(p), "oop should be in _span"); 8964 assert(_span.contains(p), "oop should be in _span");
8986 assert(p->mark() == markOopDesc::prototype(), 8965 assert(p->mark() == markOopDesc::prototype(),
8987 "Set when taken from overflow list"); 8966 "Set when taken from overflow list");
8988 markOop m = _preserved_mark_stack->at(i); 8967 markOop m = _preserved_mark_stack.pop();
8989 p->set_mark(m); 8968 p->set_mark(m);
8990 } 8969 }
8991 _preserved_mark_stack->clear(); 8970 assert(_preserved_mark_stack.is_empty() && _preserved_oop_stack.is_empty(),
8992 _preserved_oop_stack->clear();
8993 assert(_preserved_mark_stack->is_empty() &&
8994 _preserved_oop_stack->is_empty(),
8995 "stacks were cleared above"); 8971 "stacks were cleared above");
8996 } 8972 }
8997 8973
8998 #ifndef PRODUCT 8974 #ifndef PRODUCT
8999 bool CMSCollector::no_preserved_marks() const { 8975 bool CMSCollector::no_preserved_marks() const {
9000 return ( ( _preserved_mark_stack == NULL 8976 return _preserved_mark_stack.is_empty() && _preserved_oop_stack.is_empty();
9001 && _preserved_oop_stack == NULL)
9002 || ( _preserved_mark_stack->is_empty()
9003 && _preserved_oop_stack->is_empty()));
9004 } 8977 }
9005 #endif 8978 #endif
9006 8979
9007 CMSAdaptiveSizePolicy* ASConcurrentMarkSweepGeneration::cms_size_policy() const 8980 CMSAdaptiveSizePolicy* ASConcurrentMarkSweepGeneration::cms_size_policy() const
9008 { 8981 {