diff -BburN svn/gc_gen/src/common/gc_common.cpp vm.new/gc_gen/src/common/gc_common.cpp --- svn/gc_gen/src/common/gc_common.cpp 2007-07-26 19:16:19.000000000 +0800 +++ vm.new/gc_gen/src/common/gc_common.cpp 2007-07-26 19:16:27.000000000 +0800 @@ -45,6 +45,9 @@ extern unsigned int MINOR_COLLECTORS; extern unsigned int MAJOR_COLLECTORS; +extern Boolean IGNORE_VTABLE_TRACING; +extern Boolean IGNORE_WEAK_ROOTS; + POINTER_SIZE_INT HEAP_SIZE_DEFAULT = 256 * MB; POINTER_SIZE_INT min_heap_size_bytes = 16 * MB; POINTER_SIZE_INT max_heap_size_bytes = 0; @@ -248,6 +251,14 @@ JVMTI_HEAP_ITERATION = get_boolean_property("gc.heap_iteration"); } + if (is_property_set("gc.ignore_vtable_tracing", VM_PROPERTIES) == 1) { + IGNORE_VTABLE_TRACING = get_boolean_property("gc.ignore_vtable_tracing"); + } + + if (is_property_set("gc.ignore_weak_roots", VM_PROPERTIES) == 1) { + IGNORE_WEAK_ROOTS = get_boolean_property("gc.ignore_weak_roots"); + } + if (is_property_set("gc.use_large_page", VM_PROPERTIES) == 1){ char* value = get_property("gc.use_large_page", VM_PROPERTIES); large_page_hint = strdup(value); diff -BburN svn/gc_gen/src/common/gc_common.h vm.new/gc_gen/src/common/gc_common.h --- svn/gc_gen/src/common/gc_common.h 2007-07-26 19:16:19.000000000 +0800 +++ vm.new/gc_gen/src/common/gc_common.h 2007-07-26 19:16:27.000000000 +0800 @@ -451,4 +451,6 @@ inline Boolean obj_is_moved(Partial_Reveal_Object* p_obj) { return ((p_obj >= los_boundary) || (*p_global_lspace_move_obj)); } +extern Boolean VTABLE_TRACING; + #endif //_GC_COMMON_H_ diff -BburN svn/gc_gen/src/common/gc_for_vm.cpp vm.new/gc_gen/src/common/gc_for_vm.cpp --- svn/gc_gen/src/common/gc_for_vm.cpp 2007-07-26 19:16:19.000000000 +0800 +++ vm.new/gc_gen/src/common/gc_for_vm.cpp 2007-07-26 19:16:27.000000000 +0800 @@ -131,9 +131,14 @@ gc_compressed_rootset_add_entry(p_global_gc, p_ref); } +Boolean gc_supports_class_unloading() +{ + return VTABLE_TRACING; +} + +Boolean IGNORE_WEAK_ROOTS = FALSE; void gc_add_weak_root_set_entry(Managed_Object_Handle *ref, Boolean is_pinned, Boolean is_short_weak) { - assert(is_short_weak == FALSE); //Currently no need for short_weak_roots Partial_Reveal_Object** p_ref = (Partial_Reveal_Object**)ref; Partial_Reveal_Object* p_obj = *p_ref; /* we don't enumerate NULL reference and nos_boundary @@ -146,7 +151,12 @@ #endif assert( !obj_is_marked_in_vt(p_obj)); assert( address_belongs_to_gc_heap(p_obj, p_global_gc)); + if(IGNORE_WEAK_ROOTS) { + gc_rootset_add_entry(p_global_gc, p_ref); + }else{ + assert(is_short_weak == FALSE); //Currently no need for short_weak_roots gc_weak_rootset_add_entry(p_global_gc, p_ref, is_short_weak); + } } /* VM to force GC */ diff -BburN svn/gc_gen/src/common/mark_scan_pool.cpp vm.new/gc_gen/src/common/mark_scan_pool.cpp --- svn/gc_gen/src/common/mark_scan_pool.cpp 2007-07-26 19:16:19.000000000 +0800 +++ vm.new/gc_gen/src/common/mark_scan_pool.cpp 2007-07-26 19:16:27.000000000 +0800 @@ -39,6 +39,7 @@ vm_notify_obj_alive( (void *)p_obj); Partial_Reveal_VTable *vtable = obj_get_vt(p_obj); + if(VTABLE_TRACING) if(vtable->vtmark == VT_UNMARKED) { vtable->vtmark = VT_MARKED; if(obj_mark_in_vt(vtable->jlC)) diff -BburN svn/gc_gen/src/gen/gen.cpp vm.new/gc_gen/src/gen/gen.cpp --- svn/gc_gen/src/gen/gen.cpp 2007-07-26 19:16:19.000000000 +0800 +++ vm.new/gc_gen/src/gen/gen.cpp 2007-07-26 19:16:27.000000000 +0800 @@ -285,6 +285,8 @@ unsigned int gc_get_processor_num(GC_Gen* gc){ return gc->_num_processors;} Boolean FORCE_FULL_COMPACT = FALSE; +Boolean IGNORE_VTABLE_TRACING = FALSE; +Boolean VTABLE_TRACING = TRUE; void gc_decide_collection_kind(GC_Gen* gc, unsigned int cause) { @@ -296,6 +298,11 @@ else gc->collect_kind = MINOR_COLLECTION; + if(IGNORE_VTABLE_TRACING || (gc->collect_kind == MINOR_COLLECTION)) + VTABLE_TRACING = FALSE; + else + VTABLE_TRACING = TRUE; + return; } diff -BburN svn/gc_gen/src/mark_compact/fallback_mark_scan.cpp vm.new/gc_gen/src/mark_compact/fallback_mark_scan.cpp --- svn/gc_gen/src/mark_compact/fallback_mark_scan.cpp 2007-07-26 19:16:19.000000000 +0800 +++ vm.new/gc_gen/src/mark_compact/fallback_mark_scan.cpp 2007-07-26 19:16:27.000000000 +0800 @@ -37,6 +37,7 @@ assert(p_obj); Partial_Reveal_VTable *vtable = obj_get_vt(p_obj); + if(VTABLE_TRACING) if(!(vtable->vtmark & VT_FALLBACK_MARKED)) { vtable->vtmark |= VT_FALLBACK_MARKED; //we need different marking for fallback compaction collector_tracestack_push(collector, &(vtable->jlC)); diff -BburN svn/gc_gen/src/mark_compact/los_extention_mark_scan.cpp vm.new/gc_gen/src/mark_compact/los_extention_mark_scan.cpp --- svn/gc_gen/src/mark_compact/los_extention_mark_scan.cpp 2007-07-26 19:16:19.000000000 +0800 +++ vm.new/gc_gen/src/mark_compact/los_extention_mark_scan.cpp 2007-07-26 19:16:27.000000000 +0800 @@ -45,6 +45,7 @@ { vm_notify_obj_alive( (void *)p_obj); Partial_Reveal_VTable *vtable = obj_get_vt(p_obj); + if(VTABLE_TRACING) if(vtable->vtmark == VT_UNMARKED) { vtable->vtmark = VT_MARKED; if(obj_mark_in_vt(vtable->jlC)) diff -BburN svn/gc_gen/src/mark_sweep/sspace_mark.cpp vm.new/gc_gen/src/mark_sweep/sspace_mark.cpp --- svn/gc_gen/src/mark_sweep/sspace_mark.cpp 2007-07-26 19:16:19.000000000 +0800 +++ vm.new/gc_gen/src/mark_sweep/sspace_mark.cpp 2007-07-26 19:16:28.000000000 +0800 @@ -33,6 +33,7 @@ { if(!object_has_ref_field(p_obj)) return; Partial_Reveal_VTable *vtable = obj_get_vt(p_obj); + if(VTABLE_TRACING) if(vtable->vtmark == VT_UNMARKED) { vtable->vtmark = VT_MARKED; if(obj_mark_in_table(vtable->jlC)) diff -BburN svn/gc_gen/src/trace_forward/fspace_gen_forward_pool.cpp vm.new/gc_gen/src/trace_forward/fspace_gen_forward_pool.cpp --- svn/gc_gen/src/trace_forward/fspace_gen_forward_pool.cpp 2007-07-26 19:16:19.000000000 +0800 +++ vm.new/gc_gen/src/trace_forward/fspace_gen_forward_pool.cpp 2007-07-26 19:16:28.000000000 +0800 @@ -48,6 +48,7 @@ static FORCE_INLINE void scan_object(Collector* collector, Partial_Reveal_Object *p_obj) { Partial_Reveal_VTable *vtable = obj_get_vt(p_obj); + if(VTABLE_TRACING) if(vtable->vtmark == VT_UNMARKED) { vtable->vtmark = VT_MARKED; trace_forwarded_jlC_from_vtable(collector, vtable->jlC); diff -BburN svn/gc_gen/src/trace_forward/fspace_nongen_forward_pool.cpp vm.new/gc_gen/src/trace_forward/fspace_nongen_forward_pool.cpp --- svn/gc_gen/src/trace_forward/fspace_nongen_forward_pool.cpp 2007-07-26 19:16:19.000000000 +0800 +++ vm.new/gc_gen/src/trace_forward/fspace_nongen_forward_pool.cpp 2007-07-26 19:16:28.000000000 +0800 @@ -39,6 +39,7 @@ static FORCE_INLINE void scan_object(Collector* collector, Partial_Reveal_Object *p_obj) { Partial_Reveal_VTable *vtable = obj_get_vt(p_obj); + if(VTABLE_TRACING) if(vtable->vtmark == VT_UNMARKED) { vtable->vtmark = VT_MARKED; trace_forwarded_jlC_from_vtable(collector, vtable->jlC); diff -BburN svn/include/open/gc.h vm.new/include/open/gc.h --- svn/include/open/gc.h 2007-07-26 19:39:45.000000000 +0800 +++ vm.new/include/open/gc.h 2007-07-26 19:39:22.000000000 +0800 @@ -662,6 +662,9 @@ VMEXPORT extern void * (*gc_heap_base_address)(); VMEXPORT extern void * (*gc_heap_ceiling_address)(); +extern Boolean (*gc_supports_class_unloading)(); + + #else // USE_GC_STATIC //@} @@ -787,6 +790,8 @@ */ GCExport Boolean gc_clear_mutator_block_flag(); +GCExport Boolean gc_supports_class_unloading(); + // XXX move this elsewhere -salikh #ifdef JNIEXPORT diff -BburN svn/vmcore/src/gc/dll_gc.cpp vm.new/vmcore/src/gc/dll_gc.cpp --- svn/vmcore/src/gc/dll_gc.cpp 2007-07-26 19:16:20.000000000 +0800 +++ vm.new/vmcore/src/gc/dll_gc.cpp 2007-07-26 19:16:28.000000000 +0800 @@ -70,6 +70,7 @@ static void default_gc_add_weak_root_set_entry( Managed_Object_Handle*, Boolean, Boolean); +static Boolean default_gc_supports_class_unloading(); Boolean (*gc_supports_compressed_references)() = 0; @@ -133,6 +134,8 @@ void (*gc_set_mutator_block_flag)() = 0; Boolean (*gc_clear_mutator_block_flag)() = 0; +Boolean (*gc_supports_class_unloading)() = 0; + static apr_dso_handle_sym_t getFunction(apr_dso_handle_t *handle, const char *name, const char *dllName) { apr_dso_handle_sym_t fn; @@ -316,6 +319,12 @@ (apr_dso_handle_sym_t)default_gc_write_barrier); gc_test_safepoint = (void (*)()) getFunctionOptional(handle, "gc_test_safepoint", dllName, (apr_dso_handle_sym_t)default_gc_test_safepoint); + gc_supports_class_unloading = (Boolean (*)()) + getFunctionOptional(handle, + "gc_supports_class_unloading", + dllName, + (apr_dso_handle_sym_t)default_gc_supports_class_unloading); + } //vm_add_gc @@ -541,4 +550,9 @@ // default to strong reference semantics gc_add_root_set_entry(root, pinned); } + +static Boolean default_gc_supports_class_unloading() +{ + return TRUE; +} //default_gc_supports_class_unloading #endif // !USE_GC_STATIC diff -BburN svn/vmcore/src/gc/root_set_enum_common.cpp vm.new/vmcore/src/gc/root_set_enum_common.cpp --- svn/vmcore/src/gc/root_set_enum_common.cpp 2007-07-26 19:16:20.000000000 +0800 +++ vm.new/vmcore/src/gc/root_set_enum_common.cpp 2007-07-26 19:16:28.000000000 +0800 @@ -114,6 +114,7 @@ { TRACE2("enumeration", "vm_enumerate_static_fields()"); GlobalClassLoaderIterator ClIterator; + Boolean do_class_unloading = gc_supports_class_unloading(); ClassLoader *cl = ClIterator.first(); while(cl) { GlobalClassLoaderIterator::ClassIterator itc; @@ -134,7 +135,7 @@ assert(c); if (!cl->IsBootstrap()) { - vm_enumerate_jlc(c, true/*enum as weak root*/); + vm_enumerate_jlc(c, do_class_unloading/*enum as weak root if gc supports that*/); vm_enumerate_class_static(c); } } diff -BburN svn/vmcore/src/gc/stop_the_world_root_set_enum.cpp vm.new/vmcore/src/gc/stop_the_world_root_set_enum.cpp --- svn/vmcore/src/gc/stop_the_world_root_set_enum.cpp 2007-07-26 19:16:20.000000000 +0800 +++ vm.new/vmcore/src/gc/stop_the_world_root_set_enum.cpp 2007-07-26 19:16:28.000000000 +0800 @@ -98,7 +98,7 @@ jvmti_send_gc_start_event(); - class_unloading_clear_mark_bits(); + if(gc_supports_class_unloading()) class_unloading_clear_mark_bits(); current_vm_thread = p_TLS_vmthread; // Run through list of active threads and enumerate each one of them. @@ -163,7 +163,7 @@ assert(p_the_safepoint_control_thread == p_TLS_vmthread); p_the_safepoint_control_thread = 0; - class_unloading_start(); + if(gc_supports_class_unloading()) class_unloading_start(); jvmti_send_gc_finish_event(); jvmti_clean_reclaimed_object_tags();