Я согласен с Полом в том, что это часто решается с помощью мягкого ссылочного кэша, хотя он может удалять записи раньше, чем вы предпочитаете. Обычно приемлемым решением является использование обычного кеша, который перемещается в программный кеш и восстанавливает записи, если это возможно. Этот подход к кэшированию жертв работает довольно хорошо, дает вам более низкую планку, но дает дополнительную выгоду, если свободная память доступна.
Размер памяти может быть определен путем включения агента Java, и использование довольно просто при использовании утилиты SizeOf (http://sourceforge.net/projects/sizeof). Я использовал это только в целях отладки, и я бы рекомендовал сравнить накладные расходы прежде чем принять его для нормального использования.
В моей библиотеке кеширования я планирую добавить возможность подключить оценщик, как только будет реализован основной алгоритм. Таким образом, вы можете сохранить коллекцию в качестве значения, но ограничить кэш суммой всех размеров коллекции. Я видел неограниченные коллекции, так как значения в кешах вызывают OutOfMemoryExceptions, поэтому иметь контроль очень удобно.
Если вам это действительно нужно, и я бы посоветовал этого не делать, мы могли бы улучшить мою текущую реализацию для поддержки этого. Вы можете написать мне, ben.manes-at-gmail.com.