学习笔记(一) netty jvm参数配置命令

命令 值范围 说明 备注
io.netty.leakDetectionLevel
  • DISABLED - 完成禁止检测内存泄漏,这个是不推荐。
  • SIMPLE - 如果buffer中出现1%的内存泄漏,打印错误日志,就是上面那样。但是日志 是看不到详细在什么位置出现了内存泄漏。鉴于性能考虑,这个是在生产环境中默认使用。
  • ADVANCED - 如果buffer的1%出现内存泄漏,打印错误,并且输出详细的内存泄漏信息。
  • PARANOID - 这个和ADVANCED输出的内容是一样的,但它会对每一次请求的buffer做检查。很适用于调试和单元测试。
 内存泄漏检测机制的日志等级

 

 

 

io.netty.allocator.type
  • unpooled:
  • pooled:
ByteBuf的分配器,默认值为ByteBufAllocator.DEFAULT,4.0版本为UnpooledByteBufAllocator。  
 io.netty.noPreferDirect
  • false 默认值,表示使用对外内存
  • true,表示使用堆内内存
这两个配置项配合使用,将第一个参数设置成 true  
io.netty.noUnsafe
  • false 默认值  netty自己通过unsafe接口来分配内存,这里前提是平台需要支持能访问unsafe api,如果不能将统一走java nio模式
  • true
 
io.netty.maxDirectMemory

独立的控制内存参数,默认为-1

 

如果不设置第一个参数则会使用第二个参数来控制。如果MaxDirectMemorySize仍没有设置,则默认使用java堆大小

堆外内存好处就是不受jvm的机制管制,能够缓解gc压力。但是坏处也显而易见:容易泄漏,且不好排查。如果不设置netty最大使用内存,默认能使用jvm堆大小的内存。如果我们java应用放在容器里面,则很容易因为忽略堆外内存的使用导致容器被OOM killer杀死。可以通过两个参数来控制内存使用:
-XX:MaxDirectMemorySize

设置 jvm的堆外内存参数

io.netty.allocator.type
  • Pooled模式:即是cache模式,类比jemalloc的java版实现。后续系列再详细介绍。数据结构自顶向下依次有:
    • PoolThreadCache(避免NIO线程内存操作竞争)
    • PoolArena(分配器)
    • PoolChunk(内存通过chunk来进行管理)
    • PoolSubPage(内存的最细粒度表示)
  • Unpooled模式:直接分配和释放内存,由netty直接调用Unsafe接口,相比Pooled模式来讲则简单直接了很多。
 是否使用cache模式 netty为了高性能,默认使用了cache来管理回收的内存,这样下次再分配时直接从cache中分配,而不用频繁地调用Unsafe接口

 

 

参考资料:

(1) Netty源码解析系列:参数篇 - 知乎 (zhihu.com)

(2) Netty 长连接服务及Netty之JVM调优_weixin_34025151的博客-CSDN博客

posted @ 2022-09-30 17:18  夏之夜  阅读(464)  评论(0编辑  收藏  举报