- Type Parameters:
T- The type ofPoolableobjects that aPoolbased on thisPoolBuilderwill produce.
- All Superinterfaces:
Cloneable
- All Known Implementing Classes:
PoolBuilderImpl
PoolBuilder collects information about how big a pool should be,
and how it should allocate objects, and so on, and finally acts as the
factory for building the pool instances themselves, with the
build() method.
Pool builder instances are obtained by calling one of the from*
methods on Pool, such as Pool.fromThreaded(Allocator).
This class is made thread-safe by having the fields be protected by the
intrinsic object lock on the PoolBuilder object itself. This way, pools
can synchronize on the builder object to read the values out atomically.
The various set* methods are made to return the PoolBuilder instance
itself, so that the method calls may be chained if so desired.
- Author:
- Chris Vest
-
Method Summary
Modifier and TypeMethodDescriptionbuild()Build aPoolinstance based on the collected configuration.clone()Returns a shallow copy of thisPoolBuilderobject.Get the configuredAllocatorinstance.intReturn the default approximate delay, in milliseconds, between background maintenance tasks, such as the background expiration checks and retrying failed allocations.Expiration<? super T> Get the configuredExpirationinstance.Get the configuredMetricsRecorderinstance, ornullif none has been configured.Get the configuredAllocatorinstance as aReallocator.longgetSize()Get the currently configured size.Get the ThreadFactory that has been configured, and will be used to create the background allocation threads for the pools.booleanReturn whether background expiration is enabled.booleanReturn whether Stormpot will prioritize minimizing its memory overhead over maximizing performance.booleanReturn whether precise object leak detection is enabled, which is the case by default.<X extends Poolable>
PoolBuilder<X> setAllocator(Allocator<X> allocator) Set theAllocatororReallocatorto use for the pools we want to configure.setBackgroundExpirationCheckDelay(int delay) Set the approximate delay, in milliseconds, between background maintenance tasks.setBackgroundExpirationEnabled(boolean enabled) Enable or disable background object expiration checking.setExpiration(Expiration<? super T> expiration) Set theExpirationto use for the pools we want to configure.setMetricsRecorder(MetricsRecorder metricsRecorder) Set theMetricsRecorderto use for the pools we want to configure.setOptimizeForReducedMemoryUsage(boolean reduceMemoryUsage) Tell the pool to optimize for either low memory usage (when givingtrue), or maximal performance (when givingfalse).setPreciseLeakDetectionEnabled(boolean enabled) Enable or disable precise object leak detection.setSize(long size) Set the size of the pool we are building.setThreadFactory(ThreadFactory factory) Set the ThreadFactory that the pools will use to create its background threads with.
-
Method Details
-
setSize
Set the size of the pool we are building.Pools are required to control the allocations and deallocations, such that no more than this number of objects are allocated at any time.
This means that a pool of size 1, whose single object have expired, will deallocate that one object before allocating a replacement.
The size must be at least zero, or an
IllegalArgumentExceptionwill be thrown when building the pool.Note that the pool size can be modified after the pool has been built, by calling the
Pool.setTargetSize(long)orManagedPool.setTargetSize(long)methods.- Parameters:
size- The target pool size. Must be at least 0.- Returns:
- This
PoolBuilderinstance.
-
getSize
long getSize()Get the currently configured size. The default is 10.- Returns:
- The configured pool size.
-
setAllocator
Set theAllocatororReallocatorto use for the pools we want to configure. This will change the type-parameter of thePoolBuilderobject to match that of the new Allocator.The allocator is initially specified by the
Pool.from(Allocator)method, so there is usually no need to set it later.- Type Parameters:
X- The type ofPoolablethat is created by the allocator, and the type of objects that the configured pools will contain.- Parameters:
allocator- The allocator we want our pools to use. This cannot benull.- Returns:
- This
PoolBuilderinstance, but with a generic type parameter that matches that of the allocator.
-
getAllocator
Get the configuredAllocatorinstance.- Returns:
- The configured Allocator instance.
-
getReallocator
Reallocator<T> getReallocator()Get the configuredAllocatorinstance as aReallocator. If the configured allocator implements the Reallocator interface, then it is returned directly. Otherwise, the allocator is wrapped in an adaptor.- Returns:
- A configured or adapted Reallocator.
-
setExpiration
Set theExpirationto use for the pools we want to configure. The Expiration determines when a pooled object is valid for claiming, or when the objects are invalid and should be deallocated.The default Expiration is an
Expiration.after(long, long, TimeUnit)that invalidates the objects after they have been active for somewhere from 8 to 10 minutes.- Parameters:
expiration- The expiration we want our pools to use. Not null.- Returns:
- This
PoolBuilderinstance.
-
getExpiration
Expiration<? super T> getExpiration()Get the configuredExpirationinstance. The default is aExpiration.after(long, long, TimeUnit)that expires objects after somewhere from 8 to 10 minutes.- Returns:
- The configured Expiration.
-
setMetricsRecorder
Set theMetricsRecorderto use for the pools we want to configure.- Parameters:
metricsRecorder- The MetricsRecorder to use, or null if we don't want to use any.- Returns:
- This
PoolBuilderinstance.
-
getMetricsRecorder
MetricsRecorder getMetricsRecorder()Get the configuredMetricsRecorderinstance, ornullif none has been configured.- Returns:
- The configured MetricsRecorder.
-
getThreadFactory
ThreadFactory getThreadFactory()Get the ThreadFactory that has been configured, and will be used to create the background allocation threads for the pools. The default is similar to theExecutors.defaultThreadFactory(), except the string "Stormpot-" is prepended to the thread name.- Returns:
- The configured thread factory.
-
setThreadFactory
Set the ThreadFactory that the pools will use to create its background threads with. The ThreadFactory is not allowed to be null, and creating a pool with a null ThreadFactory will throw an IllegalArgumentException.- Parameters:
factory- The ThreadFactory the pool should use to create their background threads.- Returns:
- This
PoolBuilderinstance.
-
isPreciseLeakDetectionEnabled
boolean isPreciseLeakDetectionEnabled()Return whether precise object leak detection is enabled, which is the case by default.- Returns:
trueif precise object leak detection is enabled.- See Also:
-
setPreciseLeakDetectionEnabled
Enable or disable precise object leak detection. It is enabled by default. Precise object leak detection makes the pool keep an eye on the allocated Poolables, such that it notices if they get garbage collected without first being deallocated. Using the garbage collector for this purpose, means that no false positives (counting objects as leaked, even though they are not) are ever reported.
Precise object leak detection incurs virtually no overhead, and is safe to leave enabled at all times – even in the most demanding production environments.Note NOTE While the pool is able to detect object leaks, it cannot prevent them. All leaks are a sign that there is a bug in the system; most likely a bug in your code, or in the way the pool is used. - Parameters:
enabled-trueto turn on precise object leak detection (the default)falseto turn it off.- Returns:
- This
PoolBuilderinstance.
-
isBackgroundExpirationEnabled
boolean isBackgroundExpirationEnabled()Return whether background expiration is enabled. By default, background expiration is enabled.- Returns:
trueif background expiration is enabled.- See Also:
-
setBackgroundExpirationEnabled
Enable or disable background object expiration checking. This is enabled by default, but can be turned off if the check is expensive. The cost of the check matters because it might end up taking resources away from the background thread and hinder its ability to keep up with the demand for allocations and deallocations, even though these tasks always take priority over any expiration checking.- Parameters:
enabled-true(the default) to turn background expiration checking on,falseto turn it off.- Returns:
- This
PoolBuilderinstance.
-
getBackgroundExpirationCheckDelay
int getBackgroundExpirationCheckDelay()Return the default approximate delay, in milliseconds, between background maintenance tasks, such as the background expiration checks and retrying failed allocations.- Returns:
- the delay, in milliseconds, between background maintenance tasks.
-
setBackgroundExpirationCheckDelay
Set the approximate delay, in milliseconds, between background maintenance tasks. These tasks include the background expiration checks, and retrying failed allocations.The default delay is 1.000 milliseconds (1 second). Lowering this value will improve the pools responsiveness to repairing failed allocations, and also increase the frequency of the background expiration checks. This comes at the cost of higher idle CPU usage.
It is not recommended to set this value lower than 100 milliseconds. Values lower than this tend to have increased CPU and power usage, for very little gain in responsiveness for the background tasks.
- Parameters:
delay- the desired delay, in milliseconds, between background maintenance tasks.- Returns:
- This
PoolBuilderinstance.
-
isOptimizeForReducedMemoryUsage
boolean isOptimizeForReducedMemoryUsage()Return whether Stormpot will prioritize minimizing its memory overhead over maximizing performance.This is
trueby default, as the performance gains don't show except in intense and highly concurrent use cases.- Returns:
truefor prioritizing memory usage over absolute performance, otherwisefalsefor prioritizing performance at all costs.
-
setOptimizeForReducedMemoryUsage
Tell the pool to optimize for either low memory usage (when givingtrue), or maximal performance (when givingfalse).This is
trueby default, and should only be set tofalsewhen the pool is expected to be "relatively small" and will experience an extremely high level of multithreaded access.- Parameters:
reduceMemoryUsage- whether to prioritize memory usage or performance.- Returns:
- This
PoolBuilderinstance.
-
clone
PoolBuilder<T> clone()Returns a shallow copy of thisPoolBuilderobject.- Returns:
- A new
PoolBuilderobject of the exact same type as this one, with identical values in all its fields.
-
build
Build aPoolinstance based on the collected configuration.- Returns:
- A
Poolinstance as configured by this builder.
-