当前位置: 首页 > 知识库问答 >
问题:

HttpUrlConnection在CentOS上运行时占用100%的CPU

杜俊逸
2023-03-14

我有一个HttPURLConnection程序,它正在与运行在同一台机器上(本例中是CentOS)但部署在其他tomcat服务器上的某个应用程序建立连接。这意味着在部署在不同tomcats上的两个应用程序之间建立了HttpConnection,其中两个tomcats都运行在同一台机器上。

下面是我的代码:

public String sendHttpGetReq(String urlParameters,String msisdn, InNodeConfig inNodeConfig, InNodeDetails inNodeDetails)
{
    Logger.sysLog(LogValues.info, this.getClass().getName(),"["+msisdn+"] Inside sendHttpGetReq");
    String response = "";
    //response =  "{\"id\":\"584371732\",\"status_billing\":\"INSUFFICIENT_FUNDS\",\"status_sms\":\"NO_SMS\"}";
    String url = "";
    URL obj = null;
    HttpURLConnection con = null;
    try
    {
        url = "http://"+inNodeConfig.getServerIp()+":"+inNodeConfig.getServerPort()+inNodeConfig.getServiceUri();
        url = url+urlParameters;
        Logger.sysLog(LogValues.info, this.getClass().getName(),"["+msisdn+"] url = "+url);
        obj = new URL(url);
        con = (HttpURLConnection) obj.openConnection();     

        con.setDoOutput(true);
        con.setRequestMethod("GET");
        con.setConnectTimeout(Integer.parseInt(inNodeConfig.getConTimeOut()));
        con.setReadTimeout(Integer.parseInt(inNodeConfig.getConTimeOut())+1000);

        int responseCode = con.getResponseCode();
        Logger.sysLog(LogValues.info, this.getClass().getName(),"["+msisdn+"] HTTP Response Code : " + responseCode);
        Logger.sysLog(LogValues.info, this.getClass().getName(),"["+msisdn+"] HTTP Response message : " + con.getResponseMessage());

        if(responseCode == 202 || responseCode == 200)
        {   
            BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
            String inputLine;
            StringBuffer responseBf = new StringBuffer();

            while ((inputLine = in.readLine()) != null) {
                responseBf.append(inputLine);
            }
            in.close();

            Logger.sysLog(LogValues.info, this.getClass().getName(),"["+msisdn+"] Response received = "+responseBf.toString());

            response = responseBf.toString();
            responseBf = null;
            if(inNodeDetails.getOperator().equalsIgnoreCase("digicel"))
            {
                if(response.startsWith("Received"))
                {
                    response = "ok";
                }
                else if(response.startsWith("{"))
                {
                    // {"id":"185688","status_billing":"INSUFFICIENT_FUNDS","status_sms":"FAILED"}
                    Logger.sysLog(LogValues.APP_DEBUG, this.getClass().getName(),"["+msisdn+"] Parsing json response.");
                    Gson gson = new Gson(); 
                    JsonResponse jsonResponse = gson.fromJson(response, JsonResponse.class);

                    if(jsonResponse.getStatus_billing().equalsIgnoreCase("ok") || jsonResponse.getStatus_billing().contains("SUCCESS")){
                        response="ok";
                    }
                    else if(jsonResponse.getStatus_billing().equalsIgnoreCase("INSUFFICIENT_FUNDS"))
                    {
                        Logger.sysLog(LogValues.APP_DEBUG, this.getClass().getName(),"["+msisdn+"] Response received for INSUFFICIENT_FUNDS.");
                        response = "low balance";
                    }
                    else if(jsonResponse.getStatus_billing().equalsIgnoreCase("FAILED"))
                    {
                        Logger.sysLog(LogValues.APP_DEBUG, this.getClass().getName(),"["+msisdn+"] Failure Response received for some other reason.");
                        response = "nok";
                    }           
                    else
                    {
                        if(inNodeDetails.getCountry().equalsIgnoreCase("JAM")||inNodeDetails.getCountry().equalsIgnoreCase("HAI")){
                            response=jsonResponse.getStatus_billing();
                        }
                        else{
                            gson = null;
                            jsonResponse = null;
                        }

                    }
                }
                else
                {
                    if(inNodeDetails.getCountry().equalsIgnoreCase("HAI") && response.contains("EXCEPTION"))
                    {
                        response = "ok";
                    }
                    else
                    {
                    Logger.sysLog(LogValues.APP_DEBUG, this.getClass().getName(),"["+msisdn+"] Unknown response.");
                    response = "nok";
                    }
                }
            }
        }
        else if(responseCode == 502 || responseCode == 500)
        {
            if(inNodeDetails.getCountry().equalsIgnoreCase("HAI") || inNodeDetails.getCountry().equalsIgnoreCase("JAM"))
            {
                response = "ok";
            }
            else
            {
                response = "nok";
            }

        }
        else
        {
            response = "nok";
            /*Map<String,List<String>> responseMap = con.getHeaderFields();
            for (Map.Entry entry : responseMap.entrySet()) {
                Logger.sysLog(LogValues.APP_DEBUG, Utility.class.getName(), "header key = "+entry.getKey() + " value = " + entry.getValue());
            }*/
        }

        return response;
    }
    catch(SocketTimeoutException ex)
    {
        Logger.sysLog(LogValues.APP_DEBUG, Utility.class.getName(), "Read Timeout occurs for msisdn = "+msisdn);
        return "ReadTimeout";
    }
    catch(ConnectTimeoutException ex1)
    {
        Logger.sysLog(LogValues.APP_DEBUG, Utility.class.getName(), "ConnectTimeoutException occurs for msisdn = "+msisdn);
        return "ConnectionTimeout";
    }
    catch(ConnectException ex2)
    {
        Logger.sysLog(LogValues.APP_DEBUG, Utility.class.getName(), "ConnectException occurs for msisdn = "+msisdn);
        return "ConnectionTimeout";
    }
    catch(JsonSyntaxException ex3){
        response=null;
        return response;
    }
    catch(MalformedJsonException ex4){
        response=null;
        return response;
    }
    catch(Exception e)
    {
        Logger.sysLog(LogValues.error, this.getClass().getName(),"["+msisdn+"] Internal Error occured"+coreException.GetStack(e));
        return response;
    }
    finally
    {
        response = null;
        url = null;
        obj = null;
        con.disconnect();
        Logger.sysLog(LogValues.APP_DEBUG, this.getClass().getName(),"Calling GC.");
        System.gc();
    }
    //return response;

}

然而,同样的代码在生产环境中运行得非常好,每秒大约有50个请求。

当我使用JVisualVM和Sampler时,我了解到这个方法“SendHttpGetReq”需要很长的时间和很高的CPU处理。但是从代码中,我找不到代码应该阻塞所有CPU的具体原因。

请提出问题是什么?

共有1个答案

尉迟轶
2023-03-14

我认为最终被调用的System.gc()方法可能会导致这个问题。建议您注释system.gc()并试用它。

 类似资料:
  • 我在应用程序中使用。在环境中运行应用程序时,应用程序使用的不足1%。当同一个应用程序在我的服务器上运行时,它将使用100%的。当禁用线程时,将恢复正常。 我正在使用和。 下面是线程: 为什么要使用100%的?

  • Java(TM)SE运行时环境(构建1.7.0_40-B43) Java HotSpot(TM)64位服务器VM(构建24.0-b56,混合模式 我们有相同技术的其他应用程序,但没有问题。 -xms1g-xmx1g-xx:+heapdumponoutofmemoryerror-xx:+useparngc-xx:+useconcmarksweepgc-xx:+printgcdetails-xx:+p

  • 我能够在非GUI centos/linux机器上以无头模式运行selenium。 我一直在尝试通过传递下面的chromeoptions参数来使用cache enable运行它。 chromeOptions。addArguments(“用户数据目录=~/.config/google chrome”); 它已经开始罚款和识别元素,直到登录页面(这是第一页),并且无法识别任何定位器之后。 运行启用缓存的

  • 问题内容: 我想在Centos 7上运行Redis的多个实例。有人可以指出我的正确链接或在此处发布步骤。 我在Google上搜索了该信息,但没有找到任何相关信息。 问题答案: 您可以在单台计算机上使用不同的端口运行Redis的多个实例。如果这与您有关,则可以按照以下步骤操作。 通过安装第一个Redis实例,默认情况下它会监听。 对于第二实例,创建一个新的工作目录 默认的Redis实例用作其工作目录

  • 我有一个包含单个面板的JFrame。在面板中,我使用paintComponent方法根据JFrame的大小调整其元素的大小。JPanel的元素是一个作为背景的图像和4个JLabel,它包含4个ImageIcon,工作方式类似于按钮。Jpanel的方法paintComponent如下所示 这个框架只有一个简单的方法,add(myPanel)所以我没有在这里写它。当我运行这个应用程序时,它占用了我大约

  • 问题内容: 我确实有一个jenkins实例,它陷入了某种无休止的循环,没有任何可见的活动。 我可以获得正在运行的进程的信息,那么如何生成可用于错误报告的跟踪? 我在linux上运行。 问题答案: 尝试使用jstack。它会为您提供线程正在执行的操作的完整列表。它所需要的只是进程pid。