Z项目netty内存分析
元数据区
-XX:MetaspaceSize
-XX:MaxMetaspaceSize 该参数实际测试并不是设置最大元数据区大小,而是给了一个参考值,他会根据这个值动态调整元数据区的最大值
|
|
一些实验
1、采用以下参数,启动一个netty进程,5个连接,进行每秒100个消息的发送,内存保持在79M不变
2、然后在netty的客户端打断点,阻塞消息发送内存一直飙升 176M
3、放开断点保持消息接受通常,内存掉到144M
4、内存保持不变
问题:那么这些增加的内存到底占用在什么地方了?
初步怀疑是内存池,那么接下来准备采用非内存池的方式来做测试,看看链接断开完毕后内存会不会恢复正常..
接上,unpooled buffer也不释放
会不会测试内存太小,本身是jvm占用的,本次扩大内存到512M,看看增量
接上,内存依然会增加,当断点放开之后,内存涨到 700M。
试着使用-Dio.netty.maxDirectMemory = 0 参数,也是没有用的
关于-Dio.netty.maxDirectMemory参数
小于0,不使用Cleaner 继承java的-XX:MaxDirectMemorySize参数,netty有自己的最大堆外内存够,也有自己的最大堆外内存,也就是说jvm实际最大堆外内存是2*MaxDirectMemorySize参数
等于0,使用Cleaner,netty不会有自己的最大内堆外内存限制,而是和jdk一起享有一个最大内存 最大内存
- 大于0,不使用Cleaner,netty就用自己定义的参数,和jdk无关,各自有格子的最大堆外内存
google-perftools分析
安装 gcc
1yum install gcc gcc-c++ make安装libunwind
123456wget http://ftp.yzu.edu.tw/nongnu/libunwind/libunwind-1.1.tar.gztar -xzvf libunwind-1.1.tar.gzcd libunwind-1.1./configuremakemake install
2、安装google-perftools
|
|
修改java进程启动shell,其中之前
加入export LD_PRELOAD=/usr/local/lib/libtcmalloc.so
加入export HEAPPROFILE=/tmp/test (导出的文件放在哪里)
最终生成文件是在/tmp中, 也不知为何,就是在配置的上一级目录中
- 查看1pprof /usr/local/java/jdk1.8.0_152/bin/java ../mtest.0001.heap
此命令会进入一个程序
接下来使用top20查看使用20,就能看到使用内存的top20的点
top 显示内存使用情况,由高到低
gv 使用图形化表示
如果出现sh: dot: command not found 那么是没有安装图形工具
此时安装图形工具
web使用网站来查看
Top命令相关
/proc/$pid/stat 可以获取某进程的状态、
游戏消息分析
|
|
netty设置ByteBuf类型
利用ch.config().setAllocator或Bootstrap.option(ChannelOption.ALLOCATOR, ByteBufAllocator),
结合-Dio.netty.noUnsafe,可以灵活的在如下四种ByteBuf之间进行切换:
UnpooledHeapByteBuf
PooledHeapByteBuf
UnpooledDirectByteBuf
PooledDirectByteBuf