如何获取Netty 4应用程序的直接内存快照



我有一个基于Netty的服务器,它异步处理大量HTTP请求。

目标 - 公开应用程序的直接内存使用情况。

现在我明白了引用计数是公开内存使用情况的一种方法。 但是对于每个请求,很少有对象(如httpContent等(被显式保留,而对于其他对象,Netty在内部更新引用计数。

  1. 由于服务器能够一次处理大量请求,因此如何监视应用程序的直接内存使用情况并公开它?

  2. 有没有办法在整个应用程序中获取总引用计数?

  3. 除了 ReferenceCount,还有哪些其他方法来监视直接内存使用情况?

Netty默认使用ByteBufAllocator.DEFAULT(实际上是UnpooledByteBufAllocator.DEFAULTPooledByteBufAllocator.DEFAULTByteBufUtil.DEFAULT_ALLOCATOR(分配器进行分配。如果尚未在代码中显式设置另一个分配器,则可以使用它来跟踪内存消耗。

您可以使用下一个代码执行此操作:

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);

两个默认的网络分配器UnpooledByteBufAllocatorPooledByteBufAllocator实现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 来获取总引用计数。

最新更新