mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-26 14:24:46 +02:00
8010463: G1: Crashes with -UseTLAB and heap verification
Some parts of the G1 heap can only be walked during a safepoint. Skip verifying these parts of the heap when verifying during JVM startup. Reviewed-by: brutisso, tschatzl
This commit is contained in:
parent
bb5bd507d7
commit
9c89e6d28a
5 changed files with 54 additions and 27 deletions
|
@ -3288,7 +3288,7 @@ void G1CollectedHeap::verify(bool silent) {
|
||||||
|
|
||||||
void G1CollectedHeap::verify(bool silent,
|
void G1CollectedHeap::verify(bool silent,
|
||||||
VerifyOption vo) {
|
VerifyOption vo) {
|
||||||
if (SafepointSynchronize::is_at_safepoint() || ! UseTLAB) {
|
if (SafepointSynchronize::is_at_safepoint()) {
|
||||||
if (!silent) { gclog_or_tty->print("Roots "); }
|
if (!silent) { gclog_or_tty->print("Roots "); }
|
||||||
VerifyRootsClosure rootsCl(vo);
|
VerifyRootsClosure rootsCl(vo);
|
||||||
|
|
||||||
|
@ -3378,7 +3378,8 @@ void G1CollectedHeap::verify(bool silent,
|
||||||
}
|
}
|
||||||
guarantee(!failures, "there should not have been any failures");
|
guarantee(!failures, "there should not have been any failures");
|
||||||
} else {
|
} else {
|
||||||
if (!silent) gclog_or_tty->print("(SKIPPING roots, heapRegions, remset) ");
|
if (!silent)
|
||||||
|
gclog_or_tty->print("(SKIPPING roots, heapRegionSets, heapRegions, remset) ");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -953,15 +953,6 @@ void Universe::update_heap_info_at_gc() {
|
||||||
void universe2_init() {
|
void universe2_init() {
|
||||||
EXCEPTION_MARK;
|
EXCEPTION_MARK;
|
||||||
Universe::genesis(CATCH);
|
Universe::genesis(CATCH);
|
||||||
// Although we'd like to verify here that the state of the heap
|
|
||||||
// is good, we can't because the main thread has not yet added
|
|
||||||
// itself to the threads list (so, using current interfaces
|
|
||||||
// we can't "fill" its TLAB), unless TLABs are disabled.
|
|
||||||
if (VerifyBeforeGC && !UseTLAB &&
|
|
||||||
Universe::heap()->total_collections() >= VerifyGCStartAt) {
|
|
||||||
Universe::heap()->prepare_for_verify();
|
|
||||||
Universe::verify(); // make sure we're starting with a clean slate
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -132,15 +132,6 @@ jint init_globals() {
|
||||||
javaClasses_init(); // must happen after vtable initialization
|
javaClasses_init(); // must happen after vtable initialization
|
||||||
stubRoutines_init2(); // note: StubRoutines need 2-phase init
|
stubRoutines_init2(); // note: StubRoutines need 2-phase init
|
||||||
|
|
||||||
// Although we'd like to, we can't easily do a heap verify
|
|
||||||
// here because the main thread isn't yet a JavaThread, so
|
|
||||||
// its TLAB may not be made parseable from the usual interfaces.
|
|
||||||
if (VerifyBeforeGC && !UseTLAB &&
|
|
||||||
Universe::heap()->total_collections() >= VerifyGCStartAt) {
|
|
||||||
Universe::heap()->prepare_for_verify();
|
|
||||||
Universe::verify(); // make sure we're starting with a clean slate
|
|
||||||
}
|
|
||||||
|
|
||||||
// All the flags that get adjusted by VM_Version_init and os::init_2
|
// All the flags that get adjusted by VM_Version_init and os::init_2
|
||||||
// have been set so dump the flags now.
|
// have been set so dump the flags now.
|
||||||
if (PrintFlagsFinal) {
|
if (PrintFlagsFinal) {
|
||||||
|
|
|
@ -3423,12 +3423,6 @@ jint Threads::create_vm(JavaVMInitArgs* args, bool* canTryAgain) {
|
||||||
// real raw monitor. VM is setup enough here for raw monitor enter.
|
// real raw monitor. VM is setup enough here for raw monitor enter.
|
||||||
JvmtiExport::transition_pending_onload_raw_monitors();
|
JvmtiExport::transition_pending_onload_raw_monitors();
|
||||||
|
|
||||||
if (VerifyBeforeGC &&
|
|
||||||
Universe::heap()->total_collections() >= VerifyGCStartAt) {
|
|
||||||
Universe::heap()->prepare_for_verify();
|
|
||||||
Universe::verify(); // make sure we're starting with a clean slate
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fully start NMT
|
// Fully start NMT
|
||||||
MemTracker::start();
|
MemTracker::start();
|
||||||
|
|
||||||
|
@ -3452,6 +3446,11 @@ jint Threads::create_vm(JavaVMInitArgs* args, bool* canTryAgain) {
|
||||||
}
|
}
|
||||||
|
|
||||||
assert (Universe::is_fully_initialized(), "not initialized");
|
assert (Universe::is_fully_initialized(), "not initialized");
|
||||||
|
if (VerifyBeforeGC && VerifyGCStartAt == 0) {
|
||||||
|
Universe::heap()->prepare_for_verify();
|
||||||
|
Universe::verify(); // make sure we're starting with a clean slate
|
||||||
|
}
|
||||||
|
|
||||||
EXCEPTION_MARK;
|
EXCEPTION_MARK;
|
||||||
|
|
||||||
// At this point, the Universe is initialized, but we have not executed
|
// At this point, the Universe is initialized, but we have not executed
|
||||||
|
|
45
hotspot/test/gc/TestVerifyBeforeGCDuringStartup.java
Normal file
45
hotspot/test/gc/TestVerifyBeforeGCDuringStartup.java
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
*
|
||||||
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
* accompanied this code).
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License version
|
||||||
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||||
|
* or visit www.oracle.com if you need additional information or have any
|
||||||
|
* questions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* @test TestVerifyBeforeGCDuringStartup.java
|
||||||
|
* @key gc
|
||||||
|
* @bug 8010463
|
||||||
|
* @summary Simple test run with -XX:+VerifyBeforeGC -XX:-UseTLAB to verify 8010463
|
||||||
|
* @library /testlibrary
|
||||||
|
*/
|
||||||
|
|
||||||
|
import com.oracle.java.testlibrary.OutputAnalyzer;
|
||||||
|
import com.oracle.java.testlibrary.ProcessTools;
|
||||||
|
|
||||||
|
public class TestVerifyBeforeGCDuringStartup {
|
||||||
|
public static void main(String args[]) throws Exception {
|
||||||
|
ProcessBuilder pb =
|
||||||
|
ProcessTools.createJavaProcessBuilder(System.getProperty("test.vm.opts"),
|
||||||
|
"-XX:-UseTLAB",
|
||||||
|
"-XX:+UnlockDiagnosticVMOptions",
|
||||||
|
"-XX:+VerifyBeforeGC", "-version");
|
||||||
|
OutputAnalyzer output = new OutputAnalyzer(pb.start());
|
||||||
|
output.shouldContain("[Verifying");
|
||||||
|
output.shouldHaveExitValue(0);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue