我有一台基于Netty的服务器,该服务器可以异步处理大量HTTP请求。
目标-公开应用程序的直接内存使用情况。
现在,我知道引用计数是公开内存使用情况的一种方法。 但是对于每个请求,很少的对象(例如httpContent等)被显式保留,而对于其他对象,Netty在内部更新引用计数。
由于服务器能够一次处理大量请求,因此如何监视应用程序的直接内存使用率并将其公开?
有没有办法在整个应用程序中获取总引用计数?
除了ReferenceCount以外,还有什么其他方法可以监视直接内存使用情况?
答案 0 :(得分: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);
默认的净额分配器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可以获取总引用计数。