8211821: PrintStringTableStatistics crashes JVM

During JVM exit, print the Symbol and String tables before current thread gets deleted.

Reviewed-by: iklam, dholmes
This commit is contained in:
Harold Seigel 2018-10-11 11:31:37 -04:00
parent 945623c998
commit 2e5653c166
3 changed files with 47 additions and 7 deletions

View File

@ -575,9 +575,6 @@ void vm_direct_exit(int code) {
}
void vm_perform_shutdown_actions() {
// Warning: do not call 'exit_globals()' here. All threads are still running.
// Calling 'exit_globals()' will disable thread-local-storage and cause all
// kinds of assertions to trigger in debug mode.
if (is_init_completed()) {
Thread* thread = Thread::current_or_null();
if (thread != NULL && thread->is_Java_thread()) {

View File

@ -4212,10 +4212,10 @@ void JavaThread::invoke_shutdown_hooks() {
// <-- do not use anything that could get blocked by Safepoint -->
// + Disable tracing at JNI/JVM barriers
// + Set _vm_exited flag for threads that are still running native code
// + Delete this thread
// + Call exit_globals()
// > deletes tty
// > deletes PerfMemory resources
// + Delete this thread
// + Return to caller
bool Threads::destroy_vm() {
@ -4291,6 +4291,9 @@ bool Threads::destroy_vm() {
notify_vm_shutdown();
// exit_globals() will delete tty
exit_globals();
// We are after VM_Exit::set_vm_exited() so we can't call
// thread->smr_delete() or we will block on the Threads_lock.
// Deleting the shutdown thread here is safe because another
@ -4304,9 +4307,6 @@ bool Threads::destroy_vm() {
}
#endif
// exit_globals() will delete tty
exit_globals();
LogConfiguration::finalize();
return true;

View File

@ -0,0 +1,43 @@
/*
* Copyright (c) 2018, 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.
*/
import jdk.test.lib.process.ProcessTools;
import jdk.test.lib.process.OutputAnalyzer;
/*
* @test PrintStringTableStatsTest
* @bug 8211821
* @library /test/lib
* @run main PrintStringTableStatsTest
*/
public class PrintStringTableStatsTest {
public static void main(String... args) throws Exception {
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
"-XX:+PrintStringTableStatistics",
"--version");
OutputAnalyzer output = new OutputAnalyzer(pb.start());
output.shouldContain("Number of buckets");
output.shouldHaveExitValue(0);
}
}