Динамическое выделение размера кэша для устранения ошибки HeapSpace - PullRequest
0 голосов
/ 28 сентября 2010

У нас есть коллекция объектов, которая со временем становится довольно большой.Мы внедрили стратегию кэширования, чтобы облегчить это, однако у нас все еще не хватает пространства кучи во время выполнения - если при запуске не выделяется достаточно памяти.

Существует ли стандартный механизм для уменьшения размераэтот кеш во время выполнения, чтобы удалить эти ошибки OutOFMemory?Таким образом, если наш процесс запускается с меньшим объемом памяти, чем обычно, мы можем надеяться избежать гибели сервера.

Я понимаю, что это тип ошибки и, следовательно, его не следует перехватывать / обрабатывать, поскольку он обычно является показательнымболее серьезной проблемы.

Это так же просто, как иметь что-то следующее:

private static final long RECOMMENDED_MEMORY = 1073741824L;  //Example 1 Gig
private static int recommendedCacheSize = 100; //Example of 100 items
long heapSize = Runtime.getRuntime().totalMemory();
double size = Math.floor((double) heapSize/RECOMMENDED_MEMORY * recommendedCacheSize);
recommendedCacheSize = ++size; 

Ответы [ 2 ]

0 голосов
/ 28 сентября 2010

Почему бы не использовать то, что было разработано как реальный кеш ?

Хотя вы можете использовать мягкие ссылки для реализации кеша, чувствительного к памяти, такие кеши, как правило, слишком долго оставляют объекты в памяти (увеличивая загрузку GC). Слабые ссылки не подходят для кэшей, так как они имеют более высокую вероятность очистки (на практике они очищаются на каждом GC).

0 голосов
/ 28 сентября 2010

Я подозреваю, что реализация кэширования не поддерживает кэш объектов WeakReference или SoftReference, которые обычно используются в кэше объектов Java.Крайне важно использовать мягкие или слабые ссылки для кэша, в противном случае возможно появление OOME (Out of Memory Error).

Рациональное использование мягких / слабых ссылок заключается в том, что сборщик мусорапопытается собрать эти объекты, если недостаточно памяти.Использование сильных ссылок (обычных ссылок на объекты) для хранения ссылок на объекты в кэше предотвратит восстановление памяти.

Если, однако, вы получаете OOME, даже если вы используете слабые / мягкие ссылки, я подозреваю,ваш GC не очень хорошо настроен.Похоже, что ваше приложение испытывает внезапные всплески потребления памяти, что приводит к состоянию OOME.Такая ситуация маловероятна, но возможна, особенно если предыдущий вызов GC не очистил достаточно памяти (которая в конечном итоге потребляется следующим скачком потребления).

...