生产环境 e.printStackTrace 导致的 控制台阻塞,导致的请求一致pending无返回
首先该服务是使用java 调用控制台脚本启动的jar包
同时java调用 服务的控制部分也理所应当的
Process process = null; try { process = Runtime.getRuntime().exec(cmd, null, null); process.getOutputStream().close(); BufferedReader output = new BufferedReader(new InputStreamReader(process.getInputStream(), System.getProperty("sun.jnu.encoding"))); BufferedReader outputErr = new BufferedReader(new InputStreamReader(process.getErrorStream(), System.getProperty("sun.jnu.encoding"))); String line = ""; Long l1 = 0L; Long l2 = 0L; while ((line = output.readLine()) != null) { l1++; log.debug(line); System.out.println(line); } while ((line = outputErr.readLine()) != null) { l2++; log.debug(line); System.out.println(line); } process.waitFor(); outputErr.close(); output.close(); } catch (Exception e) { log.error(entity.getServiceName() + errMsg, e); } finally { if (process != null) { process.destroy(); } }
OutputStream、InputStream,ErrorStream 都处理过了
但是还是在 e.printStackTrace 导致了服务请求pending,而且不是高压测试,只是一个请求马上就无返回了。
调查后发现,传进来的System.err 会被 lock()
private void printStackTrace(Throwable.PrintStreamOrWriter var1) { Set var2 = Collections.newSetFromMap(new IdentityHashMap()); var2.add(this); synchronized(var1.lock()) { var1.println(this); StackTraceElement[] var4 = this.getOurStackTrace(); StackTraceElement[] var5 = var4; int var6 = var4.length; int var7; for(var7 = 0; var7 < var6; ++var7) { StackTraceElement var8 = var5[var7]; var1.println("\tat " + var8); } Throwable[] var11 = this.getSuppressed(); var6 = var11.length; for(var7 = 0; var7 < var6; ++var7) { Throwable var13 = var11[var7]; var13.printEnclosedStackTrace(var1, var4, "Suppressed: ", "\t", var2); } Throwable var12 = this.getCause(); if (var12 != null) { var12.printEnclosedStackTrace(var1, var4, "Caused by: ", "", var2); } } }
第一次进来之后。在
for(var7 = 0; var7 < var6; ++var7) { StackTraceElement var8 = var5[var7]; var1.println("\tat " + var8); }
卡住了没往下走,导致之后的都没拿到锁,锁一直被占用了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构