一次痛苦的server调试经历

我们项目组的服务器是一个比较老的服务器,配置是P4 1.8, 1G内存,比我现在用的PC的配置还低,但是就是这样的一个服务器上确安装了3tomcat3apache,一个oracle,还有2个我们项目自己的RMI server,平时我们的ftp得开着,可怜的服务器,访问量稍微大一些的时候就开始反应缓慢,但是即使这样,大家忍一忍也就过去了。

10月末,项目开始测试,出现了以前从来没有过的情况,就是大家测试一个小时左右的时候,服务器内存被消耗光,然后死掉。作为服务器管理人员的痛苦这个时候才真正的能体会到,没有办法,那就开始查找原因吧。

1、  其他应用程序消耗了过多的内存

top命令监视了一下,发现下面的现象:

这个图片只是其中的一部分,还有其他的和红线部分差不多内存消耗的,心里突然感觉轻松了,原来原因在这里,用ps命令通过PID找到TTY,然后通过TTYlast命令找到这个用户的IP,然后再windows下用nbtstat命令尝试看看能不能找到IP主人的用户名,运气不错,找到了,原来是有新来的同事在用vi打开了巨大(100M)的日志文件,然后还不释放,后来不允许大家用vi打开日志文件,如果想要看就用ftp下载到本地,不过这样实在是太麻烦了,于是修改了log4j的配置,让日志每次10M之后换新文件。几个小时过去了,暂时没有出现服务器崩溃的现象,于是自认为一切OK,回去睡觉去了。

2、  Java虚拟机的内存设置太大,GC频率太低

第二天上午很多人开始测试的时候,服务器仍然会死掉,但是频率比较低,大概3小时的时候才会死掉,看来昨天的问题是一个原因,但是不是根本原因。察看了tomcatrmi server的启动参数,发现内存设置有点大,会不会是内存设置太大而导致GC频率太低,而导致服务器效率低呢?于是修改了Tomcatrmi server的内存配置,但是现象仍然存在,看来不是这个原因。不过后来的事实证明,这次的内存配置修改还是有效的,GC频率有所提高,服务器效率提高比较明显。

3、  Java虚拟机内存泄露

考虑到以上的所有情况,看来原因肯定是内存泄露了,但是java的内存泄露很少会出现,这次居然让我碰到。

这么多的JVM应该是那个出现问题了呢?用top命令监视了好久终于发现了下面的现象:

刚刚开始:

1分钟后:

再后来的图片没有截下来,但是红线部分的内存消耗已经到了350M以上,比我设置的最大内存还大,百思不得其解,为什么GC没有起作用呢?看来可怕的内存泄露的原因需要我去找了。

还是用top命令找到了启动这个虚拟机的server,原来是我们其中的一个RMI server,于是下载了一个Optimizeit EntSuite 2006,开始研究内存的使用情况,发现有很多的service实例总是增加,而不释放。

中午吃饭的时候和同事讨论这个问题,他的一句话提醒了我,原来项目组在开发的时候为了不重启服务器,改写了classloader,如获至宝,吃完饭回来就把原始包替换上去,一切OK

 

尾声

这次的体验让我学会了很多的东西,也知道自己还有很多需要努力的地方。

BorlandOptimizeit非常好用,用法以及分析方法以后有时间要写出来,做个笔记。

为什么改写classloader会导致内存泄露呢?我们有没有简单的办法实现hot deploy? 这段时间也研究了一下,有时间也要做一个笔记。

 

系统环境:

Redhat9

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值