- Type Parameters:
T- the resource type.
- All Implemented Interfaces:
public class LeakDetector<T> extends AbstractLifeCycle implements java.lang.RunnableA facility to detect improper usage of resource pools.
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.
LeakDetectorkeeps 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.
This class relies on
System.identityHashCode(Object)to create a unique id for each resource passed to
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.
PhantomReferences to detect leaks.
PhantomReferences are enqueued in their
ReferenceQueueafter they have been garbage collected (differently from
WeakReferences that are enqueued before). Since the resource is now garbage collected,
LeakDetectorchecks whether it has been released and if not, it reports a leak. Using
PhantomReferences is better than overriding
Object.finalize()and works also in those cases where
Object.finalize()is not overridable.
Nested Class Summary
Nested Classes Modifier and Type Class Description
LeakDetector.LeakInfoInformation about the leak of a resource.
Nested classes/interfaces inherited from class org.eclipse.jetty.util.component.AbstractLifeCycle
Constructors Constructor Description
All Methods Instance Methods Concrete Methods Modifier and Type Method Description
acquired(T resource)Tracks the resource as been acquired.
id(T resource)Generates a unique ID for the given resource.
leaked(LeakDetector.LeakInfo leakInfo)Callback method invoked by
LeakDetectorwhen it detects that a resource has been leaked.
released(T resource)Tracks the resource as been released.
Methods inherited from class org.eclipse.jetty.util.component.AbstractLifeCycle
addLifeCycleListener, getState, getState, getStopTimeout, isFailed, isRunning, isStarted, isStarting, isStopped, isStopping, removeLifeCycleListener, setStopTimeout, start, stop, toString
public boolean acquired(T resource)Tracks the resource as been acquired.
resource- the resource that has been acquired
- true whether the resource has been acquired normally, false if the resource has detected a leak (meaning that another acquire occurred before a release of the same resource)
- See Also:
public boolean released(T resource)Tracks the resource as been released.
resource- the resource that has been released
- true whether the resource has been released normally (based on a previous acquire). false if the resource has been released without a prior acquire (such as a double release scenario)
- See Also:
public java.lang.String id(T resource)Generates a unique ID for the given resource.
resource- the resource to generate the unique ID for
- the unique ID of the given resource
protected void doStart() throws java.lang.Exception
protected void doStop() throws java.lang.Exception
public void run()
- Specified by: