我之内存管理分析之不足

截止目前为止,对于我们正在做的性能测试有了一点概念,但是对于我们这次要做得到的东西仍然没有一个深刻的了解。原因有如下几个方面:
1、我之前只是听说过而没有接触过性能测试方面的东西,这次上来之后对于服务器上的一系列操作 ,查看,和压力测试工具的使用,以及内存分析工具在Linux上的安装和使用,都有些摸不到头绪。工具的安装还好,从网上找一下教程,然后针对本地服务器的情况做适当修改进行操作就行了。但是网上的教程也是基于一定的基础来做的,现在是我对这部分基础都了解的不够,这导致我拿起来一个软件,凑凑合合安装完成后,依然不知道怎么用,有的甚至卡在不知道怎么启动上面。wired。
2、对于系统,尤其是服务器方面的内存管理没有什么 概念。这要牵扯到我当时的操作系统本身 就学的不怎么样,现在不只是说jvm的内存管理,出的问题还是jvm的堆外内存溢出。这个概念我差不多就是第一次接触。在随后的接触和处理过程中,主逐渐发现,现在对于“jvm堆外内存溢出”这个结论也只是猜测而已,并没有定论。技术领导想要通过这次性能测试来判断是否是jvm堆外内存溢出,如果是,那么我们可以选择升级线网环境的jdk版本来fix之前出现的bug,如果不是,那么我们就得再使用其他角度进行性能测试,并争取复现bug,并解决。
3、对于Java虚拟机和Java内存个管理,没有进行过深入的研究。虽然自开始做开发,就是使用Java,jsp和Java的一些框架等,但是对于Java真正核心的jvm的机制,管理内存的方法等,都没有了解过。(好吧时间有点紧写的仓促一些)

问题已经发现,但是解决却不是一时半会就能解决的。长时间忽视自己Java基础的深入,以为能做普通开发,能顺畅使用Java(实际这个也没能)语言进行开发就可以了。这只是一个很初级的程序员能够干活的要求。想要成为更高层次的程序员,设计师,架构师,技术经理等,必须对更深入的问题有研究,有了解,能够理解并处理这些问题。

从这次处理这个问题开始,我需要了解的一些东西:
1、Java内存处理的机制,方法。
2、jvm运行机制和方法。实际上,貌似这两个应该是同一个。
3、压力测试的相关的一些基础。

从网上着一些资料,好好熟悉一下。

以下为部分需要参考文档

《http://wenku.baidu.com/view/2e3f652cb4daa58da0114a1a.html》

《http://wenku.baidu.com/view/b965f6c30c22590102029d60.html》

以及性能测试文档

linux系统巡检

今天开始进行线上服务器进行每日一次的日常巡检,看是否有突发问题导致系统宕机或者是否有较明显的征兆表现出来当前应用的缓慢内存泄露。

查看cpu使用率,命令: top -n1

之前没有用过这个命令,详细参数暂不考虑研究,输出此命令后在控制台输出的东西的意义如下:
top – 06:25:36 up 592 days, 10:59, 2 users, load average: 0.04, 0.03, 0.00—–(系统从开机到现在运行了多长时间)
Tasks: 177 total, 1 running, 174 sleeping, 0 stopped, 2 zombie—–(总任务数和任务状况)
Cpu(s): 0.2%us(当前用户cpu使用比例), 0.1%sy(系统使用cpu比例), 0.0%ni, 99.5%id(当前cpu剩余比例), 0.2%wa, 0.0%hi, 0.0%si, 0.0%st—–(cpu使用状况)
Mem: 48149M total(内存总数), 14024M used(当前使用的内存数量), 34124M free(当前空闲的内存数量), 220M buffers(用作内核缓存的内存量) —– (内存使用状况)
Swap: 32773M total(交换区总量), 1349M used(使用的交换区总量), 31424M free(剩余的交换区总量), 11807M cached(缓冲的交换区总量) ——(交换区总量)

检查共享内存大小 cat /proc/meminfo
查看的是/proc/目录下的meminfo文件里的内容,主要看第一个信息MemTotal:     49304924 kB,大于1G即可

 

 

 

 

JVM堆外内存溢出

一个socket服务网项目,每台机器的线程量3w左右。最后一次更新发布后,出现了一个奇怪的问题,就是运行一段时间之后,jvm的堆外内存就会基本被占用完,需要重启一次服务器才行。为了服务器安全,设置了一个内存使用上限比例,当服务器内存使用比例到达这个数值之后,就不再接收用户的请求,表现出来的现象就是用户无法登陆了。问题很严重。

经过几位高级工程师的讨论和分析,猜测造成这种现象可能的原因有两个:
1.我们的应用中使用了ByteBuffer.allocateDirect ,这种方式会使用堆外内存,但由于线上服务器使用的jdk版本时 6.32之前的一个版本,在此之前的版本中存在堆外内存回收的bug,因此认为可能是这个原因导致了当前问题。
2.jdk工具包中的java.util.zip.Deflater方法会使用堆外内存,同时,这个方法还存在内存释放方面的bug。我们的应用中使用了xmpp,据说这个会很频繁的调用这个方法,有可能是这个原因造成的服务器堆外内存溢出 。

但是堆外内存很难检测,按照文章中的推荐,需要使用工具查看我们的应用中是否有不停的调用这个方法,推荐的工具是google-perftools。这个东西还没怎么用过,需要了解一下怎么安装和使用。尽快把环境部署起来吧。