Какие-либо кэши Java, которые могут ограничить использование памяти кэша в оперативной памяти, не только количество экземпляра?

Вы можете достичь этого, используя совокупность

Model.aggregate()
.addFields({ // map likes so that it can result to array of ids
    likesMap: {
        $map: {
            input: "$likes",
            as: "like",
            in: "$like.user"
        }
    }   
})
.addFields({ // check if the id is present in likesMap
    canLike: {
        $cond: [
            {
                $in: ["5c8f9e676ed4356b1de3eaa1", "$likesMap"]
            },
            true,
            false
        ]
    },
    totalLikes: {
        $size: "$likes"
    }
})
.project({ // remove likesMap
    likesMap: 0,
})
12
задан StaxMan 19 November 2010 в 17:51
поделиться

7 ответов

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

Емкость памяти может быть определена путем включения агента Java, и использование довольно просто при использовании утилиты SizeOf (http://sourceforge.net/projects/sizeof). Я только использовал это для отладки целей, и я рекомендовал бы сравнить издержек прежде, чем принять ее для нормального использования.

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

Если бы Вам действительно нужно это, и я советовал бы не к, мы могли бы улучшить мою текущую реализацию для поддержки этого. Можно послать по электронной почте мне, ben.manes-at-gmail.com.

3
ответ дан 2 December 2019 в 23:20
поделиться

Как насчет того, чтобы использовать простой LinkedHashMap с алгоритмом LRU, включенным и помещенным все данные с SoftReference в нем..., таким как cache.out (ключевой, новый SoftReference (значение))??

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

Это освободило бы Вас от вычисления размера записей и отслеживания суммы.

2
ответ дан 2 December 2019 в 23:20
поделиться

Не просто трудно иметь размеры - трудно определить.

Предположим, что две записи кэша относятся к той же строке - они оба считают размер той строки, несмотря на то, что удаление любого из них от кэша не сделало бы строку имеющей право на сборку "мусора"? Ни один из них не считает размер, несмотря на то, что, если они оба удалены из кэша, строка может затем иметь право на набор? Что относительно того, если другой объект не в кэше имеет ссылку на ту строку?

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

0
ответ дан 2 December 2019 в 23:20
поделиться

А также предполагая использование памяти объекта, для разумного алгоритма необходимо было бы также предположить стоимость воссоздания его. Разумное предположение было бы стоимостью воссоздания, примерно пропорционально емкости памяти. Таким образом, факторы уравновешивают друг друга, и Вам не нужен ни один. Простой алгоритм, вероятно, собирается удаться лучше.

0
ответ дан 2 December 2019 в 23:20
поделиться

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

0
ответ дан 2 December 2019 в 23:20
поделиться

Возможно определить значимую меру для использования памяти кэша. Вы могли вычислить: "сохраненный размер". К сожалению, вычисления сохраненного размера являются примерно столь же дорогостоящими как полный GC, и это - поэтому, вероятно, не опция. На определенных языках JVM (clojure?) Вы могли теоретически удостовериться, что ни на какие объекты в кэше не сошлются от внешних объектов, и затем Вы могли контролировать реальный размер кэша.

0
ответ дан 2 December 2019 в 23:20
поделиться

Вещью, которая делает это задание, является java.lang.ref. SoftReference. Как правило, Вы расширяете класс SoftReference так, чтобы подкласс содержал ключ.

-1
ответ дан 2 December 2019 в 23:20
поделиться
Другие вопросы по тегам:

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