I’m just a user, so I can’t speak for the team (@omar is usually around somewhere?) but I know Cesium does a lot of optimization to avoid new allocations and re-use existing objects where possible. I assume it’s hanging on to the destroyed billboard/label objects so that it can reuse them the next time you make new labels – if you make labels, then remove them, then make new ones, remove again, etc etc, I would expect your memory footprint to remain about the same.
There might be a method that tells Cesium to clean up the “scratch” objects it’s hanging on to, but I don’t know of anything personally.
The only thing I’d add here is I think there may be a special case for labels, where CesiumJS will hold onto the memory created because in the general case it’s a lot faster than destroying and recreating those resources.
After some investigation, I think this is what you’re running into:
For labels, one billboard is used per character to visualize the label. Once the labels are removed, we keep these billboards around to be reused later when you create another label, because reusing a billboard has better performance than always creating new ones. However, I do agree it doesn’t make sense to keep around such a large number of these objects around indefinitely.