T
- the resource type.public class LeakDetector<T> extends AbstractLifeCycle implements Runnable
Resource pools usually have a method to acquire a pooled resource and a method to released it back to the pool.
To detect if client code acquires a resource but never releases it, the resource pool can be modified to use a
LeakDetector
. The modified resource pool should call acquired(Object)
every time the method to
acquire a resource is called, and released(Object)
every time the method to release the resource is called.
LeakDetector
keeps track of these resources and invokes method
leaked(org.eclipse.jetty.util.LeakDetector.LeakInfo)
when it detects that a resource has been leaked (that
is, acquired but never released).
To detect whether client code releases a resource without having acquired it, the resource pool can be modified to
check the return value of released(Object)
: if false, it means that the resource was not acquired.
IMPLEMENTATION NOTES
This class relies on System.identityHashCode(Object)
to create a unique id for each resource passed to
acquired(Object)
and released(Object)
. System.identityHashCode(Object)
does not guarantee
that it will not generate the same number for different objects, but in practice the chance of collision is rare.
LeakDetector
uses PhantomReference
s to detect leaks. PhantomReference
s are enqueued in their
ReferenceQueue
after they have been garbage collected (differently from WeakReference
s that
are enqueued before). Since the resource is now garbage collected, LeakDetector
checks whether it
has been released and if not, it reports a leak. Using PhantomReference
s is better than overriding
Object.finalize()
and works also in those cases where Object.finalize()
is not overridable.
Modifier and Type | Class and Description |
---|---|
class |
LeakDetector.LeakInfo
Information about the leak of a resource.
|
AbstractLifeCycle.AbstractLifeCycleListener
LifeCycle.Listener
Constructor and Description |
---|
LeakDetector() |
Modifier and Type | Method and Description |
---|---|
boolean |
acquired(T resource)
Tracks the resource as been acquired.
|
String |
id(T resource)
Generates a unique ID for the given resource.
|
boolean |
released(T resource)
Tracks the resource as been released.
|
void |
run() |
addLifeCycleListener, getState, getState, getStopTimeout, isFailed, isRunning, isStarted, isStarting, isStopped, isStopping, removeLifeCycleListener, setStopTimeout, start, stop, toString
public boolean acquired(T resource)
resource
- the resource that has been acquiredreleased(Object)
public boolean released(T resource)
resource
- the resource that has been releasedacquired(Object)
public String id(T resource)
resource
- the resource to generate the unique ID forCopyright © 2010 - 2020 Adobe. All Rights Reserved