生产环境 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);
            }

卡住了没往下走,导致之后的都没拿到锁,锁一直被占用了

posted @   佩洛君  阅读(225)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示