WebSphere 8内存泄漏

2022-03-04 00:00:00 memory-leaks soap java websphere axis2

我在WebSphere8.5上部署了一个应用程序(该应用程序是使用java8/Spring4开发的),并且每天都会收到许多转储文件,因此我决定使用Eclipse Memory Analyzer对其进行分析,结果是:

问题是我没有使用AXIS来调用Web服务,我只使用Jersy来调用睡觉Web服务,并且 SOAP Web服务的默认JDK类SoapConnection,以下是一些代码示例: 对于SOAP:

public String soapBind(List<ContextItem> dic, String serviceId, String urlWs, String applicationId) throws SOAPException, Exception {
    try {
        SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance();
        SOAPConnection soapConnection = soapConnectionFactory.createConnection();
        SOAPMessage msg = soapCall(dic, serviceId, applicationId); // Send SOAP Message to SOAP Server

        String url = urlWs;
        LOGGER.info("CALLING WS ....");
        SOAPMessage soapResponse = soapConnection.call(msg, url);

        // print SOAP Response
       
        //soapResponse.writeTo(System.out);
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        soapResponse.writeTo(out);
        soapConnection.close();

        String strMsg = new String(out.toByteArray());
        LOGGER.info("Response SOAP Message: {}",strMsg);
        return strMsg;

    } catch (SOAPException ex) {
        throw ex;
    } catch (UnsupportedOperationException ex) {
        throw ex;
    } catch (Exception ex) {
        throw ex;
    }
}

睡觉:

Client client = Client.create();
 WebResource webResource = client
 .resource(urlFicheClientProf);
//
 ServiceContext serviceContext = this.getServiceContext();
//
ObjectMapper mapper = new ObjectMapper();

 ClientResponse response = webResource
 .queryParam("customerId", radical)
 .queryParam("serviceContext",
 URLEncoder.encode(mapper.writeValueAsString(serviceContext),
 "UTF-8"))
 .post(ClientResponse.class);

我想知道为什么会发生Axis.Client内存不足,以及如何修复它。如果有人能帮我弄清楚,我将不胜感激。


解决方案

使用RESTTemplate而不是SOAPConnection修复了内存泄漏:

   final RestTemplate restTemplate = new RestTemplate();
            final HttpHeaders headers = new HttpHeaders();
            headers.add("Content-Type", "text/xml");
            final HttpEntity<String> request = new HttpEntity<>(message, headers);
            final String result = restTemplate.postForObject(wsUrl, request, String.class);
            return result;

相关文章