Как получить прямой снимок памяти приложения Netty 4

У меня есть сервер на основе Netty, который асинхронно обрабатывает многочисленные HTTP-запросы.

Цель — выявить прямое использование памяти приложением.

Теперь я понимаю, что подсчет ссылок — это один из способов выявить использование памяти. Но для каждого запроса несколько объектов (например, httpContent и т. д.) остаются явными, а для других Netty внутренне обновляет счетчик ссылок.

  1. Поскольку сервер способен обрабатывать множество запросов одновременно, как я могу отслеживать прямое использование памяти моим приложением и раскрывать его?

  2. Есть ли способ получить общее количество ссылок во всем приложении?

  3. Помимо ReferenceCount, каковы другие способы мониторинга прямого использования памяти?


person vkohli    schedule 04.09.2018    source источник


Ответы (1)


Netty по умолчанию использует распределитель ByteBufAllocator.DEFAULT (на самом деле это ByteBufUtil.DEFAULT_ALLOCATOR, то есть либо UnpooledByteBufAllocator.DEFAULT, либо PooledByteBufAllocator.DEFAULT) для распределения. Если вы явно не установили другой распределитель в своем коде, вы можете использовать его для отслеживания потребления памяти.

Вы можете сделать это с помощью следующего кода:

public class MemoryStat {

    public final long heapBytes;

    public final long directBytes;

    public MemoryStat(ByteBufAllocator byteBufAllocator) {
        long directMemory = 0;
        long heapMemory = 0;

        if (byteBufAllocator instanceof ByteBufAllocatorMetricProvider) {
            ByteBufAllocatorMetric metric = ((ByteBufAllocatorMetricProvider) byteBufAllocator).metric();
            directMemory = metric.usedDirectMemory();
            heapMemory = metric.usedHeapMemory();
        }

        this.directBytes = directMemory;
        this.heapBytes = heapMemory;
    }
}

Использование: new MemoryStat(ByteBufAllocator.DEFAULT);

Оба аллокатора netty по умолчанию UnpooledByteBufAllocator, PooledByteBufAllocator реализуют ByteBufAllocatorMetricProvider, который предоставляет 2 метода:

public interface ByteBufAllocatorMetric {
    /**
     * Returns the number of bytes of heap memory used by a {@link ByteBufAllocator} or {@code -1} if unknown.
     */
    long usedHeapMemory();

    /**
     * Returns the number of bytes of direct memory used by a {@link ByteBufAllocator} or {@code -1} if unknown.
     */
    long usedDirectMemory();
}

Не существует прямого API для получения общего количества ссылок.

person Dmitriy Dumanskiy    schedule 05.09.2018
comment
Это здорово, я приземлился на эти классы ранее сегодня, проверяя Netty Git. (github.com/netty/netty) и просматривал документы, чтобы увидеть их использование. Спасибо, что сократили мое погружение :) P.S. Я использовал более раннюю версию Netty 4.1, в которой раньше не было этих новых «метрических» классов. Однако был dumpStats() и другие очень немногие методы. - person vkohli; 05.09.2018