Как я эффективно кэширую объекты в Java с помощью доступной RAM?

Я должен кэшироваться, объекты в Java с помощью пропорции любой RAM доступно. Я знаю, что другие задали этот вопрос, но ни один из ответов не отвечает моим требованиям.

Мои требования:

  • Простой и легкий
  • Не существенно медленнее, чем плоскость HashMap
  • Используйте LRU или некоторую политику удаления, которая приближает LRU

Я попробовал LinkedHashMap, однако он требует, чтобы Вы определили максимальное число элементов, и я не знаю, сколько элементов потребуется для заполнения доступной RAM (их размеры будут значительно варьироваться).

Мой текущий подход должен использовать Набор Google MapMaker следующим образом:

Map<String, Object> cache = new MapMaker().softKeys().makeMap();

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

Я услышал о материале как EHCache, но кажется довольно тяжелым для того, в чем я нуждаюсь, и я не уверен, достаточно ли это быстро для моего приложения (помнящий, что решение не может быть существенно медленнее, чем HashMap).

25
задан Kevin Bourrillion 29 January 2010 в 19:25
поделиться

10 ответов

jQuery не будет помещать значение в созданный HTML-файл созданного элемента. Оба .attr («значение», «бла») и .val () Получите текущее значение того, что было введено или изменено в входе текста и позволит вам увидеть это Значение, когда вы смотрите на вход на странице или отправьте его на сервер. Тем не менее, вы не увидите его при рассмотрении HTML.

Вы все еще можете манипулировать ценностью все, что вы хотите, вы просто не увидите никаких изменений в Firebug, как вы делаете с классовыми изменениями, стайлингом и т. Д.

AFAIK, это одинаково без использования jQuery. То же самое происходит с:

document.getElementById('textbox').value = 'my text'; 

Атрибут Value является только для установки значения чего-либо с сервера. Это не нужно с JavaScript.

Кроме того, это зависит от типа ввода, который вы используете. Например, вы увидите, что атрибут Value изменяется с скрытым входом, но не с текстовым ящиком.

Отредактируйте:

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

-121--3348382-

Я внедрил сервальные кеши, и, вероятно, так же сложно, как реализация нового DataSource или Threadpool, моя рекомендация использует JBoss-Cache или другой хорошо известной кэширования Lib. Так что вы будете хорошо спать без проблем

4
ответ дан 28 November 2019 в 21:58
поделиться

Я считаю MapMaker будет единственным разумным способом получить то, что вы просите. Если «GC начинает трэш, и производительность всего приложения резко ухудшается», вы должны потратить некоторое время правильно установить различные параметры настройки. Вначале этот документ может показаться немного запугиваться, но на самом деле он на самом деле написан очень четко и является золотой полезной информацией о GC:

http://java.sun.com/j2se/reference/whitepapers/memorymanagement_whiteaper.pdf

2
ответ дан 28 November 2019 в 21:58
поделиться

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

Если GC начинает выходить из свободного места, будут выпущены значения, удерживаемые слабыми экранами.

0
ответ дан 28 November 2019 в 21:58
поделиться

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

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

Что касается реализации кэша, в моем проекте (критическое приложение для эффективности) мы используем Ehcache, и лично я не нахожу его в тяжелом весе.

В любом случае запустите несколько тестов с несколькими различными конфигурациями (относительно размера, политики выселения и т. Д.) И выясните, что лучше всего подходит для вас.

0
ответ дан 28 November 2019 в 21:58
поделиться

Прошлое я использовал JCS . Вы можете настроить конфигурацию , чтобы попытаться удовлетворить вас. Я не уверен, что это будет соответствовать всем вашим требованиям / потребностям, но я нашел его довольно могущественным, когда я использовал его.

0
ответ дан 28 November 2019 в 21:58
поделиться

Это казалось привлекательным, так как он должен Автоматически удалять элементы, когда это нужно больше оперативной памяти, однако есть Серьезная проблема: его поведение Заполните все доступные ОЗУ

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

Большинство решений, которые вы найдете, будут добавлены функции в верхней части классов карты Java, включая Ehcache.

Вы смотрели на Коллекции Commons-Collections Lрумап ?

Обратите внимание, что существует открытая проблема против MapMaker для обеспечения функциональности LRU / MRU. Возможно, вы можете голосить ваше мнение там, а также

0
ответ дан 28 November 2019 в 21:58
поделиться

Вы не можете "удалять элементы", вы можете только остановиться, чтобы жестко на них ссылаться, и ждать, пока ГК их очистит, так что продолжайте с Коллекциями Google...

0
ответ дан 28 November 2019 в 21:58
поделиться

Предполагая, что вы хотите, чтобы кэш был потокобезопасным, то вам следует изучить пример кэша в книге Брайана Гетца "Конкурентоспособность Java на практике". Я не могу порекомендовать это достаточно высоко.

-3
ответ дан 28 November 2019 в 21:58
поделиться

Почему бы не попытаться создать свой список предметов в помощнике, а затем передать его в тэг выбора?

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

-121--3595014-

Можно даже передать уровень журнала в качестве определяемого пользователем свойства.

-DmyProp.logLevel=FINE

В вашем коде:

String logLevel = System.getProperties("myProp.logLevel");

Но у меня есть идея, что вы ищете более «встроенную» и автоматически обрабатываемую собственность, верно? АФАИК, его не существует, но, возможно, я ошибаюсь.

-121--2485911-

Я слышал о таких вещах, как EHCache, но это кажется довольно тяжелым для того, что мне нужно, и я не уверен, достаточно ли быстро для моего приложения (помня, что решение не может быть значительно медленнее, чем HashMap).

Я действительно не знаю, можно ли сказать, что EHCache тяжелый вес. По крайней мере, я не рассматриваю EHCache как таковой, особенно при использовании Memory Store (который поддерживается расширенным LinkedHashMap и, конечно, является самым быстрым вариантом кэширования). Ты должен попробовать.

3
ответ дан 28 November 2019 в 21:58
поделиться

Не знаю, будет ли это простое решение, особенно по сравнению с EHCache или аналогичным, но посмотрели ли вы библиотеку Javolution? Она не предназначена как таковая, но в пакете javolution.context имеется шаблон Allocator, который может повторно использовать объекты без необходимости сбора мусора. Таким образом, они сводят к минимуму создание объектов и сбор мусора, что является важной функцией при программировании в реальном времени. Возможно, вам стоит взглянуть и попробовать приспособить его к вашей проблеме.

1
ответ дан 28 November 2019 в 21:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: