Merge
This commit is contained in:
commit
e2d4899be6
@ -78,7 +78,6 @@ StubQueue::StubQueue(StubInterface* stub_interface, int buffer_size,
|
||||
_queue_begin = 0;
|
||||
_queue_end = 0;
|
||||
_number_of_stubs = 0;
|
||||
register_queue(this);
|
||||
}
|
||||
|
||||
|
||||
@ -205,36 +204,6 @@ void StubQueue::remove_all(){
|
||||
}
|
||||
|
||||
|
||||
enum { StubQueueLimit = 10 }; // there are only a few in the world
|
||||
static StubQueue* registered_stub_queues[StubQueueLimit];
|
||||
|
||||
void StubQueue::register_queue(StubQueue* sq) {
|
||||
for (int i = 0; i < StubQueueLimit; i++) {
|
||||
if (registered_stub_queues[i] == NULL) {
|
||||
registered_stub_queues[i] = sq;
|
||||
return;
|
||||
}
|
||||
}
|
||||
ShouldNotReachHere();
|
||||
}
|
||||
|
||||
|
||||
void StubQueue::queues_do(void f(StubQueue* sq)) {
|
||||
for (int i = 0; i < StubQueueLimit; i++) {
|
||||
if (registered_stub_queues[i] != NULL) {
|
||||
f(registered_stub_queues[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void StubQueue::stubs_do(void f(Stub* s)) {
|
||||
debug_only(verify();)
|
||||
MutexLockerEx lock(_mutex);
|
||||
for (Stub* s = first(); s != NULL; s = next(s)) f(s);
|
||||
}
|
||||
|
||||
|
||||
void StubQueue::verify() {
|
||||
// verify only if initialized
|
||||
if (_stub_buffer == NULL) return;
|
||||
|
@ -172,8 +172,6 @@ class StubQueue: public CHeapObj<mtCode> {
|
||||
void stub_verify(Stub* s) { _stub_interface->verify(s); }
|
||||
void stub_print(Stub* s) { _stub_interface->print(s); }
|
||||
|
||||
static void register_queue(StubQueue*);
|
||||
|
||||
public:
|
||||
StubQueue(StubInterface* stub_interface, int buffer_size, Mutex* lock,
|
||||
const char* name);
|
||||
@ -204,8 +202,6 @@ class StubQueue: public CHeapObj<mtCode> {
|
||||
void deallocate_unused_tail(); // deallocate the unused tail of the underlying CodeBlob
|
||||
// only used from TemplateInterpreter::initialize()
|
||||
// Iteration
|
||||
static void queues_do(void f(StubQueue* s)); // call f with each StubQueue
|
||||
void stubs_do(void f(Stub* s)); // call f with all stubs
|
||||
Stub* first() const { return number_of_stubs() > 0 ? stub_at(_queue_begin) : NULL; }
|
||||
Stub* next(Stub* s) const { int i = index_of(s) + stub_size(s);
|
||||
// Only wrap around in the non-contiguous case (see stubss.cpp)
|
||||
@ -213,9 +209,6 @@ class StubQueue: public CHeapObj<mtCode> {
|
||||
return (i == _queue_end) ? NULL : stub_at(i);
|
||||
}
|
||||
|
||||
address stub_code_begin(Stub* s) const { return _stub_interface->code_begin(s); }
|
||||
address stub_code_end(Stub* s) const { return _stub_interface->code_end(s); }
|
||||
|
||||
// Debugging/printing
|
||||
void verify(); // verifies the stub queue
|
||||
void print(); // prints information about the stub queue
|
||||
|
@ -39,7 +39,6 @@
|
||||
#include "gc/g1/g1ConcurrentRefineThread.hpp"
|
||||
#include "gc/g1/g1EvacStats.inline.hpp"
|
||||
#include "gc/g1/g1FullCollector.hpp"
|
||||
#include "gc/g1/g1FullGCScope.hpp"
|
||||
#include "gc/g1/g1GCPhaseTimes.hpp"
|
||||
#include "gc/g1/g1HeapSizingPolicy.hpp"
|
||||
#include "gc/g1/g1HeapTransition.hpp"
|
||||
@ -1218,34 +1217,6 @@ void G1CollectedHeap::print_heap_after_full_collection(G1HeapTransition* heap_tr
|
||||
#endif
|
||||
}
|
||||
|
||||
void G1CollectedHeap::do_full_collection_inner(G1FullGCScope* scope) {
|
||||
GCTraceTime(Info, gc) tm("Pause Full", NULL, gc_cause(), true);
|
||||
g1_policy()->record_full_collection_start();
|
||||
|
||||
print_heap_before_gc();
|
||||
print_heap_regions();
|
||||
|
||||
abort_concurrent_cycle();
|
||||
verify_before_full_collection(scope->is_explicit_gc());
|
||||
|
||||
gc_prologue(true);
|
||||
prepare_heap_for_full_collection();
|
||||
|
||||
G1FullCollector collector(scope, ref_processor_stw(), concurrent_mark()->next_mark_bitmap(), workers()->active_workers());
|
||||
collector.prepare_collection();
|
||||
collector.collect();
|
||||
collector.complete_collection();
|
||||
|
||||
prepare_heap_for_mutators();
|
||||
|
||||
g1_policy()->record_full_collection_end();
|
||||
gc_epilogue(true);
|
||||
|
||||
verify_after_full_collection();
|
||||
|
||||
print_heap_after_full_collection(scope->heap_transition());
|
||||
}
|
||||
|
||||
bool G1CollectedHeap::do_full_collection(bool explicit_gc,
|
||||
bool clear_all_soft_refs) {
|
||||
assert_at_safepoint(true /* should_be_vm_thread */);
|
||||
@ -1258,8 +1229,12 @@ bool G1CollectedHeap::do_full_collection(bool explicit_gc,
|
||||
const bool do_clear_all_soft_refs = clear_all_soft_refs ||
|
||||
collector_policy()->should_clear_all_soft_refs();
|
||||
|
||||
G1FullGCScope scope(explicit_gc, do_clear_all_soft_refs);
|
||||
do_full_collection_inner(&scope);
|
||||
G1FullCollector collector(this, explicit_gc, do_clear_all_soft_refs);
|
||||
GCTraceTime(Info, gc) tm("Pause Full", NULL, gc_cause(), true);
|
||||
|
||||
collector.prepare_collection();
|
||||
collector.collect();
|
||||
collector.complete_collection();
|
||||
|
||||
// Full collection was successfully completed.
|
||||
return true;
|
||||
|
@ -126,6 +126,7 @@ class G1CollectedHeap : public CollectedHeap {
|
||||
friend class VM_G1IncCollectionPause;
|
||||
friend class VMStructs;
|
||||
friend class MutatorAllocRegion;
|
||||
friend class G1FullCollector;
|
||||
friend class G1GCAllocRegion;
|
||||
friend class G1HeapVerifier;
|
||||
|
||||
@ -517,7 +518,6 @@ protected:
|
||||
private:
|
||||
// Internal helpers used during full GC to split it up to
|
||||
// increase readability.
|
||||
void do_full_collection_inner(G1FullGCScope* scope);
|
||||
void abort_concurrent_cycle();
|
||||
void verify_before_full_collection(bool explicit_gc);
|
||||
void prepare_heap_for_full_collection();
|
||||
|
@ -35,6 +35,7 @@
|
||||
#include "gc/g1/g1FullGCReferenceProcessorExecutor.hpp"
|
||||
#include "gc/g1/g1FullGCScope.hpp"
|
||||
#include "gc/g1/g1OopClosures.hpp"
|
||||
#include "gc/g1/g1Policy.hpp"
|
||||
#include "gc/g1/g1StringDedup.hpp"
|
||||
#include "gc/shared/gcTraceTime.inline.hpp"
|
||||
#include "gc/shared/preservedMarks.hpp"
|
||||
@ -62,20 +63,24 @@ static void update_derived_pointers() {
|
||||
#endif
|
||||
}
|
||||
|
||||
G1FullCollector::G1FullCollector(G1FullGCScope* scope,
|
||||
ReferenceProcessor* reference_processor,
|
||||
G1CMBitMap* bitmap,
|
||||
uint workers) :
|
||||
_scope(scope),
|
||||
_num_workers(workers),
|
||||
_mark_bitmap(bitmap),
|
||||
G1CMBitMap* G1FullCollector::mark_bitmap() {
|
||||
return _heap->concurrent_mark()->next_mark_bitmap();
|
||||
}
|
||||
|
||||
ReferenceProcessor* G1FullCollector::reference_processor() {
|
||||
return _heap->ref_processor_stw();
|
||||
}
|
||||
|
||||
G1FullCollector::G1FullCollector(G1CollectedHeap* heap, bool explicit_gc, bool clear_soft_refs) :
|
||||
_heap(heap),
|
||||
_scope(explicit_gc, clear_soft_refs),
|
||||
_num_workers(heap->workers()->active_workers()),
|
||||
_oop_queue_set(_num_workers),
|
||||
_array_queue_set(_num_workers),
|
||||
_preserved_marks_set(true),
|
||||
_reference_processor(reference_processor),
|
||||
_serial_compaction_point(),
|
||||
_is_alive(_mark_bitmap),
|
||||
_is_alive_mutator(_reference_processor, &_is_alive) {
|
||||
_is_alive(heap->concurrent_mark()->next_mark_bitmap()),
|
||||
_is_alive_mutator(heap->ref_processor_stw(), &_is_alive) {
|
||||
assert(SafepointSynchronize::is_at_safepoint(), "must be at a safepoint");
|
||||
|
||||
_preserved_marks_set.init(_num_workers);
|
||||
@ -99,8 +104,19 @@ G1FullCollector::~G1FullCollector() {
|
||||
}
|
||||
|
||||
void G1FullCollector::prepare_collection() {
|
||||
_reference_processor->enable_discovery();
|
||||
_reference_processor->setup_policy(scope()->should_clear_soft_refs());
|
||||
_heap->g1_policy()->record_full_collection_start();
|
||||
|
||||
_heap->print_heap_before_gc();
|
||||
_heap->print_heap_regions();
|
||||
|
||||
_heap->abort_concurrent_cycle();
|
||||
_heap->verify_before_full_collection(scope()->is_explicit_gc());
|
||||
|
||||
_heap->gc_prologue(true);
|
||||
_heap->prepare_heap_for_full_collection();
|
||||
|
||||
reference_processor()->enable_discovery();
|
||||
reference_processor()->setup_policy(scope()->should_clear_soft_refs());
|
||||
|
||||
// When collecting the permanent generation Method*s may be moving,
|
||||
// so we either have to flush all bcp data or convert it into bci.
|
||||
@ -139,6 +155,15 @@ void G1FullCollector::complete_collection() {
|
||||
BiasedLocking::restore_marks();
|
||||
CodeCache::gc_epilogue();
|
||||
JvmtiExport::gc_epilogue();
|
||||
|
||||
_heap->prepare_heap_for_mutators();
|
||||
|
||||
_heap->g1_policy()->record_full_collection_end();
|
||||
_heap->gc_epilogue(true);
|
||||
|
||||
_heap->verify_after_full_collection();
|
||||
|
||||
_heap->print_heap_after_full_collection(scope()->heap_transition());
|
||||
}
|
||||
|
||||
void G1FullCollector::phase1_mark_live_objects() {
|
||||
@ -164,11 +189,11 @@ void G1FullCollector::phase1_mark_live_objects() {
|
||||
GCTraceTime(Debug, gc, phases) debug("Phase 1: Class Unloading and Cleanup", scope()->timer());
|
||||
// Unload classes and purge the SystemDictionary.
|
||||
bool purged_class = SystemDictionary::do_unloading(&_is_alive, scope()->timer());
|
||||
G1CollectedHeap::heap()->complete_cleaning(&_is_alive, purged_class);
|
||||
_heap->complete_cleaning(&_is_alive, purged_class);
|
||||
} else {
|
||||
GCTraceTime(Debug, gc, phases) debug("Phase 1: String and Symbol Tables Cleanup", scope()->timer());
|
||||
// If no class unloading just clean out strings and symbols.
|
||||
G1CollectedHeap::heap()->partial_cleaning(&_is_alive, true, true, G1StringDedup::is_enabled());
|
||||
_heap->partial_cleaning(&_is_alive, true, true, G1StringDedup::is_enabled());
|
||||
}
|
||||
|
||||
scope()->tracer()->report_object_count_after_gc(&_is_alive);
|
||||
@ -210,13 +235,13 @@ void G1FullCollector::phase4_do_compaction() {
|
||||
}
|
||||
|
||||
void G1FullCollector::restore_marks() {
|
||||
SharedRestorePreservedMarksTaskExecutor task_executor(G1CollectedHeap::heap()->workers());
|
||||
SharedRestorePreservedMarksTaskExecutor task_executor(_heap->workers());
|
||||
_preserved_marks_set.restore(&task_executor);
|
||||
_preserved_marks_set.reclaim();
|
||||
}
|
||||
|
||||
void G1FullCollector::run_task(AbstractGangTask* task) {
|
||||
G1CollectedHeap::heap()->workers()->run_task(task, _num_workers);
|
||||
_heap->workers()->run_task(task, _num_workers);
|
||||
}
|
||||
|
||||
void G1FullCollector::verify_after_marking() {
|
||||
@ -229,7 +254,7 @@ void G1FullCollector::verify_after_marking() {
|
||||
#if COMPILER2_OR_JVMCI
|
||||
DerivedPointerTableDeactivate dpt_deact;
|
||||
#endif
|
||||
G1CollectedHeap::heap()->prepare_for_verify();
|
||||
_heap->prepare_for_verify();
|
||||
// Note: we can verify only the heap here. When an object is
|
||||
// marked, the previous value of the mark word (including
|
||||
// identity hash values, ages, etc) is preserved, and the mark
|
||||
@ -241,5 +266,5 @@ void G1FullCollector::verify_after_marking() {
|
||||
// (including hash values) are restored to the appropriate
|
||||
// objects.
|
||||
GCTraceTime(Info, gc, verify)("During GC (full)");
|
||||
G1CollectedHeap::heap()->verify(VerifyOption_G1UseFullMarking);
|
||||
_heap->verify(VerifyOption_G1UseFullMarking);
|
||||
}
|
||||
|
@ -28,6 +28,7 @@
|
||||
#include "gc/g1/g1FullGCCompactionPoint.hpp"
|
||||
#include "gc/g1/g1FullGCMarker.hpp"
|
||||
#include "gc/g1/g1FullGCOopClosures.hpp"
|
||||
#include "gc/g1/g1FullGCScope.hpp"
|
||||
#include "gc/shared/preservedMarks.hpp"
|
||||
#include "gc/shared/referenceProcessor.hpp"
|
||||
#include "gc/shared/taskqueue.hpp"
|
||||
@ -42,41 +43,36 @@ class ReferenceProcessor;
|
||||
|
||||
// The G1FullCollector holds data associated with the current Full GC.
|
||||
class G1FullCollector : StackObj {
|
||||
G1FullGCScope* _scope;
|
||||
G1CollectedHeap* _heap;
|
||||
G1FullGCScope _scope;
|
||||
uint _num_workers;
|
||||
G1FullGCMarker** _markers;
|
||||
G1FullGCCompactionPoint** _compaction_points;
|
||||
G1CMBitMap* _mark_bitmap;
|
||||
OopQueueSet _oop_queue_set;
|
||||
ObjArrayTaskQueueSet _array_queue_set;
|
||||
PreservedMarksSet _preserved_marks_set;
|
||||
ReferenceProcessor* _reference_processor;
|
||||
G1FullGCCompactionPoint _serial_compaction_point;
|
||||
|
||||
G1IsAliveClosure _is_alive;
|
||||
ReferenceProcessorIsAliveMutator _is_alive_mutator;
|
||||
|
||||
public:
|
||||
G1FullCollector(G1FullGCScope* scope,
|
||||
ReferenceProcessor* reference_processor,
|
||||
G1CMBitMap* mark_bitmap,
|
||||
uint workers);
|
||||
G1FullCollector(G1CollectedHeap* heap, bool explicit_gc, bool clear_soft_refs);
|
||||
~G1FullCollector();
|
||||
|
||||
void prepare_collection();
|
||||
void collect();
|
||||
void complete_collection();
|
||||
|
||||
G1FullGCScope* scope() { return _scope; }
|
||||
G1FullGCScope* scope() { return &_scope; }
|
||||
uint workers() { return _num_workers; }
|
||||
G1FullGCMarker* marker(uint id) { return _markers[id]; }
|
||||
G1FullGCCompactionPoint* compaction_point(uint id) { return _compaction_points[id]; }
|
||||
G1CMBitMap* mark_bitmap() { return _mark_bitmap; }
|
||||
OopQueueSet* oop_queue_set() { return &_oop_queue_set; }
|
||||
ObjArrayTaskQueueSet* array_queue_set() { return &_array_queue_set; }
|
||||
PreservedMarksSet* preserved_mark_set() { return &_preserved_marks_set; }
|
||||
ReferenceProcessor* reference_processor() { return _reference_processor; }
|
||||
G1FullGCCompactionPoint* serial_compaction_point() { return &_serial_compaction_point; }
|
||||
G1CMBitMap* mark_bitmap();
|
||||
ReferenceProcessor* reference_processor();
|
||||
|
||||
private:
|
||||
void phase1_mark_live_objects();
|
||||
|
@ -169,7 +169,7 @@ public class BootAppendTests {
|
||||
CDSOptions opts = (new CDSOptions())
|
||||
.setXShareMode(mode).setUseVersion(false)
|
||||
.addPrefix("-Xbootclasspath/a:" + bootAppendJar, "-showversion",
|
||||
"--limit-modules=java.base,jdk.internal.vm.compiler", "-cp", appJar)
|
||||
"--limit-modules=java.base", "-cp", appJar)
|
||||
.addSuffix("-Xlog:class+load=info",
|
||||
APP_CLASS, BOOT_APPEND_MODULE_CLASS_NAME);
|
||||
|
||||
@ -198,7 +198,7 @@ public class BootAppendTests {
|
||||
CDSOptions opts = (new CDSOptions())
|
||||
.setXShareMode(mode).setUseVersion(false)
|
||||
.addPrefix("-Xbootclasspath/a:" + bootAppendJar, "-showversion",
|
||||
"--limit-modules=java.base,jdk.internal.vm.compiler", "-cp", appJar)
|
||||
"--limit-modules=java.base", "-cp", appJar)
|
||||
.addSuffix("-Xlog:class+load=info",
|
||||
APP_CLASS, BOOT_APPEND_DUPLICATE_MODULE_CLASS_NAME);
|
||||
|
||||
@ -226,7 +226,7 @@ public class BootAppendTests {
|
||||
CDSOptions opts = (new CDSOptions())
|
||||
.setXShareMode(mode).setUseVersion(false)
|
||||
.addPrefix("-Xbootclasspath/a:" + bootAppendJar, "-showversion",
|
||||
"--limit-modules=java.base,jdk.internal.vm.compiler", "-cp", appJar)
|
||||
"--limit-modules=java.base", "-cp", appJar)
|
||||
.addSuffix("-Xlog:class+load=info",
|
||||
APP_CLASS, BOOT_APPEND_CLASS_NAME);
|
||||
|
||||
|
@ -38,13 +38,13 @@ import java.security.Permission;
|
||||
* @run main/othervm -Xverify:all -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT WithSecurityManager
|
||||
* @run main/othervm -Xverify:all -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT WithSecurityManager
|
||||
*
|
||||
* @run main/othervm -Xverify:all --limit-modules=java.base,jdk.internal.vm.compiler WithSecurityManager
|
||||
* @run main/othervm -Xverify:all --limit-modules=java.base,jdk.internal.vm.compiler -Djava.lang.invoke.stringConcat=BC_SB WithSecurityManager
|
||||
* @run main/othervm -Xverify:all --limit-modules=java.base,jdk.internal.vm.compiler -Djava.lang.invoke.stringConcat=BC_SB_SIZED WithSecurityManager
|
||||
* @run main/othervm -Xverify:all --limit-modules=java.base,jdk.internal.vm.compiler -Djava.lang.invoke.stringConcat=MH_SB_SIZED WithSecurityManager
|
||||
* @run main/othervm -Xverify:all --limit-modules=java.base,jdk.internal.vm.compiler -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT WithSecurityManager
|
||||
* @run main/othervm -Xverify:all --limit-modules=java.base,jdk.internal.vm.compiler -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT WithSecurityManager
|
||||
* @run main/othervm -Xverify:all --limit-modules=java.base,jdk.internal.vm.compiler -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT WithSecurityManager
|
||||
* @run main/othervm -Xverify:all --limit-modules=java.base WithSecurityManager
|
||||
* @run main/othervm -Xverify:all --limit-modules=java.base -Djava.lang.invoke.stringConcat=BC_SB WithSecurityManager
|
||||
* @run main/othervm -Xverify:all --limit-modules=java.base -Djava.lang.invoke.stringConcat=BC_SB_SIZED WithSecurityManager
|
||||
* @run main/othervm -Xverify:all --limit-modules=java.base -Djava.lang.invoke.stringConcat=MH_SB_SIZED WithSecurityManager
|
||||
* @run main/othervm -Xverify:all --limit-modules=java.base -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT WithSecurityManager
|
||||
* @run main/othervm -Xverify:all --limit-modules=java.base -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT WithSecurityManager
|
||||
* @run main/othervm -Xverify:all --limit-modules=java.base -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT WithSecurityManager
|
||||
*/
|
||||
public class WithSecurityManager {
|
||||
public static void main(String[] args) throws Throwable {
|
||||
|
Loading…
Reference in New Issue
Block a user