« Return to Thread: [jira] Created: (DBCP-294) Memory leak in XA Implementation

[jira] Commented: (DBCP-294) Memory leak in XA Implementation

by JIRA jira@apache.org :: Rate this Message:

Reply to Author | View in Thread


    [ https://issues.apache.org/jira/browse/DBCP-294?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12719267#action_12719267 ]

Philippe Mouawad commented on DBCP-294:
---------------------------------------

After investigating more deeply I understood what was happening.

1) In Ofbiz configuration the DBCP evictor Thread is configured.
2) When that thread runs, it kills down idle connection => THIS IS THE PROBLEM
3) TransactionRegistry holds a through LocalXAResource a reference on a connection created by DriverConnectionFactory
4) When evictor kill down a PoolableConnection calling reallyClose(), the underlying JDBC connection does not unregister from TransactionRegistry#xaResources provoking the leak.

I send a TestCase that reproduces the bug, here necessary elements:
Script for Postgres:

CREATE TABLE cb_memory_monitoring_info"(
mmi_id int8 PRIMARY KEY not null,
mmi_console_id varchar not null,
mmi_name varchar not null,
mmi_date timestamp not null,
mmi_value int4)


Run TestBug with:
-Dcom.sun.management.jmxremote -Xmx4m -Xms4m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=C:/temp

It will generate a heapDump after some seconds, look a TransactionRegistry#xaResources size, it will be around 110 elements


Then run TestBugPatch with:
-Dcom.sun.management.jmxremote -Xmx4m -Xms4m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=C:/temp

It will never run out of memory, TransactionRegistry#xaResources never grows over

Philippe Mouawad
http://www.ubik-ingenierie.com

> Memory leak in XA Implementation
> --------------------------------
>
>                 Key: DBCP-294
>                 URL: https://issues.apache.org/jira/browse/DBCP-294
>             Project: Commons Dbcp
>          Issue Type: Bug
>    Affects Versions: 1.3, 1.4, 2.0
>         Environment: JDK5, Oracle 10G
>            Reporter: Philippe Mouawad
>            Priority: Critical
>         Attachments: patch-TransactionRegistry.txt, PoolableManagedConnection.java, PoolableManagedConnectionFactory.java
>
>
> Hello,
> We are been using Ofbiz with DBCP based implementation.
> Ofbiz uses a Head revision of DBCP (package org.apache.commons.dbcp.managed is the same as current TRUNK) and geronimo-transaction-1.0.
> We are having recurrent OutOfMemory which occur on a 2 days basis.
> I analyzed the Heap Dump and I think have found the source of the problem:
> The Heap Dump shows a Retained Heap of 400Mo by org.apache.commons.dbcp.managed.TransactionRegistry#xaResources field.
> After analyzing more deeply, the leak seems to come from what is stored in xaResources through
> xaResources.put(connection, xaResource);
> Values inside weak Hash map  will never be removed since XAResource holds a STRONG reference on key (connection) through:
> org.apache.commons.dbcp.managed.LocalXAConnectionFactory$LocalXAResource through:
> public LocalXAResource(Connection localTransaction) {
>             this.connection = localTransaction;
>         }
> Found in WeakHashMap javadoc:
> Implementation note: The value objects in a WeakHashMap are held by ordinary strong references. >>>>>>>>>>>>>Thus care should be taken to ensure that value objects do not strongly refer to their own keys <<<<<<<<, either directly or indirectly, since that will prevent the keys from being discarded. Note that a value object may refer indirectly to its key via the WeakHashMap itself; that is, a value object may strongly refer to some other key object whose associated value object, in turn, strongly refers to the key of the first value object. One way to deal with this is to wrap values themselves within WeakReferences before inserting, as in: m.put(key, new WeakReference(value)), and then unwrapping upon each get.
> Philippe Mouawad
> http://www.ubik-ingenierie.com

--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

 « Return to Thread: [jira] Created: (DBCP-294) Memory leak in XA Implementation