Memory Leak in GenericLockManager
---------------------------------

                 Key: TRANSACTION-30
                 URL: https://issues.apache.org/jira/browse/TRANSACTION-30
             Project: Commons Transaction
          Issue Type: Bug
    Affects Versions: 1.2
         Environment: Linux 32-bit, JDK 1.5
            Reporter: Bojan Vukojevic
            Priority: Minor


Generic lock manager has a memory leak. Actually 2 memory leaks. Locks for the 
transaction are kept in the set. They are removed from the set, but the set is 
not removed from the map. Although the set is empty at the end of the 
transaction memory that was allocated for it while it was keeping locks is not 
released. Java only increases the memory used for the set and never releases 
it. That is why code must remove the reference to the set so that the whole set 
is garbage collected and memory is freed. 

For the second issue locks are not removed from the globalLocks table because 
the object that is the key in this table is a resource id, and the code is 
passing the whole lock object as the key.

Both fixes are shown below:

@@ -329,6 +329,12 @@
                 GenericLock lock = (GenericLock) it.next();
                 lock.release(ownerId);
                 locks.remove(lock);
+                removeLock(lock);
+            }
+            synchronized (locks) {
+                if(locks.isEmpty()) {
+                     globalOwners.remove(ownerId);
+                }         
             }
         }
     }
@@ -484,7 +490,9 @@
 
     public void removeLock(MultiLevelLock lock) {
         synchronized (globalLocks) {
-            globalLocks.remove(lock);
+            if(lock != null && lock instanceof GenericLock  && 
((GenericLock)lock).getResourceId() != null) {
+                globalLocks.remove(((GenericLock)lock).getResourceId());
+            }
         }
     }
     






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

Reply via email to