I noticed when looking at hprof memory dumps of a JVM whose cache had been closed that something was keeping the PartitionedRegion instances from being garbage collected. It turns out that the region's RegionPerfStats instance was not closed. Other stats for the region were closed but not the one owned by PartitionedRegionDataStore's bucketStats instance variable. This indicates that the PartitionedRegionDataStore.cleanUp method is not being called.
It looks like the bug is in: PartitionedRegion.postDestroyRegion. It has a code path that handles Operation.CACHE_CLOSE and Operation.FORCED_DISCONNECT without calling "closePartitionedRegion" which invokes "dataStore.cleanup".
This buggy code path has its reasons for not calling closePartitionedRegion. To fix this bug it would be easy and safe to have this code path call dataStore.getCachePerfStats().close()