[ https://issues.apache.org/jira/browse/GEODE-9497?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Owen Nichols closed GEODE-9497. ------------------------------- > RedisHash and RedisSortedSet both use a hashMap that uses more memory than it > needs to > -------------------------------------------------------------------------------------- > > Key: GEODE-9497 > URL: https://issues.apache.org/jira/browse/GEODE-9497 > Project: Geode > Issue Type: Improvement > Components: redis > Reporter: Darrel Schneider > Assignee: Darrel Schneider > Priority: Major > Labels: pull-request-available > Fix For: 1.15.0 > > > Both RedisHash and RedisSortedSet have an instance of > SizeableObject2ObjectOpenCustomHashMapWithCursor which can end up keeping > some objects alive that are not really needed. The memory used by these > object is currently not kept track of by geode's getSizeInBytes > implementation. > The objects referenced by these three fields are the problem: > # *entries* an instance of > it.unimi.dsi.fastutil.objects.Object2ObjectOpenCustomHashMap.MapEntrySet > # *keys* an instance of > it.unimi.dsi.fastutil.objects.Object2ObjectOpenCustomHashMap.KeySet > # *values* an instance of an anonymous subclass of > it.unimi.dsi.fastutil.objects.AbstractObjectCollection > > These fields get lazily initialized when their corresponding method is > called. Once they are initialized they stay that way forever. The object they > reference is immutable. Its only field is the implicit reference to its outer > class instance. Currently it looks like we have redis ops that can end up > calling all three of these methods in which case these objects would account > for over 100 bytes on a 64-bit jvm. > It is not clear to me why the implementors of Object2ObjectOpenCustomHashMap > chose to cache this immutable object instead of just creating it every time. > They have no state to initialize when constructed so one thing we could do is > override the methods that cache it to either null out the cached field after > calling the super method, or have the method ignore the super implementation > and just create and returns an instance without caching. The cache fields > themselves would be a waste of memory in that case but only 24 bytes (12 with > compressed oops). To avoid this waste of memory we could just create our own > subclass of AbstractObject2ObjectMap that does not have these three fields. > It looks like we might be able to get rid of some other fields (one of them > is to support null keys which we never use). If we go that direction we > should probably force byte array keys instead of have a generic parameter and > we could then get rid of the strategy field. > Another possibility would be for our code that uses the map to only call > entrySet(), that way one instance would be cached instead of 3. You can > always get keys and values from the entrySet. Even better would be to add the > methods we need to our subclass of Object2ObjectOpenCustomHashMap named > SizeableObject2ObjectOpenCustomHashMapWithCursor. We did this for scan to > have a stable cursor and we could do it easily for the places we need keys, > values, or entries. It would be easy to add the foreach style of method > directly on our subclass and use it in RedisHash. If we do this then we > should probably override the other methods to throw an exception to prevent > someone from accidentally using them in the future. -- This message was sent by Atlassian Jira (v8.20.7#820007)