You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by "Dies Koper (JIRA)" <ax...@ws.apache.org> on 2006/03/03 04:10:40 UTC
[jira] Commented: (AXIS-2266) Axis Memory leak in v1.3
[ http://issues.apache.org/jira/browse/AXIS-2266?page=comments#action_12368640 ]
Dies Koper commented on AXIS-2266:
----------------------------------
It is difficult to investigate a memory leak with only a client.
If you would like someone to look at your problem, please provide a complete test application (WSDL + client + impl) that shows the memory leak (when run long enough, or when run in a profiler).
The problem occurs at the client side? Server? Both?
> Axis Memory leak in v1.3
> ------------------------
>
> Key: AXIS-2266
> URL: http://issues.apache.org/jira/browse/AXIS-2266
> Project: Apache Axis
> Type: Bug
> Components: Basic Architecture
> Environment: Solaris and Windows
> Reporter: Alan Yu
> Priority: Critical
> Attachments: SOAPInboxStorageHelper.java, memory_leak.GIF
>
> We had a memory leak problem in the old axis version 1.1. But due to the low traffic, we didn't quite notice it. 3 weeks ago, the traffic is increased and this problem had emerged.
> I did some investigation and used the Optimizeit to do profiling. I then decided to upgrade to latest 1.3 which the release notes claims the memory leak problem is fixed.
> But unfortunately, this is still there.
> We use axis to send a request to do login validation on a remote web site. No stubs is generated. The code is simple as follows:
> public InboxStorageAccessResult prepareInboxStorageAccess(
> String url, String inboxDID, long inboxServiceKey, String domain, String site)
> throws J2ContainerException, PoolExhaustedException
> {
> String[] loginParameters = null;
> try {
> SOAPConnection connection = getConnection();
> Service service = null;
> try {
> service = connection.getService();
> Call call = service.createCall();
> if (log.isDebugEnabled()) {
> log.debug("Initiating SOAP call. Address=" + url);
> }
> call.setTargetEndpointAddress(url);
> call.setOperationName(new QName(loginUrn, "login"));
> loginParameters = new String[] {
> loginId,
> loginPassword,
> inboxDID,
> domain, // domain.
> inboxServiceKey + "",
> site
> };
> if (log.isDebugEnabled()) {
> log.debug("calling: \t" + url);
> log.debug("method: \t" + loginUrn);
> log.debug("loginId= " + loginId +
> "; loginPassword=" + loginPassword +
> "; inboxDID = " + inboxDID +
> "; domain =" + domain +
> "; inboxServiceKey = " + inboxServiceKey);
> }
> String soapResult = ((String) call.invoke(loginParameters));
> return new InboxStorageAccessResult(soapResult);
> } finally {
> try {
> connection.cleanup(service);
> } catch (ConfigurationException e) {
> log.error("ConfigurationException: loginParameters: " + StringUtil.joinWithCommas(loginParameters), e);
> throw new TwaRemoteException("Call to electric mail login failed", e);
> }
> returnConnection(connection);
> }
> } catch (ServiceException ex) {
> log.error("ServiceException: loginParameters: " + StringUtil.joinWithCommas(loginParameters), ex);
> throw new TwaRemoteException("Call to electric mail login failed", ex);
> } catch (RemoteException ex) {
> log.error("RemoteException: loginParameters: " + StringUtil.joinWithCommas(loginParameters), ex);
> throw new TwaRemoteException("Call to electric mail login failed", ex);
> }
> }
> The leak are at char[], int[], String and java.util.Hashtable. The attached profiler snapshot is a trace for leak from Hashtable.
> I tried to add a few cleanup method like below
> public void cleanup(Service service) throws AxisFault,
> ConfigurationException {
> log.debug("[in] axisCleanup");
> if ( service == null ) {
> log.debug("service null");
> return;
> }
> AxisEngine ae = service.getEngine();
> if ( ae == null ) {
> log.debug("axisEngine is null");
> return;
> }
>
> MessageContext mc = ae.getCurrentMessageContext();
> if (mc != null &&
> mc.getRequestMessage() != null &&
> mc.getRequestMessage().getSOAPEnvelope() != null)
> {
> log.debug("****** clean envelope ******");
> mc.getRequestMessage().getSOAPEnvelope().removeBody();
> mc.getRequestMessage().getSOAPEnvelope().removeContents();
> mc.getRequestMessage().getSOAPEnvelope().removeHeaders();
> if ( mc.getRequestMessage().getSOAPEnvelope().getRecorder() != null) {
> log.debug("****** clean recorder ******");
> mc.getRequestMessage().getSOAPEnvelope().getRecorder().clear();
> }
> } else {
> log.debug("no envelope is available");
> }
> ae.cleanup();
> if (ae.getGlobalRequest() != null) {
> ae.getGlobalRequest().cleanup();
> }
> if (ae.getGlobalResponse() != null) {
> ae.getGlobalResponse().cleanup();
> }
> }
> but it doesn't help. The envelope part is null and I got "no envelope is available" from my debug printout.
> Because of this memory leak, we have to restart our web server once a day.
> I'd appreciate it if you can provide any solution to fix the problem.
> Thanks,
> -Alan
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira