如何获取 Netty 4 应用程序的直接内存快照
How to get Direct Memory Snapshot of a Netty 4 Application
我有一个基于 Netty 的服务器,它可以异步处理大量 HTTP 请求。
Objective - 公开应用程序的直接内存使用。
现在我明白引用计数是暴露内存使用情况的一种方式。
但是对于每个请求,很少有对象(如 httpContent 等)被显式保留,而对于其他对象,Netty 会在内部更新引用计数。
由于服务器能够一次处理大量请求,我如何监控我的应用程序的直接内存使用情况并将其公开?
有没有办法获取整个应用程序的总引用计数?
除了ReferenceCount,还有哪些监控直接内存使用的方法?
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获取总引用计数。
我有一个基于 Netty 的服务器,它可以异步处理大量 HTTP 请求。
Objective - 公开应用程序的直接内存使用。
现在我明白引用计数是暴露内存使用情况的一种方式。 但是对于每个请求,很少有对象(如 httpContent 等)被显式保留,而对于其他对象,Netty 会在内部更新引用计数。
由于服务器能够一次处理大量请求,我如何监控我的应用程序的直接内存使用情况并将其公开?
有没有办法获取整个应用程序的总引用计数?
除了ReferenceCount,还有哪些监控直接内存使用的方法?
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获取总引用计数。