diff --git a/.changes/next-release/feature-AWSSDKforJavav2-15df2d6.json b/.changes/next-release/feature-AWSSDKforJavav2-15df2d6.json new file mode 100644 index 000000000000..7eda3cf3ed90 --- /dev/null +++ b/.changes/next-release/feature-AWSSDKforJavav2-15df2d6.json @@ -0,0 +1,6 @@ +{ + "type": "feature", + "category": "AWS SDK for Java v2", + "contributor": "", + "description": "`IdleConnectionReaper` now does not prevent `HttpClientConnectionManager` from getting GC'd in the case where an SDK client is created per request and not closed." +} diff --git a/http-clients/apache-client/src/main/java/software/amazon/awssdk/http/apache/internal/conn/IdleConnectionReaper.java b/http-clients/apache-client/src/main/java/software/amazon/awssdk/http/apache/internal/conn/IdleConnectionReaper.java index c40d7671f86d..af46691e5a19 100644 --- a/http-clients/apache-client/src/main/java/software/amazon/awssdk/http/apache/internal/conn/IdleConnectionReaper.java +++ b/http-clients/apache-client/src/main/java/software/amazon/awssdk/http/apache/internal/conn/IdleConnectionReaper.java @@ -16,8 +16,9 @@ package software.amazon.awssdk.http.apache.internal.conn; import java.time.Duration; +import java.util.Collections; import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; +import java.util.WeakHashMap; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; @@ -48,7 +49,7 @@ public final class IdleConnectionReaper { private volatile ReaperTask reaperTask; private IdleConnectionReaper() { - this.connectionManagers = new ConcurrentHashMap<>(); + this.connectionManagers = Collections.synchronizedMap(new WeakHashMap<>()); this.executorServiceSupplier = () -> { ExecutorService e = Executors.newSingleThreadExecutor(r -> {