【发布时间】:2020-10-16 23:06:45
【问题描述】:
在服务器端和本地编译相同的源码,为finally块生成不同的字节码
服务器编译的字节码:
L70
LINENUMBER 243 L70
INVOKESTATIC com/demo/utils/DashboardManager.log (Ljava/lang/String;JLjava/util/Map;)V
L71
LINENUMBER 245 L71
ALOAD 9
ATHROW
L47
LINENUMBER 246 L47
FRAME CHOP 2
ALOAD 2
ARETURN
本地编译的字节码:
L70
LINENUMBER 243 L70
INVOKESTATIC com/demo/utils/DashboardManager.log (Ljava/lang/String;JLjava/util/Map;)V
ALOAD 9
ATHROW
L47
LINENUMBER 246 L47
FRAME CHOP 2
ALOAD 2
ARETURN
服务器版本多两行声明:
L71
LINENUMBER 245 L71
哪些因素可能导致这种差异?
源代码:
235: } catch (Exception ex) {
236: CLogManager.error(logLocal, ex, addInfo);
237: response = BuildServiceResponse.BuildErrorResponse(UserInfoStatusCode.ServerException, ex.getMessage());
238: } finally {
239: metricTags.put("status", null == response ? "-1" : response.resultMsg);
240: metricTags.put("code", null == response ? "-1" : String.valueOf(response.resultCode));
241: DashboardManager.log(TokenServiceMetric.GetUserInfoShare_RequestCount, 1, metricTags);
242: DashboardManager.log(TokenServiceMetric.GetUserInfoShare_ResponseCount, 1, metricTags);
243: DashboardManager.log(TokenServiceMetric.GetUserInfoShare_CostTime,
244: System.currentTimeMillis() - beginTime, metricTags);
245: }
246: return response;
247: }
【问题讨论】:
-
每种情况下使用了哪些 javac 版本(包括次要版本)?
-
我看到的唯一区别是“隐形”重新投掷归因于哪一行,我想说无论如何基本上没有意义。生成不同的字节码是一个问题还是你只是好奇?如果这是一个问题,那么您当然必须确保双方使用完全相同的软件和配置才能有机会获得相同的字节码。
-
@Michael 都是 1.8.0-144
标签: java jvm code-coverage bytecode try-catch-finally