What made the difference was having the Component class' "finalize()" method explicitly call "flush()" on its BufferedImage before nulling it out. Once this was done, the verbose output from the GC confirmed that the BufferedImage's memory was being reclaimed and the OutOfMemoryException stopped.
E. Berger, S. Stern, and J. Pizzorno. 17th USENIX Symposium on Operating Systems Design and Implementation (OSDI 23), Boston, MA, USENIX Association, (July 2023)