Распределение объектов с помощью ChronicleMap и ExternalMapQueryContext - PullRequest
0 голосов
/ 06 мая 2019

Мы стремимся минимизировать (если не исключить) распределение объектов в некотором высокопроизводительном коде. Это было / в значительной степени возможно в предыдущих версиях Chronicle Map (версия 2.x). В последней версии Chronicle Map (3.17.1) мы видим значительные выделения при использовании ExternalMapQueryContext. Мы следуем за учебником здесь: https://github.com/OpenHFT/Chronicle-Map/blob/master/docs/CM_Tutorial.adoc

Это ожидается? Используем ли мы правильный подход?

VOInterface voi = VO.get();

try (ExternalMapQueryContext < CharSequence, voi, ? > ctx = map.queryContext(key)) {

    if (ctx.readLock().tryLock()) {
        MapEntry < CharSequence, voi > entry = ctx.entry();
        if (entry != null) {
            // Entry is present, return
            entry.value().getUsing(voi);
            accessor.accessData(voi);
            // Key is absent
            // Need to unlock, to lock to update lock later. Direct upgrade is forbidden.
            ctx.readLock().unlock();
            return true;
        } else {
            accessor.notFound();
            // Key is absent
            // Need to unlock, to lock to update lock later. Direct upgrade is forbidden.
            ctx.readLock().unlock();
            return false;
        }
    }

    ctx.updateLock().lock();
    MapEntry < CharSequence, voi > entry = ctx.entry();
    if (entry != null) {
        entry.value().getUsing(voi);
        accessor.accessData(voi);
        return true;
    } else {
        accessor.notFound();
        return false;
    }
}

У нас есть скриншоты стеков распределения, которые мы также можем поделиться.

1 Ответ

0 голосов
/ 08 мая 2019

У нас есть тест net.openhft.chronicle.map.ChronicleMapTest # testAcquireLockedPerf, который выполняет миллионы операций в секунду. Вы можете запустить это с

-Xmx64m -verbose:gc

и в этой ситуации тест не запускает ни одного gc после прогрева для сотен миллионов операций, несмотря на наличие 64 МБ кучи.

Чтобы понять, почему ваш конкретный случай создает значительный мусор, потребуется больше расследований.

...