Tianji's Blog.

dubbo-problem

Word count: 305 / Reading time: 1 min
2019/01/15 Share

记录dubbo源码阅读过程中,看到的有趣的问题,以后有时间,在慢慢梳理

issuse#619

代码: org/apache/dubbo/rpc/RpcResult.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Override
public Object recreate() throws Throwable {
if (exception != null) {
// fix issue#619
try {
// get Throwable class
Class clazz = exception.getClass();
while (!clazz.getName().equals(Throwable.class.getName())) {
clazz = clazz.getSuperclass();
}
// get stackTrace value
Field stackTraceField = clazz.getDeclaredField("stackTrace");
stackTraceField.setAccessible(true);
Object stackTrace = stackTraceField.get(exception);
if (stackTrace == null) {
exception.setStackTrace(new StackTraceElement[0]);
}
} catch (Exception e) {
// ignore
}
throw exception;
}
return result;
}

原因分析:

https://github.com/edwardlee03/issue-case/blob/master/java/exception/10.%E6%97%A5%E5%BF%97%E6%9C%AA%E6%89%93%E5%8D%B0Java%E5%BC%82%E5%B8%B8%E5%A0%86%E6%A0%88%E8%B7%9F%E8%B8%AAstackTrace.md

简单来说:

1
JVM 为了性能会做优化,如果频繁地抛出某个异常,会重新编译,不再打印异常堆栈。 解决这个问题也比较简单,如果不想每次都去查前面的 log 去看堆栈, 只要在启动参数加上 -XX:-OmitStackTraceInFastThrow,就可以禁用该优化,强制打印异常堆栈。 这样可能会导致,log 文件过大,不过产线上今天之前的 log 文件都会被压缩,所以感觉问题也不大。
CATALOG
  1. 1. 记录dubbo源码阅读过程中,看到的有趣的问题,以后有时间,在慢慢梳理
    1. 1.1. issuse#619
    2. 1.2. 原因分析: