Вы можете попытаться установить это значение, чтобы сгенерировать подробный дамп кучи, чтобы точно показать вам, что происходит.
-XX: + HeapDumpOnOutOfMemoryError
Типичное «маленькое» настольное Java-приложение в 2011 году будет работать с ~ 64-128 МБ. Если у вас нет действительно насущных потребностей, я бы начал с того, что оставил для него значение по умолчанию (то есть без настроек).
Если вы пытаетесь сделать что-то другое (например, запустить это на устройстве Android), вам нужно очень хорошо освоиться с профилированием (и вам, вероятно, следует опубликовать этот тег).
Имейте в виду, что ваш кэш 100 записей (~ 12 байт) может (вероятно) удвоиться, если вы храните символьные данные (Java использует UCS-16 для внутреннего использования).
RE: «нестабильность», JVM будет обрабатывать использование памяти для вас и будет выполнять сборку мусора в соответствии с любыми выбранными им алгоритмами (они сильно изменились за эти годы). Графики могут быть просто артефактом инструмента и периода выборки. На производительность в настольном приложении влияет огромное количество факторов .
В качестве примера, у нас когда-то была огромная утечка памяти, которая обнаруживалась только в одном автоматизированном тесте, но никогда не обнаруживалась при обычном использовании в реальном мире. Оказалось, что тест оставил курсор мыши над подсказкой, в которой было имя открытого файла, который в свою очередь содержал набор ссылок на весь (огромный) проект. Покачивая мышь, несколько пикселей избавились от всплывающей подсказки, что означало, что все ссылки очистились, и сборщик мусора вытащил мусор.
Мораль этой истории? Вам нужно захватить точный дамп кучи во время нехватки памяти и внимательно просмотреть его.