--- old/jdk/src/java.base/share/classes/java/lang/Throwable.java 2015-11-09 17:14:53.000000000 -0800 +++ new/jdk/src/java.base/share/classes/java/lang/Throwable.java 2015-11-09 17:14:53.000000000 -0800 @@ -24,6 +24,8 @@ */ package java.lang; +import sun.misc.VM; + import java.io.*; import java.util.*; @@ -778,7 +780,11 @@ public synchronized Throwable fillInStackTrace() { if (stackTrace != null || backtrace != null /* Out of protocol state */ ) { - fillInStackTrace(0); + if (backtrace == null && StackStreamFactory.useStackTrace(this)) { + backtrace = StackStreamFactory.makeStackTrace(this); + } else { + fillInStackTrace(0); + } stackTrace = UNASSIGNED_STACK; } return this; @@ -819,10 +825,14 @@ // backtrace if this is the first call to this method if (stackTrace == UNASSIGNED_STACK || (stackTrace == null && backtrace != null) /* Out of protocol state */) { - int depth = getStackTraceDepth(); - stackTrace = new StackTraceElement[depth]; - for (int i=0; i < depth; i++) - stackTrace[i] = getStackTraceElement(i); + 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); + } } else if (stackTrace == null) { return UNASSIGNED_STACK; }