DSpaceObjectManager keeps an ArrayList with a reference to every DSpaceObject instance it encounters. The DSpaceObject instances aren't used for anything but take up heap memory. The effect is particularly noticeable with Discovery enabled because several Discovery components each have their own copy of DSpaceObjectManager.
The attached patch removes the ArrayList (and tidies up the code slightly). On a test instance, applying this patch brought down heap usage from 600 MB down to 70 MB (heap size measured a few minutes after starting up DSpace, with comparable activity).