diff -r f4edb0d9f109 -r 21d113ecbf6a hotspot/src/share/vm/memory/universe.cpp --- a/hotspot/src/share/vm/memory/universe.cpp Fri Apr 11 09:56:35 2008 -0400 +++ b/hotspot/src/share/vm/memory/universe.cpp Sun Apr 13 17:43:42 2008 -0400 @@ -99,6 +99,7 @@ size_t Universe::_heap_used_at_last_gc; CollectedHeap* Universe::_collectedHeap = NULL; +address Universe::_heap_base = NULL; void Universe::basic_type_classes_do(void f(klassOop)) { @@ -464,7 +465,7 @@ class FixupMirrorClosure: public ObjectClosure { public: - void do_object(oop obj) { + virtual void do_object(oop obj) { if (obj->is_klass()) { EXCEPTION_MARK; KlassHandle k(THREAD, klassOop(obj)); @@ -667,7 +668,7 @@ "LogHeapWordSize is incorrect."); guarantee(sizeof(oop) >= sizeof(HeapWord), "HeapWord larger than oop?"); guarantee(sizeof(oop) % sizeof(HeapWord) == 0, - "oop size is not not a multiple of HeapWord size"); + "oop size is not not a multiple of HeapWord size"); TraceTime timer("Genesis", TraceStartupTime); GC_locker::lock(); // do not allow gc during bootstrapping JavaClasses::compute_hard_coded_offsets(); @@ -759,6 +760,15 @@ if (status != JNI_OK) { return status; } + if (UseCompressedOops) { + // Subtract a page because something can get allocated at heap base. + // This also makes implicit null checking work, because the + // memory+1 page below heap_base needs to cause a signal. + // See needs_explicit_null_check. + // Only set the heap base for compressed oops because it indicates + // compressed oops for pstack code. + Universe::_heap_base = Universe::heap()->base() - os::vm_page_size(); + } // We will never reach the CATCH below since Exceptions::_throw will cause // the VM to exit if an exception is thrown during initialization