Tracked it down to a HTML FragmentCache that was not appropriately releasing expired items. It would replace expired items as needed with their new versions, but expired items that were not accessed would build up indefinitely. Quite a leak. Created a cleaner task to run every couple hours to remove the expired items, hopefully that will take care of it. If it doesn't, then we're just trying to cache too much in the java heap (and our machine can only address 4GB). If that's the case, we'll have to either cache less overall, cache for shorter periods and clean often, externalize the memory consumption of the cache to something like memcached, or try a 64-bit solaris installation so we can address more memory.
Thanks all for the help!
[Message sent by forum member 'rwillie6' (rwillie6)]
http://forums.java.net/jive/thread.jspa?messageID=341635