Merge
This commit is contained in:
commit
56b1d0c435
@ -8214,6 +8214,15 @@ void MacroAssembler::store_heap_oop(Address dst, Register src) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Used for storing NULLs.
|
||||||
|
void MacroAssembler::store_heap_oop_null(Address dst) {
|
||||||
|
if (UseCompressedOops) {
|
||||||
|
movl(dst, (int32_t)NULL_WORD);
|
||||||
|
} else {
|
||||||
|
movslq(dst, (int32_t)NULL_WORD);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Algorithm must match oop.inline.hpp encode_heap_oop.
|
// Algorithm must match oop.inline.hpp encode_heap_oop.
|
||||||
void MacroAssembler::encode_heap_oop(Register r) {
|
void MacroAssembler::encode_heap_oop(Register r) {
|
||||||
assert (UseCompressedOops, "should be compressed");
|
assert (UseCompressedOops, "should be compressed");
|
||||||
|
@ -1682,6 +1682,17 @@ class MacroAssembler: public Assembler {
|
|||||||
|
|
||||||
void load_heap_oop(Register dst, Address src);
|
void load_heap_oop(Register dst, Address src);
|
||||||
void store_heap_oop(Address dst, Register src);
|
void store_heap_oop(Address dst, Register src);
|
||||||
|
|
||||||
|
// This dummy is to prevent a call to store_heap_oop from
|
||||||
|
// converting a zero (like NULL) into a Register by giving
|
||||||
|
// the compiler two choices it can't resolve
|
||||||
|
|
||||||
|
void store_heap_oop(Address dst, void* dummy);
|
||||||
|
|
||||||
|
// Used for storing NULL. All other oop constants should be
|
||||||
|
// stored using routines that take a jobject.
|
||||||
|
void store_heap_oop_null(Address dst);
|
||||||
|
|
||||||
void encode_heap_oop(Register r);
|
void encode_heap_oop(Register r);
|
||||||
void decode_heap_oop(Register r);
|
void decode_heap_oop(Register r);
|
||||||
void encode_heap_oop_not_null(Register r);
|
void encode_heap_oop_not_null(Register r);
|
||||||
|
@ -139,7 +139,7 @@ static void do_oop_store(InterpreterMacroAssembler* _masm,
|
|||||||
}
|
}
|
||||||
__ g1_write_barrier_pre(rdx, r8, rbx, val != noreg);
|
__ g1_write_barrier_pre(rdx, r8, rbx, val != noreg);
|
||||||
if (val == noreg) {
|
if (val == noreg) {
|
||||||
__ store_heap_oop(Address(rdx, 0), NULL_WORD);
|
__ store_heap_oop_null(Address(rdx, 0));
|
||||||
} else {
|
} else {
|
||||||
__ store_heap_oop(Address(rdx, 0), val);
|
__ store_heap_oop(Address(rdx, 0), val);
|
||||||
__ g1_write_barrier_post(rdx, val, r8, rbx);
|
__ g1_write_barrier_post(rdx, val, r8, rbx);
|
||||||
@ -152,7 +152,7 @@ static void do_oop_store(InterpreterMacroAssembler* _masm,
|
|||||||
case BarrierSet::CardTableExtension:
|
case BarrierSet::CardTableExtension:
|
||||||
{
|
{
|
||||||
if (val == noreg) {
|
if (val == noreg) {
|
||||||
__ store_heap_oop(obj, NULL_WORD);
|
__ store_heap_oop_null(obj);
|
||||||
} else {
|
} else {
|
||||||
__ store_heap_oop(obj, val);
|
__ store_heap_oop(obj, val);
|
||||||
// flatten object address if needed
|
// flatten object address if needed
|
||||||
@ -168,7 +168,7 @@ static void do_oop_store(InterpreterMacroAssembler* _masm,
|
|||||||
case BarrierSet::ModRef:
|
case BarrierSet::ModRef:
|
||||||
case BarrierSet::Other:
|
case BarrierSet::Other:
|
||||||
if (val == noreg) {
|
if (val == noreg) {
|
||||||
__ store_heap_oop(obj, NULL_WORD);
|
__ store_heap_oop_null(obj);
|
||||||
} else {
|
} else {
|
||||||
__ store_heap_oop(obj, val);
|
__ store_heap_oop(obj, val);
|
||||||
}
|
}
|
||||||
|
@ -667,39 +667,6 @@ ConcurrentMark::~ConcurrentMark() {
|
|||||||
// Called at the first checkpoint.
|
// Called at the first checkpoint.
|
||||||
//
|
//
|
||||||
|
|
||||||
#define PRINT_REACHABLE_AT_INITIAL_MARK 0
|
|
||||||
#if PRINT_REACHABLE_AT_INITIAL_MARK
|
|
||||||
static FILE* reachable_file = NULL;
|
|
||||||
|
|
||||||
class PrintReachableClosure: public OopsInGenClosure {
|
|
||||||
CMBitMap* _bm;
|
|
||||||
int _level;
|
|
||||||
public:
|
|
||||||
PrintReachableClosure(CMBitMap* bm) :
|
|
||||||
_bm(bm), _level(0) {
|
|
||||||
guarantee(reachable_file != NULL, "pre-condition");
|
|
||||||
}
|
|
||||||
void do_oop(oop* p) {
|
|
||||||
oop obj = *p;
|
|
||||||
HeapWord* obj_addr = (HeapWord*)obj;
|
|
||||||
if (obj == NULL) return;
|
|
||||||
fprintf(reachable_file, "%d: "PTR_FORMAT" -> "PTR_FORMAT" (%d)\n",
|
|
||||||
_level, p, (void*) obj, _bm->isMarked(obj_addr));
|
|
||||||
if (!_bm->isMarked(obj_addr)) {
|
|
||||||
_bm->mark(obj_addr);
|
|
||||||
_level++;
|
|
||||||
obj->oop_iterate(this);
|
|
||||||
_level--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
#endif // PRINT_REACHABLE_AT_INITIAL_MARK
|
|
||||||
|
|
||||||
#define SEND_HEAP_DUMP_TO_FILE 0
|
|
||||||
#if SEND_HEAP_DUMP_TO_FILE
|
|
||||||
static FILE* heap_dump_file = NULL;
|
|
||||||
#endif // SEND_HEAP_DUMP_TO_FILE
|
|
||||||
|
|
||||||
void ConcurrentMark::clearNextBitmap() {
|
void ConcurrentMark::clearNextBitmap() {
|
||||||
guarantee(!G1CollectedHeap::heap()->mark_in_progress(), "Precondition.");
|
guarantee(!G1CollectedHeap::heap()->mark_in_progress(), "Precondition.");
|
||||||
|
|
||||||
@ -737,32 +704,9 @@ void ConcurrentMark::checkpointRootsInitialPre() {
|
|||||||
|
|
||||||
_has_aborted = false;
|
_has_aborted = false;
|
||||||
|
|
||||||
// Find all the reachable objects...
|
if (G1PrintReachableAtInitialMark) {
|
||||||
#if PRINT_REACHABLE_AT_INITIAL_MARK
|
print_reachable(true, "before");
|
||||||
guarantee(reachable_file == NULL, "Protocol");
|
}
|
||||||
char fn_buf[100];
|
|
||||||
sprintf(fn_buf, "/tmp/reachable.txt.%d", os::current_process_id());
|
|
||||||
reachable_file = fopen(fn_buf, "w");
|
|
||||||
// clear the mark bitmap (no grey objects to start with)
|
|
||||||
_nextMarkBitMap->clearAll();
|
|
||||||
PrintReachableClosure prcl(_nextMarkBitMap);
|
|
||||||
g1h->process_strong_roots(true, // activate StrongRootsScope
|
|
||||||
false, // fake perm gen collection
|
|
||||||
SharedHeap::SO_AllClasses,
|
|
||||||
&prcl, // Regular roots
|
|
||||||
NULL, // do not visit active blobs
|
|
||||||
&prcl // Perm Gen Roots
|
|
||||||
);
|
|
||||||
// The root iteration above "consumed" dirty cards in the perm gen.
|
|
||||||
// Therefore, as a shortcut, we dirty all such cards.
|
|
||||||
g1h->rem_set()->invalidate(g1h->perm_gen()->used_region(), false);
|
|
||||||
fclose(reachable_file);
|
|
||||||
reachable_file = NULL;
|
|
||||||
// clear the mark bitmap again.
|
|
||||||
_nextMarkBitMap->clearAll();
|
|
||||||
COMPILER2_PRESENT(DerivedPointerTable::update_pointers());
|
|
||||||
COMPILER2_PRESENT(DerivedPointerTable::clear());
|
|
||||||
#endif // PRINT_REACHABLE_AT_INITIAL_MARK
|
|
||||||
|
|
||||||
// Initialise marking structures. This has to be done in a STW phase.
|
// Initialise marking structures. This has to be done in a STW phase.
|
||||||
reset();
|
reset();
|
||||||
@ -1965,15 +1909,21 @@ void ConcurrentMark::checkpointRootsFinalWork() {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef PRODUCT
|
||||||
|
|
||||||
class ReachablePrinterOopClosure: public OopClosure {
|
class ReachablePrinterOopClosure: public OopClosure {
|
||||||
private:
|
private:
|
||||||
G1CollectedHeap* _g1h;
|
G1CollectedHeap* _g1h;
|
||||||
CMBitMapRO* _bitmap;
|
CMBitMapRO* _bitmap;
|
||||||
outputStream* _out;
|
outputStream* _out;
|
||||||
|
bool _use_prev_marking;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ReachablePrinterOopClosure(CMBitMapRO* bitmap, outputStream* out) :
|
ReachablePrinterOopClosure(CMBitMapRO* bitmap,
|
||||||
_bitmap(bitmap), _g1h(G1CollectedHeap::heap()), _out(out) { }
|
outputStream* out,
|
||||||
|
bool use_prev_marking) :
|
||||||
|
_g1h(G1CollectedHeap::heap()),
|
||||||
|
_bitmap(bitmap), _out(out), _use_prev_marking(use_prev_marking) { }
|
||||||
|
|
||||||
void do_oop(narrowOop* p) { do_oop_work(p); }
|
void do_oop(narrowOop* p) { do_oop_work(p); }
|
||||||
void do_oop( oop* p) { do_oop_work(p); }
|
void do_oop( oop* p) { do_oop_work(p); }
|
||||||
@ -1988,15 +1938,24 @@ public:
|
|||||||
else {
|
else {
|
||||||
HeapRegion* hr = _g1h->heap_region_containing(obj);
|
HeapRegion* hr = _g1h->heap_region_containing(obj);
|
||||||
guarantee(hr != NULL, "invariant");
|
guarantee(hr != NULL, "invariant");
|
||||||
if (hr->obj_allocated_since_prev_marking(obj)) {
|
bool over_tams = false;
|
||||||
|
if (_use_prev_marking) {
|
||||||
|
over_tams = hr->obj_allocated_since_prev_marking(obj);
|
||||||
|
} else {
|
||||||
|
over_tams = hr->obj_allocated_since_next_marking(obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (over_tams) {
|
||||||
str = "over TAMS";
|
str = "over TAMS";
|
||||||
if (_bitmap->isMarked((HeapWord*) obj))
|
if (_bitmap->isMarked((HeapWord*) obj)) {
|
||||||
str2 = " AND MARKED";
|
str2 = " AND MARKED";
|
||||||
} else if (_bitmap->isMarked((HeapWord*) obj))
|
}
|
||||||
|
} else if (_bitmap->isMarked((HeapWord*) obj)) {
|
||||||
str = "marked";
|
str = "marked";
|
||||||
else
|
} else {
|
||||||
str = "#### NOT MARKED ####";
|
str = "#### NOT MARKED ####";
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
_out->print_cr(" "PTR_FORMAT" contains "PTR_FORMAT" %s%s",
|
_out->print_cr(" "PTR_FORMAT" contains "PTR_FORMAT" %s%s",
|
||||||
p, (void*) obj, str, str2);
|
p, (void*) obj, str, str2);
|
||||||
@ -2007,14 +1966,17 @@ class ReachablePrinterClosure: public BitMapClosure {
|
|||||||
private:
|
private:
|
||||||
CMBitMapRO* _bitmap;
|
CMBitMapRO* _bitmap;
|
||||||
outputStream* _out;
|
outputStream* _out;
|
||||||
|
bool _use_prev_marking;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ReachablePrinterClosure(CMBitMapRO* bitmap, outputStream* out) :
|
ReachablePrinterClosure(CMBitMapRO* bitmap,
|
||||||
_bitmap(bitmap), _out(out) { }
|
outputStream* out,
|
||||||
|
bool use_prev_marking) :
|
||||||
|
_bitmap(bitmap), _out(out), _use_prev_marking(use_prev_marking) { }
|
||||||
|
|
||||||
bool do_bit(size_t offset) {
|
bool do_bit(size_t offset) {
|
||||||
HeapWord* addr = _bitmap->offsetToHeapWord(offset);
|
HeapWord* addr = _bitmap->offsetToHeapWord(offset);
|
||||||
ReachablePrinterOopClosure oopCl(_bitmap, _out);
|
ReachablePrinterOopClosure oopCl(_bitmap, _out, _use_prev_marking);
|
||||||
|
|
||||||
_out->print_cr(" obj "PTR_FORMAT", offset %10d (marked)", addr, offset);
|
_out->print_cr(" obj "PTR_FORMAT", offset %10d (marked)", addr, offset);
|
||||||
oop(addr)->oop_iterate(&oopCl);
|
oop(addr)->oop_iterate(&oopCl);
|
||||||
@ -2028,74 +1990,109 @@ class ObjInRegionReachablePrinterClosure : public ObjectClosure {
|
|||||||
private:
|
private:
|
||||||
CMBitMapRO* _bitmap;
|
CMBitMapRO* _bitmap;
|
||||||
outputStream* _out;
|
outputStream* _out;
|
||||||
|
bool _use_prev_marking;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
ObjInRegionReachablePrinterClosure(CMBitMapRO* bitmap,
|
||||||
|
outputStream* out,
|
||||||
|
bool use_prev_marking) :
|
||||||
|
_bitmap(bitmap), _out(out), _use_prev_marking(use_prev_marking) { }
|
||||||
|
|
||||||
void do_object(oop o) {
|
void do_object(oop o) {
|
||||||
ReachablePrinterOopClosure oopCl(_bitmap, _out);
|
ReachablePrinterOopClosure oopCl(_bitmap, _out, _use_prev_marking);
|
||||||
|
|
||||||
_out->print_cr(" obj "PTR_FORMAT" (over TAMS)", (void*) o);
|
_out->print_cr(" obj "PTR_FORMAT" (over TAMS)", (void*) o);
|
||||||
o->oop_iterate(&oopCl);
|
o->oop_iterate(&oopCl);
|
||||||
_out->print_cr("");
|
_out->print_cr("");
|
||||||
}
|
}
|
||||||
|
|
||||||
ObjInRegionReachablePrinterClosure(CMBitMapRO* bitmap, outputStream* out) :
|
|
||||||
_bitmap(bitmap), _out(out) { }
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class RegionReachablePrinterClosure : public HeapRegionClosure {
|
class RegionReachablePrinterClosure : public HeapRegionClosure {
|
||||||
private:
|
private:
|
||||||
CMBitMapRO* _bitmap;
|
CMBitMapRO* _bitmap;
|
||||||
outputStream* _out;
|
outputStream* _out;
|
||||||
|
bool _use_prev_marking;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
bool doHeapRegion(HeapRegion* hr) {
|
bool doHeapRegion(HeapRegion* hr) {
|
||||||
HeapWord* b = hr->bottom();
|
HeapWord* b = hr->bottom();
|
||||||
HeapWord* e = hr->end();
|
HeapWord* e = hr->end();
|
||||||
HeapWord* t = hr->top();
|
HeapWord* t = hr->top();
|
||||||
HeapWord* p = hr->prev_top_at_mark_start();
|
HeapWord* p = NULL;
|
||||||
|
if (_use_prev_marking) {
|
||||||
|
p = hr->prev_top_at_mark_start();
|
||||||
|
} else {
|
||||||
|
p = hr->next_top_at_mark_start();
|
||||||
|
}
|
||||||
_out->print_cr("** ["PTR_FORMAT", "PTR_FORMAT"] top: "PTR_FORMAT" "
|
_out->print_cr("** ["PTR_FORMAT", "PTR_FORMAT"] top: "PTR_FORMAT" "
|
||||||
"PTAMS: "PTR_FORMAT, b, e, t, p);
|
"TAMS: "PTR_FORMAT, b, e, t, p);
|
||||||
_out->print_cr("");
|
_out->print_cr("");
|
||||||
|
|
||||||
ObjInRegionReachablePrinterClosure ocl(_bitmap, _out);
|
ObjInRegionReachablePrinterClosure ocl(_bitmap, _out, _use_prev_marking);
|
||||||
hr->object_iterate_mem_careful(MemRegion(p, t), &ocl);
|
hr->object_iterate_mem_careful(MemRegion(p, t), &ocl);
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
RegionReachablePrinterClosure(CMBitMapRO* bitmap,
|
RegionReachablePrinterClosure(CMBitMapRO* bitmap,
|
||||||
outputStream* out) :
|
outputStream* out,
|
||||||
_bitmap(bitmap), _out(out) { }
|
bool use_prev_marking) :
|
||||||
|
_bitmap(bitmap), _out(out), _use_prev_marking(use_prev_marking) { }
|
||||||
};
|
};
|
||||||
|
|
||||||
void ConcurrentMark::print_prev_bitmap_reachable() {
|
void ConcurrentMark::print_reachable(bool use_prev_marking, const char* str) {
|
||||||
outputStream* out = gclog_or_tty;
|
gclog_or_tty->print_cr("== Doing reachable object dump... ");
|
||||||
|
|
||||||
#if SEND_HEAP_DUMP_TO_FILE
|
if (G1PrintReachableBaseFile == NULL) {
|
||||||
guarantee(heap_dump_file == NULL, "Protocol");
|
gclog_or_tty->print_cr(" #### error: no base file defined");
|
||||||
char fn_buf[100];
|
return;
|
||||||
sprintf(fn_buf, "/tmp/dump.txt.%d", os::current_process_id());
|
|
||||||
heap_dump_file = fopen(fn_buf, "w");
|
|
||||||
fileStream fstream(heap_dump_file);
|
|
||||||
out = &fstream;
|
|
||||||
#endif // SEND_HEAP_DUMP_TO_FILE
|
|
||||||
|
|
||||||
RegionReachablePrinterClosure rcl(_prevMarkBitMap, out);
|
|
||||||
out->print_cr("--- ITERATING OVER REGIONS WITH PTAMS < TOP");
|
|
||||||
_g1h->heap_region_iterate(&rcl);
|
|
||||||
out->print_cr("");
|
|
||||||
|
|
||||||
ReachablePrinterClosure cl(_prevMarkBitMap, out);
|
|
||||||
out->print_cr("--- REACHABLE OBJECTS ON THE BITMAP");
|
|
||||||
_prevMarkBitMap->iterate(&cl);
|
|
||||||
out->print_cr("");
|
|
||||||
|
|
||||||
#if SEND_HEAP_DUMP_TO_FILE
|
|
||||||
fclose(heap_dump_file);
|
|
||||||
heap_dump_file = NULL;
|
|
||||||
#endif // SEND_HEAP_DUMP_TO_FILE
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (strlen(G1PrintReachableBaseFile) + 1 + strlen(str) >
|
||||||
|
(JVM_MAXPATHLEN - 1)) {
|
||||||
|
gclog_or_tty->print_cr(" #### error: file name too long");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
char file_name[JVM_MAXPATHLEN];
|
||||||
|
sprintf(file_name, "%s.%s", G1PrintReachableBaseFile, str);
|
||||||
|
gclog_or_tty->print_cr(" dumping to file %s", file_name);
|
||||||
|
|
||||||
|
fileStream fout(file_name);
|
||||||
|
if (!fout.is_open()) {
|
||||||
|
gclog_or_tty->print_cr(" #### error: could not open file");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
outputStream* out = &fout;
|
||||||
|
|
||||||
|
CMBitMapRO* bitmap = NULL;
|
||||||
|
if (use_prev_marking) {
|
||||||
|
bitmap = _prevMarkBitMap;
|
||||||
|
} else {
|
||||||
|
bitmap = _nextMarkBitMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
out->print_cr("-- USING %s", (use_prev_marking) ? "PTAMS" : "NTAMS");
|
||||||
|
out->cr();
|
||||||
|
|
||||||
|
RegionReachablePrinterClosure rcl(bitmap, out, use_prev_marking);
|
||||||
|
out->print_cr("--- ITERATING OVER REGIONS WITH TAMS < TOP");
|
||||||
|
out->cr();
|
||||||
|
_g1h->heap_region_iterate(&rcl);
|
||||||
|
out->cr();
|
||||||
|
|
||||||
|
ReachablePrinterClosure cl(bitmap, out, use_prev_marking);
|
||||||
|
out->print_cr("--- ITERATING OVER MARKED OBJECTS ON THE BITMAP");
|
||||||
|
out->cr();
|
||||||
|
bitmap->iterate(&cl);
|
||||||
|
out->cr();
|
||||||
|
|
||||||
|
gclog_or_tty->print_cr(" done");
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // PRODUCT
|
||||||
|
|
||||||
// This note is for drainAllSATBBuffers and the code in between.
|
// This note is for drainAllSATBBuffers and the code in between.
|
||||||
// In the future we could reuse a task to do this work during an
|
// In the future we could reuse a task to do this work during an
|
||||||
// evacuation pause (since now tasks are not active and can be claimed
|
// evacuation pause (since now tasks are not active and can be claimed
|
||||||
|
@ -612,10 +612,11 @@ public:
|
|||||||
// we do nothing.
|
// we do nothing.
|
||||||
void markAndGrayObjectIfNecessary(oop p);
|
void markAndGrayObjectIfNecessary(oop p);
|
||||||
|
|
||||||
// This iterates over the bitmap of the previous marking and prints
|
// This iterates over the marking bitmap (either prev or next) and
|
||||||
// out all objects that are marked on the bitmap and indicates
|
// prints out all objects that are marked on the bitmap and indicates
|
||||||
// whether what they point to is also marked or not.
|
// whether what they point to is also marked or not. It also iterates
|
||||||
void print_prev_bitmap_reachable();
|
// the objects over TAMS (either prev or next).
|
||||||
|
void print_reachable(bool use_prev_marking, const char* str);
|
||||||
|
|
||||||
// Clear the next marking bitmap (will be called concurrently).
|
// Clear the next marking bitmap (will be called concurrently).
|
||||||
void clearNextBitmap();
|
void clearNextBitmap();
|
||||||
|
@ -2371,8 +2371,9 @@ void G1CollectedHeap::verify(bool allow_dirty,
|
|||||||
gclog_or_tty->print_cr("Heap:");
|
gclog_or_tty->print_cr("Heap:");
|
||||||
print_on(gclog_or_tty, true /* extended */);
|
print_on(gclog_or_tty, true /* extended */);
|
||||||
gclog_or_tty->print_cr("");
|
gclog_or_tty->print_cr("");
|
||||||
if (VerifyDuringGC && G1VerifyConcMarkPrintReachable) {
|
if (VerifyDuringGC && G1VerifyDuringGCPrintReachable) {
|
||||||
concurrent_mark()->print_prev_bitmap_reachable();
|
concurrent_mark()->print_reachable(use_prev_marking,
|
||||||
|
"failed-verification");
|
||||||
}
|
}
|
||||||
gclog_or_tty->flush();
|
gclog_or_tty->flush();
|
||||||
}
|
}
|
||||||
@ -3135,7 +3136,7 @@ void G1CollectedHeap::finalize_for_evac_failure() {
|
|||||||
_evac_failure_scan_stack->length() == 0,
|
_evac_failure_scan_stack->length() == 0,
|
||||||
"Postcondition");
|
"Postcondition");
|
||||||
assert(!_drain_in_progress, "Postcondition");
|
assert(!_drain_in_progress, "Postcondition");
|
||||||
// Don't have to delete, since the scan stack is a resource object.
|
delete _evac_failure_scan_stack;
|
||||||
_evac_failure_scan_stack = NULL;
|
_evac_failure_scan_stack = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1516,7 +1516,8 @@ void G1CollectorPolicy::record_collection_pause_end(bool abandoned) {
|
|||||||
(end_time_sec - _recent_prev_end_times_for_all_gcs_sec->oldest()) * 1000.0;
|
(end_time_sec - _recent_prev_end_times_for_all_gcs_sec->oldest()) * 1000.0;
|
||||||
update_recent_gc_times(end_time_sec, elapsed_ms);
|
update_recent_gc_times(end_time_sec, elapsed_ms);
|
||||||
_recent_avg_pause_time_ratio = _recent_gc_times_ms->sum()/interval_ms;
|
_recent_avg_pause_time_ratio = _recent_gc_times_ms->sum()/interval_ms;
|
||||||
assert(recent_avg_pause_time_ratio() < 1.00, "All GC?");
|
// using 1.01 to account for floating point inaccuracies
|
||||||
|
assert(recent_avg_pause_time_ratio() < 1.01, "All GC?");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (G1PolicyVerbose > 1) {
|
if (G1PolicyVerbose > 1) {
|
||||||
|
@ -55,8 +55,14 @@
|
|||||||
develop(intx, G1MarkingVerboseLevel, 0, \
|
develop(intx, G1MarkingVerboseLevel, 0, \
|
||||||
"Level (0-4) of verboseness of the marking code") \
|
"Level (0-4) of verboseness of the marking code") \
|
||||||
\
|
\
|
||||||
develop(bool, G1VerifyConcMarkPrintReachable, false, \
|
develop(bool, G1PrintReachableAtInitialMark, false, \
|
||||||
"If conc mark verification fails, print reachable objects") \
|
"Reachable object dump at the initial mark pause") \
|
||||||
|
\
|
||||||
|
develop(bool, G1VerifyDuringGCPrintReachable, false, \
|
||||||
|
"If conc mark verification fails, dump reachable objects") \
|
||||||
|
\
|
||||||
|
develop(ccstr, G1PrintReachableBaseFile, NULL, \
|
||||||
|
"The base file name for the reachable object dumps") \
|
||||||
\
|
\
|
||||||
develop(bool, G1TraceMarkStackOverflow, false, \
|
develop(bool, G1TraceMarkStackOverflow, false, \
|
||||||
"If true, extra debugging code for CM restart for ovflw.") \
|
"If true, extra debugging code for CM restart for ovflw.") \
|
||||||
|
@ -135,7 +135,6 @@ RSHashTable::RSHashTable(size_t capacity) :
|
|||||||
_occupied_entries(0), _occupied_cards(0),
|
_occupied_entries(0), _occupied_cards(0),
|
||||||
_entries(NEW_C_HEAP_ARRAY(SparsePRTEntry, capacity)),
|
_entries(NEW_C_HEAP_ARRAY(SparsePRTEntry, capacity)),
|
||||||
_buckets(NEW_C_HEAP_ARRAY(int, capacity)),
|
_buckets(NEW_C_HEAP_ARRAY(int, capacity)),
|
||||||
_next_deleted(NULL), _deleted(false),
|
|
||||||
_free_list(NullEntry), _free_region(0)
|
_free_list(NullEntry), _free_region(0)
|
||||||
{
|
{
|
||||||
clear();
|
clear();
|
||||||
@ -296,40 +295,6 @@ void RSHashTable::add_entry(SparsePRTEntry* e) {
|
|||||||
assert(e2->num_valid_cards() > 0, "Postcondition.");
|
assert(e2->num_valid_cards() > 0, "Postcondition.");
|
||||||
}
|
}
|
||||||
|
|
||||||
RSHashTable* RSHashTable::_head_deleted_list = NULL;
|
|
||||||
|
|
||||||
void RSHashTable::add_to_deleted_list(RSHashTable* rsht) {
|
|
||||||
assert(!rsht->deleted(), "Should delete only once.");
|
|
||||||
rsht->set_deleted(true);
|
|
||||||
RSHashTable* hd = _head_deleted_list;
|
|
||||||
while (true) {
|
|
||||||
rsht->_next_deleted = hd;
|
|
||||||
RSHashTable* res =
|
|
||||||
(RSHashTable*)
|
|
||||||
Atomic::cmpxchg_ptr(rsht, &_head_deleted_list, hd);
|
|
||||||
if (res == hd) return;
|
|
||||||
else hd = res;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
RSHashTable* RSHashTable::get_from_deleted_list() {
|
|
||||||
RSHashTable* hd = _head_deleted_list;
|
|
||||||
while (hd != NULL) {
|
|
||||||
RSHashTable* next = hd->next_deleted();
|
|
||||||
RSHashTable* res =
|
|
||||||
(RSHashTable*)
|
|
||||||
Atomic::cmpxchg_ptr(next, &_head_deleted_list, hd);
|
|
||||||
if (res == hd) {
|
|
||||||
hd->set_next_deleted(NULL);
|
|
||||||
hd->set_deleted(false);
|
|
||||||
return hd;
|
|
||||||
} else {
|
|
||||||
hd = res;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
CardIdx_t /* RSHashTable:: */ RSHashTableIter::find_first_card_in_list() {
|
CardIdx_t /* RSHashTable:: */ RSHashTableIter::find_first_card_in_list() {
|
||||||
CardIdx_t res;
|
CardIdx_t res;
|
||||||
while (_bl_ind != RSHashTable::NullEntry) {
|
while (_bl_ind != RSHashTable::NullEntry) {
|
||||||
@ -442,15 +407,6 @@ void SparsePRT::cleanup_all() {
|
|||||||
sprt->cleanup();
|
sprt->cleanup();
|
||||||
sprt = get_from_expanded_list();
|
sprt = get_from_expanded_list();
|
||||||
}
|
}
|
||||||
// Now delete all deleted RSHashTables.
|
|
||||||
RSHashTable* rsht = RSHashTable::get_from_deleted_list();
|
|
||||||
while (rsht != NULL) {
|
|
||||||
#if SPARSE_PRT_VERBOSE
|
|
||||||
gclog_or_tty->print_cr("About to delete RSHT " PTR_FORMAT ".", rsht);
|
|
||||||
#endif
|
|
||||||
delete rsht;
|
|
||||||
rsht = RSHashTable::get_from_deleted_list();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -511,8 +467,10 @@ void SparsePRT::clear() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void SparsePRT::cleanup() {
|
void SparsePRT::cleanup() {
|
||||||
// Make sure that the current and next tables agree. (Another mechanism
|
// Make sure that the current and next tables agree.
|
||||||
// takes care of deleting now-unused tables.)
|
if (_cur != _next) {
|
||||||
|
delete _cur;
|
||||||
|
}
|
||||||
_cur = _next;
|
_cur = _next;
|
||||||
set_expanded(false);
|
set_expanded(false);
|
||||||
}
|
}
|
||||||
@ -535,7 +493,8 @@ void SparsePRT::expand() {
|
|||||||
_next->add_entry(e);
|
_next->add_entry(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (last != _cur)
|
if (last != _cur) {
|
||||||
RSHashTable::add_to_deleted_list(last);
|
delete last;
|
||||||
|
}
|
||||||
add_to_expanded_list(this);
|
add_to_expanded_list(this);
|
||||||
}
|
}
|
||||||
|
@ -102,13 +102,6 @@ class RSHashTable : public CHeapObj {
|
|||||||
int _free_region;
|
int _free_region;
|
||||||
int _free_list;
|
int _free_list;
|
||||||
|
|
||||||
static RSHashTable* _head_deleted_list;
|
|
||||||
RSHashTable* _next_deleted;
|
|
||||||
RSHashTable* next_deleted() { return _next_deleted; }
|
|
||||||
void set_next_deleted(RSHashTable* rsht) { _next_deleted = rsht; }
|
|
||||||
bool _deleted;
|
|
||||||
void set_deleted(bool b) { _deleted = b; }
|
|
||||||
|
|
||||||
// Requires that the caller hold a lock preventing parallel modifying
|
// Requires that the caller hold a lock preventing parallel modifying
|
||||||
// operations, and that the the table be less than completely full. If
|
// operations, and that the the table be less than completely full. If
|
||||||
// an entry for "region_ind" is already in the table, finds it and
|
// an entry for "region_ind" is already in the table, finds it and
|
||||||
@ -154,14 +147,10 @@ public:
|
|||||||
size_t occupied_entries() const { return _occupied_entries; }
|
size_t occupied_entries() const { return _occupied_entries; }
|
||||||
size_t occupied_cards() const { return _occupied_cards; }
|
size_t occupied_cards() const { return _occupied_cards; }
|
||||||
size_t mem_size() const;
|
size_t mem_size() const;
|
||||||
bool deleted() { return _deleted; }
|
|
||||||
|
|
||||||
SparsePRTEntry* entry(int i) const { return &_entries[i]; }
|
SparsePRTEntry* entry(int i) const { return &_entries[i]; }
|
||||||
|
|
||||||
void print();
|
void print();
|
||||||
|
|
||||||
static void add_to_deleted_list(RSHashTable* rsht);
|
|
||||||
static RSHashTable* get_from_deleted_list();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// ValueObj because will be embedded in HRRS iterator.
|
// ValueObj because will be embedded in HRRS iterator.
|
||||||
|
@ -1913,8 +1913,9 @@ void HeapDumper::dump_heap() {
|
|||||||
if (use_default_filename) {
|
if (use_default_filename) {
|
||||||
char fn[32];
|
char fn[32];
|
||||||
sprintf(fn, "java_pid%d", os::current_process_id());
|
sprintf(fn, "java_pid%d", os::current_process_id());
|
||||||
assert(strlen(base_path) + strlen(fn) < sizeof(base_path), "HeapDumpPath too long");
|
assert(strlen(base_path) + strlen(fn) + strlen(".hprof") < sizeof(base_path), "HeapDumpPath too long");
|
||||||
strcat(base_path, fn);
|
strcat(base_path, fn);
|
||||||
|
strcat(base_path, ".hprof");
|
||||||
}
|
}
|
||||||
assert(strlen(base_path) < sizeof(my_path), "Buffer too small");
|
assert(strlen(base_path) < sizeof(my_path), "Buffer too small");
|
||||||
strcpy(my_path, base_path);
|
strcpy(my_path, base_path);
|
||||||
@ -1927,8 +1928,6 @@ void HeapDumper::dump_heap() {
|
|||||||
strcat(my_path, fn);
|
strcat(my_path, fn);
|
||||||
}
|
}
|
||||||
dump_file_seq++; // increment seq number for next time we dump
|
dump_file_seq++; // increment seq number for next time we dump
|
||||||
assert(strlen(".hprof") + strlen(my_path) < sizeof(my_path), "HeapDumpPath too long");
|
|
||||||
strcat(my_path, ".hprof");
|
|
||||||
|
|
||||||
HeapDumper dumper(false /* no GC before heap dump */,
|
HeapDumper dumper(false /* no GC before heap dump */,
|
||||||
true /* send to tty */);
|
true /* send to tty */);
|
||||||
|
Loading…
Reference in New Issue
Block a user