Copying some points related to application module configuration on top of what you see in the following chapter - 44 Tuning Application Module Pools and Connection Pools
1. When a web client access a page a new AM instances will be created till the pool size crosses recycleThreshold.
2.Call to Configuration.createRootApplicationModule(qualifiedAMDefName, configName); will use instance from the pool if poolsize > recycleThreshold and unreferenced (free) AM instances are available. Later when client calls Configuration.releaseRootApplicationModule(applicationModule, true); will remove the instance- doesn't matter how the instance is acquired .
3.Though the call Configuration.releaseRootApplicationModule(applicationModule, false/* remove flag */) , there is now way for a framework to identify the previously used AM instances if the client again calls Configuration.createRootApplicationModule(qualifiedAMDefName, configName) to create a new instance within the same request. However , with releaseRootApplicationModule(..., false) you do get the benefit of potentially reusing that AM (after it was reset) vs. creating a new AM. Configuration.releaseRootApplicationModule(..., true), removes the AM from the pool. Configuration.releaseRootApplicationModule(..., false) resets the AM and keeps it in the pool for future use.
4. Framework uses LRU algorithm for selecting an AM instance from the pool for recycling/passivating its state when new client request for AM.