最新的2017年热门编程语言排行榜已经出炉,java排名第一,纵观目前的市场,无论是IT金融软件服务行业或者云业务或大数据行业,java语言是开发的业务程序运用最广泛的语言之一。
本文主要通过分析云系统遭遇的java进程内存溢出的问题,介绍java进程占用系统内存高时的排查方案及建议的解决方案,同时延伸拓展java进程占用系统内存高的原因以及对于linux操作系统的内存管理和优化方案。
【云环境系统java进程内存占用高】
系统的运维值班人员发现该系统的uc注册页面访问超时,根据监控反馈的报错地址,登录相应的UC注册网页时,发现提示如下:网站维护中。
检查该uc注册业务对应的进程后,发现进程运行正常,检查服务的日志情况,然而并发现没有异常。
最后怀疑可能是该服务器的内存溢出,可能是产品对连接到服务端的线程没做控制,导致已结束、假死或超时的线程未释放内存,或者上述线程释放内存之后,没有进行内存整理,产生碎片,然后越积越大,然后就爆炸了。
但是查看服务器的内存情况如下:
通过以上查询发现,服务器内存总共4G,可用的还有300M左右,笔者查询相关资料后使用jmap -dump:format=b,file=ucweb.bin ${pid}的方法dump相应Java进程运行过程中占用的内存情况,然后导出为二进制文件,需要注意的是,这个对性能有影响,其中format=b是通过二进制的意思,通过这个命令把内存结构dump到二进制文件中,然后结合分析软件eclipse来获取具体情况。
也可以通过jmap –heap ${pid}命令来查看该java进程运行时所打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情况。
具体操作方法:
1、使用如下命令查看该业务进程的pid