So.. I'm still having this issue. I just worked around it by changing room names everyday, but that's not a good solution for me. So to update, when the server only has 200-300ccu, after 2 days, I have 95,000 instances of SFSUsers. Digging deeper with Eclipse memory analyzer I took a screenshot(redacted some class names to stay anonymous):
This screenshot is just digging deep into 1 of the 95,000 SFSUser instances and trying to find out who is keeping it from getting garbage collected. The User has already been gone for days. But looks like when an MMORoom stays alive, it keeps a reference of room owner. Even if the room owner has already left.
Now the room owner has a list of SFSUser in the proxyList, and the proxyList holds a whole bunch of SFSUsers, and each SFSUser in this list also has their own proxyList, and they never go away since the owner of the room is forever referenced by the MMORoom.
Here's a SFSUser instance that's reference by a proxyList of another user who is referenced by another proxylist, and it goes on.
Here is a better example of what I just explained. As you can see. This example I picked another random user who no longer is online and traced the reference all the way to the MMORoom, which has an owner who will forever be reference by the MMORoom, and the owner has a proxyList, each user in the proxyList all have a proxyList and so on..
Here is a similar situation, not with room owner, but with proximitimanager. This might be a different thing though.
Just FYI I don't manually add users, I use getApi().createRoom(getParentExtension().getParentZone(), config, sfUser) and getApi().joinRoom(sfUser, room);
Currently, after writing all of this I'm thinking maybe I have answered one of the questions myself... Perhaps I should create the room with a null user, will that solve the issue? I will try it.