From d0426d7d41dca8757e04cddbfaae1d6fc4c97a45 Mon Sep 17 00:00:00 2001 From: Coleen Phillimore Date: Thu, 10 Mar 2016 14:20:59 -0500 Subject: [PATCH 1/4] 8150778: Reduce Throwable.getStackTrace() calls to the JVM Replace JVM_GetStackTraceDepth and JVM_GetStackTraceElement, with JVM_GetStackTraceElements that gets all the elements in the StackTraceElement[] Reviewed-by: dfuchs, mchung, shade, hseigel --- jdk/make/mapfiles/libjava/mapfile-vers | 3 +- jdk/make/mapfiles/libjava/reorder-sparc | 3 +- jdk/make/mapfiles/libjava/reorder-sparcv9 | 3 +- jdk/make/mapfiles/libjava/reorder-x86 | 3 +- .../classes/java/lang/StackTraceElement.java | 8 ++++- .../share/classes/java/lang/Throwable.java | 36 ++++++++----------- jdk/src/java.base/share/native/include/jvm.h | 9 ++--- .../share/native/libjava/Throwable.c | 16 +++------ 8 files changed, 34 insertions(+), 47 deletions(-) diff --git a/jdk/make/mapfiles/libjava/mapfile-vers b/jdk/make/mapfiles/libjava/mapfile-vers index ac21dd24890..852716aac1f 100644 --- a/jdk/make/mapfiles/libjava/mapfile-vers +++ b/jdk/make/mapfiles/libjava/mapfile-vers @@ -227,8 +227,7 @@ SUNWprivate_1.1 { Java_java_lang_System_setOut0; Java_java_lang_Thread_registerNatives; Java_java_lang_Throwable_fillInStackTrace; - Java_java_lang_Throwable_getStackTraceDepth; - Java_java_lang_Throwable_getStackTraceElement; + Java_java_lang_Throwable_getStackTraceElements; Java_java_security_AccessController_doPrivileged__Ljava_security_PrivilegedAction_2; Java_java_security_AccessController_doPrivileged__Ljava_security_PrivilegedAction_2Ljava_security_AccessControlContext_2; Java_java_security_AccessController_doPrivileged__Ljava_security_PrivilegedExceptionAction_2; diff --git a/jdk/make/mapfiles/libjava/reorder-sparc b/jdk/make/mapfiles/libjava/reorder-sparc index db653652f4f..6544e40393c 100644 --- a/jdk/make/mapfiles/libjava/reorder-sparc +++ b/jdk/make/mapfiles/libjava/reorder-sparc @@ -78,8 +78,7 @@ text: .text%Java_java_security_AccessController_doPrivileged__Ljava_security_Pri text: .text%JNU_GetEnv; text: .text%Java_java_io_UnixFileSystem_checkAccess; text: .text%Java_java_lang_reflect_Array_newArray; -text: .text%Java_java_lang_Throwable_getStackTraceDepth; -text: .text%Java_java_lang_Throwable_getStackTraceElement; +text: .text%Java_java_lang_Throwable_getStackTraceElements; text: .text%throwFileNotFoundException; text: .text%JNU_NotifyAll; # Test LoadFrame diff --git a/jdk/make/mapfiles/libjava/reorder-sparcv9 b/jdk/make/mapfiles/libjava/reorder-sparcv9 index d6e3a326b35..71e44cf938c 100644 --- a/jdk/make/mapfiles/libjava/reorder-sparcv9 +++ b/jdk/make/mapfiles/libjava/reorder-sparcv9 @@ -74,8 +74,7 @@ text: .text%Java_java_security_AccessController_doPrivileged__Ljava_security_Pri text: .text%JNU_GetEnv; text: .text%Java_java_io_UnixFileSystem_checkAccess; text: .text%Java_java_lang_reflect_Array_newArray; -text: .text%Java_java_lang_Throwable_getStackTraceDepth; -text: .text%Java_java_lang_Throwable_getStackTraceElement; +text: .text%Java_java_lang_Throwable_getStackTraceElements; text: .text%throwFileNotFoundException: OUTPUTDIR/io_util.o; text: .text%JNU_NotifyAll; # Test LoadFrame diff --git a/jdk/make/mapfiles/libjava/reorder-x86 b/jdk/make/mapfiles/libjava/reorder-x86 index 0728f662c03..5031cd133af 100644 --- a/jdk/make/mapfiles/libjava/reorder-x86 +++ b/jdk/make/mapfiles/libjava/reorder-x86 @@ -78,8 +78,7 @@ text: .text%Java_java_io_UnixFileSystem_checkAccess; text: .text%Java_sun_reflect_NativeMethodAccessorImpl_invoke0; text: .text%Java_java_io_FileInputStream_available; text: .text%Java_java_lang_reflect_Array_newArray; -text: .text%Java_java_lang_Throwable_getStackTraceDepth; -text: .text%Java_java_lang_Throwable_getStackTraceElement; +text: .text%Java_java_lang_Throwable_getStackTraceElements; text: .text%Java_java_lang_System_identityHashCode; text: .text%JNU_NotifyAll; # Test LoadFrame diff --git a/jdk/src/java.base/share/classes/java/lang/StackTraceElement.java b/jdk/src/java.base/share/classes/java/lang/StackTraceElement.java index 58738d83c8c..fa9758f3f22 100644 --- a/jdk/src/java.base/share/classes/java/lang/StackTraceElement.java +++ b/jdk/src/java.base/share/classes/java/lang/StackTraceElement.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2016, 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 @@ -74,6 +74,12 @@ public final class StackTraceElement implements java.io.Serializable { this.lineNumber = lineNumber; } + + /** + * Creates an empty stack frame element to be filled in by Throwable. + */ + StackTraceElement() { } + /** * Returns the name of the source file containing the execution point * represented by this stack trace element. Generally, this corresponds diff --git a/jdk/src/java.base/share/classes/java/lang/Throwable.java b/jdk/src/java.base/share/classes/java/lang/Throwable.java index 9d5f547c2a5..72a3455e637 100644 --- a/jdk/src/java.base/share/classes/java/lang/Throwable.java +++ b/jdk/src/java.base/share/classes/java/lang/Throwable.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1994, 2016, 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 @@ -118,7 +118,7 @@ public class Throwable implements Serializable { private static final long serialVersionUID = -3042686055658047285L; /** - * Native code saves some indication of the stack backtrace in this slot. + * The JVM saves some indication of the stack backtrace in this slot. */ private transient Object backtrace; @@ -211,6 +211,11 @@ public class Throwable implements Serializable { */ private StackTraceElement[] stackTrace = UNASSIGNED_STACK; + /** + * The JVM code sets the depth of the backtrace for later retrieval + */ + private transient int depth; + // Setting this static field introduces an acceptable // initialization dependency on a few java.util classes. private static final List SUPPRESSED_SENTINEL = Collections.emptyList(); @@ -828,10 +833,11 @@ public class Throwable implements Serializable { if (backtrace instanceof StackStreamFactory.StackTrace) { stackTrace = ((StackStreamFactory.StackTrace)backtrace).getStackTraceElements(); } else { - int depth = getStackTraceDepth(); stackTrace = new StackTraceElement[depth]; - for (int i = 0; i < depth; i++) - stackTrace[i] = getStackTraceElement(i); + for (int i = 0; i < depth; i++) { + stackTrace[i] = new StackTraceElement(); + } + getStackTraceElements(stackTrace); } } else if (stackTrace == null) { return UNASSIGNED_STACK; @@ -884,23 +890,11 @@ public class Throwable implements Serializable { } /** - * Returns the number of elements in the stack trace (or 0 if the stack - * trace is unavailable). - * - * package-protection for use by SharedSecrets. + * Gets the stack trace elements. + * @param elements + * @throws IndexOutOfBoundsException if {@code elements.length != depth } */ - native int getStackTraceDepth(); - - /** - * Returns the specified element of the stack trace. - * - * package-protection for use by SharedSecrets. - * - * @param index index of the element to return. - * @throws IndexOutOfBoundsException if {@code index < 0 || - * index >= getStackTraceDepth() } - */ - native StackTraceElement getStackTraceElement(int index); + private native void getStackTraceElements(StackTraceElement[] elements); /** * Reads a {@code Throwable} from a stream, enforcing diff --git a/jdk/src/java.base/share/native/include/jvm.h b/jdk/src/java.base/share/native/include/jvm.h index 99f7c7f8be4..968296604fb 100644 --- a/jdk/src/java.base/share/native/include/jvm.h +++ b/jdk/src/java.base/share/native/include/jvm.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2016, 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 @@ -171,11 +171,8 @@ JVM_IsSupportedJNIVersion(jint version); JNIEXPORT void JNICALL JVM_FillInStackTrace(JNIEnv *env, jobject throwable); -JNIEXPORT jint JNICALL -JVM_GetStackTraceDepth(JNIEnv *env, jobject throwable); - -JNIEXPORT jobject JNICALL -JVM_GetStackTraceElement(JNIEnv *env, jobject throwable, jint index); +JNIEXPORT void JNICALL +JVM_GetStackTraceElements(JNIEnv *env, jobject throwable, jobjectArray elements); /* * java.lang.StackWalker diff --git a/jdk/src/java.base/share/native/libjava/Throwable.c b/jdk/src/java.base/share/native/libjava/Throwable.c index 768c7e114a4..9944d48af19 100644 --- a/jdk/src/java.base/share/native/libjava/Throwable.c +++ b/jdk/src/java.base/share/native/libjava/Throwable.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1994, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1994, 2016, 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 @@ -50,15 +50,9 @@ Java_java_lang_Throwable_fillInStackTrace(JNIEnv *env, jobject throwable, jint d return throwable; } -JNIEXPORT jint JNICALL -Java_java_lang_Throwable_getStackTraceDepth(JNIEnv *env, jobject throwable) +JNIEXPORT void JNICALL +Java_java_lang_Throwable_getStackTraceElements(JNIEnv *env, + jobject throwable, jobjectArray elements) { - return JVM_GetStackTraceDepth(env, throwable); -} - -JNIEXPORT jobject JNICALL -Java_java_lang_Throwable_getStackTraceElement(JNIEnv *env, - jobject throwable, jint index) -{ - return JVM_GetStackTraceElement(env, throwable, index); + JVM_GetStackTraceElements(env, throwable, elements); } From ec2bb17be5155709168ee8fddc7397be25020d99 Mon Sep 17 00:00:00 2001 From: Yasumasa Suenaga Date: Fri, 4 Mar 2016 18:13:04 +0900 Subject: [PATCH 2/4] 8151181: Add JSnap to jhsdb Reviewed-by: dsamersoff --- jdk/test/sun/tools/jhsdb/BasicLauncherTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/jdk/test/sun/tools/jhsdb/BasicLauncherTest.java b/jdk/test/sun/tools/jhsdb/BasicLauncherTest.java index 37dd7ec0131..afba30c6055 100644 --- a/jdk/test/sun/tools/jhsdb/BasicLauncherTest.java +++ b/jdk/test/sun/tools/jhsdb/BasicLauncherTest.java @@ -143,6 +143,7 @@ public class BasicLauncherTest { launch("No deadlocks found", "jstack"); launch("compiler detected", "jmap"); launch("Java System Properties", "jinfo"); + launch("java.threads", "jsnap"); // The test throws RuntimeException on error. // IOException is thrown if LingeredApp can't start because of some bad From 570f4df3f1be0f6438a0b207c08f54109013c00e Mon Sep 17 00:00:00 2001 From: Yasumasa Suenaga Date: Tue, 15 Mar 2016 12:27:26 +0900 Subject: [PATCH 3/4] 8151709: jhsdb should show help message in SALauncher Reviewed-by: dsamersoff --- jdk/test/sun/tools/jhsdb/SAGetoptTest.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/jdk/test/sun/tools/jhsdb/SAGetoptTest.java b/jdk/test/sun/tools/jhsdb/SAGetoptTest.java index 60ff9fffc68..736b839e071 100644 --- a/jdk/test/sun/tools/jhsdb/SAGetoptTest.java +++ b/jdk/test/sun/tools/jhsdb/SAGetoptTest.java @@ -152,5 +152,8 @@ public class SAGetoptTest { String[] optionSet6 = {"--exe", "--core", "bla_core"}; badOptionsTest(6, optionSet6, "Argument is expected for 'exe'"); + + String[] optionSet7 = {"--exe"}; + badOptionsTest(7, optionSet7, "Argument is expected for 'exe'"); } } From d6328fbb3ed3b8352b0adaab5f1fe077d2cf2f32 Mon Sep 17 00:00:00 2001 From: Claes Redestad Date: Thu, 17 Mar 2016 10:26:59 +0100 Subject: [PATCH 4/4] 8152074: Avoid lambda usage in StringConcatFactory initializer Reviewed-by: shade, forax, chegar --- .../java/lang/invoke/StringConcatFactory.java | 24 +++++++------------ 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/StringConcatFactory.java b/jdk/src/java.base/share/classes/java/lang/invoke/StringConcatFactory.java index 5fb5277e798..853db2cbf73 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/StringConcatFactory.java +++ b/jdk/src/java.base/share/classes/java/lang/invoke/StringConcatFactory.java @@ -34,11 +34,11 @@ import jdk.internal.misc.Unsafe; import java.lang.invoke.MethodHandles.Lookup; import java.security.AccessController; -import java.security.PrivilegedAction; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.function.Function; +import sun.security.action.GetPropertyAction; import static jdk.internal.org.objectweb.asm.Opcodes.*; @@ -188,20 +188,14 @@ public final class StringConcatFactory { private static final ProxyClassesDumper DUMPER; static { - // Poke the privileged block once, taking everything we need: - final Object[] values = new Object[4]; - AccessController.doPrivileged((PrivilegedAction) () -> { - values[0] = System.getProperty("java.lang.invoke.stringConcat"); - values[1] = Boolean.getBoolean("java.lang.invoke.stringConcat.cache"); - values[2] = Boolean.getBoolean("java.lang.invoke.stringConcat.debug"); - values[3] = System.getProperty("java.lang.invoke.stringConcat.dumpClasses"); - return null; - }); - - final String strategy = (String) values[0]; - CACHE_ENABLE = (Boolean) values[1]; - DEBUG = (Boolean) values[2]; - final String dumpPath = (String) values[3]; + final String strategy = AccessController.doPrivileged( + new GetPropertyAction("java.lang.invoke.stringConcat")); + CACHE_ENABLE = Boolean.parseBoolean(AccessController.doPrivileged( + new GetPropertyAction("java.lang.invoke.stringConcat.cache"))); + DEBUG = Boolean.parseBoolean(AccessController.doPrivileged( + new GetPropertyAction("java.lang.invoke.stringConcat.debug"))); + final String dumpPath = AccessController.doPrivileged( + new GetPropertyAction("java.lang.invoke.stringConcat.dumpClasses")); STRATEGY = (strategy == null) ? DEFAULT_STRATEGY : Strategy.valueOf(strategy); CACHE = CACHE_ENABLE ? new ConcurrentHashMap<>() : null;