netty4虚拟内存不断飙升

去年升级过一个老的netty3的程序到netty4,近期突然注意到一个问题,就是这个程序随着时间虚拟内存会不断升高.之前升级的时候担心存在内存泄露,所以还特意用jstate跟踪过gc回收的情况,并没有异常.虽然当时也发觉内存占用有缓慢升高的趋势也没有特别在意,仅做观察处理.

由于同机器上还有另一个netty3的老项目可以做对比,所以发觉还是有异常,同时启动的程序虚拟内存占用是老项目的3倍,还没有停止的趋势.

决定还是排查一下,jstack 进程号  > 文件名 ,将堆栈信息dump出一份,观察堆栈信息发现:

"defaultEventExecutorGroup-5-2" prio=10 tid=0x0000000044191000 nid=0x1df0 waiting on condition [0x0000000043ada000]
   java.lang.Thread.State: WAITING (parking)

存在大量以上信息.其中defaultEventExecutorGroup-5-2信息中5为线程组的id,2为线程组中的线程id.然后发现一个特点就是日志中有大量的不同线程组的defaultEventExecutorGroup出现.马上想到一种可能.翻看原始代码中defaultEventExecutorGroup的创建地点:

protected void initChannel(SocketChannel ch) throws Exception {
        ......
        EventExecutorGroup excutor = new DefaultEventExecutorGroup(16);

        channelHandler = getMessageConnectorHandler();
        p.addLast(excutor,"messageConnectorHandler", channelHandler);

    }    

果然当时犯糊涂了,当时想着反正spring是单例,这种初始化方法也就调用一次,局部变量new出来也没什么..但是忘了一件重要的事情就是,这个方法所在的类根本就不是注入的,而是直接new出来的.所以这个局部的DefaultEventExecutorGroup对象每次都是重新创建,导致出现不同线程组的多个线程池出现.

将此线程池提升到静态的成员变量后问题解决:

private final static EventExecutorGroup excutor = new DefaultEventExecutorGroup(16);
时间: 2024-11-05 03:53:14

netty4虚拟内存不断飙升的相关文章

虚拟内存运行原理!

                                   虚拟内存运行原理! 在系统中运行的每个进程都需要使用到内存,但不是每个进程都需要每时每刻使用系统分配的内存空间.当系统运行所需内存超过实际的物理内存,内核会释放某些进程所占用但未使用的部分或所有物理内存,将这部分资料存储在磁盘上直到进程下一次调用,并将释放出的内存提供给有需要的进程使用. 在Linux内存管理中,主要是通过"调页Paging"和"交换Swapping"来完成上述的内存调度.调页算法

linux内存管理-虚拟内存总结

面试被问到虚拟内存,回答的感觉不够.于是重新总结一下. 程序猿对内存的要求都是:私有的.速度快.容量无限大. 对应现在的现况:使用一块物理内存.容量有限.并且速度有限,需要cpu多级缓存. 物理内存暴露给进程存在问题:1.如果可以寻址内存的每个字节,容易破坏操作系统以及其他进程 解决方法1 通过基址寄存器与界限寄存器 前置保存起始物理地址,后者保存地址长度:解决了地址私有化的问题. 交换技术  仍然使用两个寄存器,会产生内存空洞:就算使用内存紧缩技术(移动进程空间),也会大量占用cpu时间: 虚

最好的方式是用VirtualAlloc分配虚拟内存,它既不是在堆也不是在栈,而是直接在进程的地址空间中保留一块内存

申请效率的比较 栈:由系统自动分配,速度较快.但程序员是无法控制的. 堆:是由new分配的内存,最好的方式是用VirtualAlloc分配虚拟内存,它既不是在堆也不是在栈,而是直接在进程的地址空间中保留一块内存,虽然用起来最不方便,但是速度快也最灵活. http://blog.csdn.net/houqd2012/article/details/25070987

[Java]虚拟内存大小设置

部分内容来自:http://www.cnblogs.com/jinzhenshui/p/3345895.html 当初始化一个 byte[] 变量时,如果写成了这样 byte[] b = new byte[1024 * 1024 * 1024]; 你可以看到报错: Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 这个错误表示需要设置参数增加虚拟内存大小 对项目右键 -> Debug -&

linux系统添加swap虚拟内存与删除配置方法

兄弟连Linux培训教程 linux系统添加swap虚拟内存与删除配置(www.lampbrother.net) 1.swap概述 Swap分区,即交换区,Swap空间的作用可简单描述为:当系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用.那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到Swap空间中,等到那些程序要运行时,再从Swap中恢复保存的数据到内存中.这样,系统总是在物理内存不够时,才进行Swap交换. 其实

操作系统思考 第三章 虚拟内存

第三章 虚拟内存 作者:Allen B. Downey 原文:Chapter 3 Virtual memory 译者:飞龙 协议:CC BY-NC-SA 4.0 3.1 简明信息理论 比特是二进制的数字,也是信息的单位.一个比特有两种可能的情况,写为0或者1.如果是两个比特,那就有四种可能的组合,00.01.10和11.通常,如果你有b个比特,你就可以表示2 ** b个值之一.一个字节是8个比特,所以它可以储存256个值之一. 从其它方面来讲,假设你想要储存字母表中的字母.字母共有26个,所以你

Redis教程(十一):虚拟内存介绍:

转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/138.html 一.简介: 和大多NoSQL数据库一样,Redis同样遵循了Key/Value数据存储模型.在有些情况下,Redis会将Keys/Values保存在内存中以提高数据查询和数据修改的效率,然而这样的做法并非总是很好的选择.鉴于此,我们可以将之进一步优化,即尽量在内存中只保留Keys的数据,这样可以保证数据检索的效率,而Values数据在很少使用的时候则可以被

netty4 bind启动过程简析

请看一下简单的 一个netty4服务端启动代码样例 EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); try { ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class)

如何设置虚拟内存,让电脑运行的更快

如何设置 如果电脑是因为内存不足而引起的运行缓慢,反应迟钝,则可以适当的设置虚拟内存的大小,来补偿内存的不足,加快系统的反应速度.其具体的做法如下: 在 “我的电脑’上鼠标右键单击,选择 ”属性“ . 2. 在 ”属性“ 弹出的页面中选择 “ 高级”,在 “性能” 区域中单击 “设置” 按钮. 3.在性能选项卡中选择高级,在 虚拟内存区域中 单击更改按钮 4. 选择一个空闲空间大的分区用来存放虚拟内存 Pagefile.sys  文件. 5. 在自定义大小区域中设置虚拟内存的大小为物理内存的1.