Как получить снимок памяти Direct для приложения Netty 4
У меня есть Netty Based Server, который обрабатывает многочисленные HTTP-запросы асинхронно.
Цель - раскрыть прямое использование памяти приложения.
Теперь я понимаю, что подсчет ссылок является одним из способов разоблачения использования памяти. Но для каждого запроса немногие объекты (такие как httpContent и т. Д.) Сохраняются в явном виде, а для других Netty внутренне обновляет счетчик ссылок.
Поскольку сервер способен обрабатывать множество запросов одновременно, как я могу отслеживать прямое использование памяти моего приложения и выставлять его?
Есть ли способ получить общее количество ссылок по всему приложению?
Помимо 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 для получения общего количества ссылок.