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

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

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

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

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

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

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

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 для получения общего количества ссылок.

Другие вопросы по тегам