生产环境 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); }
卡住了没往下走,导致之后的都没拿到锁,锁一直被占用了

浙公网安备 33010602011771号