应用程序运行一段时间就会卡,然后导致服务死掉,困扰许久不能解决,求助。

kingssq 2009-03-05 06:38:53
硬件信息:
CUP: Intel X5450 3GHZ 8cpus
内存:4G
服务器:WINDOWS2003

软件
应用服务器 WEBLOGIC10
WEBLOGIC 堆配置 -Xms512m -Xmx1024m
SUN JDK1.5.06

应用程序并行用户200人左右,系统在使用一段时间(几个小时到1天不等)后会导致应用服务器不稳定,有时候会很卡,偶尔能恢复,但最终过不了多久会停止响应。观察服务器的内存 和CUP占用并不太高,服务的后台日志没有什么特别致命的错误,最多的是socket write error connection reset by peer,这个错误很频繁,但上网搜索,此错误并不会影响业务。我们还有一个服务器,硬件和软件环境都相同,但用户较少,基本稳定,所以怀疑是用户量大导致。另外,偶尔服务停止有java.lang.OutOfMemoryError: nativeGetNewTLA 错误。

...全文
1503 23 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
wugaohui1985 2011-04-02
  • 打赏
  • 举报
回复
我也出现这个问题,百思不得其解。同样是4G内存。
APOLLO_TS 2009-03-07
  • 打赏
  • 举报
回复
有日志么?程序日志贴出来看看!
newskl 2009-03-07
  • 打赏
  • 举报
回复
主要还是内存的垃圾处理机制没做好,数据库的链接再用过后记着关闭,比较大的临时对象不要太多。服务器的4G内存完全够用,建议你还是优化一下程序的编写。你的错误应该就是数据库连接没有适时关闭,耗用太多的内存性能。
axman 2009-03-07
  • 打赏
  • 举报
回复
另外一个快捷手段可以试一下。
把GC信息log出来。

如果挂机前出现4到6次FullGC,后面跟着一次GC。说明是临时对象过大。
如果挂机前出现4到6次FullGC,后面没有一次普通GC,直接挂了。那就是生命周期长的对象太多了。JVM无法回收这些对象又没法进行下面的内存分配,直接完蛋吧。
axman 2009-03-07
  • 打赏
  • 举报
回复
只有11楼的分析靠谱。

主要从以下几个方面入手:
有没有静态持有对象太多。这样的情况是内存溢出以后连出错信息都log不出来了。
有没有同时多线程长时间持有大对象。

可以肯定地说是内存对象没有释放掉,如list对象用完后没有及时clear,静态数据结构
只add没有remove,或者太多的对象放在session中等等等等。和数据库连结没有任何关系。


举一个简单的例子:

static List l = new ArrayList();

amethod(){
while(true) l.add(new Object());
}
这样的程序内存溢出时不会有异常抛出,直接挂机,因为当出现OOF时,JVM想生成异常调用栈,但连
异常调用栈的空间都没有了,而因为l是静态的,生命周期长于当前要生成的异常调用栈,所以l不能被
回收以省出空间来生成异常调用栈。


而如果
amethod(){
List l = new ArrayList();
while(true) l.add(new Object());
}
出现OOF时,JVM发现流程已经从方法栈转到异常调用栈,所以整个方法内的局部变量都可以回收,l也就可以
回收,可以正确地打印出异常。


所以当出现没有大量异常信息直接当机时,要查看有没有对象持有时间太长的问题。
loveunittesting 2009-03-06
  • 打赏
  • 举报
回复
java.lang.OutOfMemoryError:就是内存耗尽了,不是什么数据库的问题,数据库问题会报连接不上的。
必须检查代码,有什么地方存储了过多的对象到内存,如存到list,map等集合里。
服务器内存不会耗尽,因为 -Xms512m -Xmx1024m 就是限制java进程的最大和最小内存的,这个服务器硬件内存大小无关。
qqqqqwwqqq 2009-03-06
  • 打赏
  • 举报
回复
建立了几个连接池 几个用户
woshixdl 2009-03-06
  • 打赏
  • 举报
回复
我感觉是数据库连接机制不够完善 推荐你把该程序用数据库连接池进行连接
数据库连接池可以设置最高连接数的上限 当一个连接在一定时间内没有响应时 系统就会释放该连接 并对连接进行动态分配与管理
老黄瓜_ 2009-03-06
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 mousetsun 的回复:]
java.lang.OutOfMemoryError: nativeGetNewTLA

内存不够啊!... 200并发才4G...
[/Quote]

不要乱说 我们拿loadRunner模拟100个人同时登陆 写数据库也没有出现内存益处 建议还是检查下程序
kingssq 2009-03-06
  • 打赏
  • 举报
回复
windows 2003的服务器 32位的,似乎java对内存的分配有限制吧?我就算加大物理内存也是没有作用啊。

Jacky_Zhu_1983 2009-03-06
  • 打赏
  • 举报
回复
java.lang.OutOfMemoryError: nativeGetNewTLA

内存不够啊!... 200并发才4G...
kokobox 2009-03-06
  • 打赏
  • 举报
回复
java.lang.OutOfMemoryError: nativeGetNewTLA

应该是并发数过大 导致内存溢出,你的内存太小了,才4G,最好加到16G,或者更高。

在加内存之前在服务器上改一下最大连接数设置,在apache里配置也可以。

fulianglove 2009-03-06
  • 打赏
  • 举报
回复
用户200人。用户集中做什么操作会导致系统不稳定?
kingssq 2009-03-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lakesea 的回复:]
如果没有什么特殊情况的话,多半就是数据库连接未释放了,
我发现这个是个最简单但是大家犯得最多的问题,并且在测试过程中又不容易发现的问题。
等系统上线运行了,就一下子暴率出来了,
[/Quote]
我们写了一个filter类关闭hibernate连接。
lovezx1028 2009-03-06
  • 打赏
  • 举报
回复
用连接池试下.....
tianshangwuyun 2009-03-06
  • 打赏
  • 举报
回复
估计是数据库连接没有释放
wonder888888 2009-03-06
  • 打赏
  • 举报
回复
调试下程序,同时看看系统是否有问题
wangzhuoyan 2009-03-06
  • 打赏
  • 举报
回复
内存太小,存储用户有问题
lakesea 2009-03-06
  • 打赏
  • 举报
回复
楼主可以把你的数据库初始连接设小些,最大连接设大些,
然后运行程序,查看数据库连接是否有增长,是不是增长得很快?增长很快的话肯定是数据库连接问题。
我的系统有一段时间就因为数据库连接问题,甚至半个小时都坚持不了。
后来认真查了一下,把所有没有关闭连接的地方改了,目前十个人使用(与前台每秒都有数据交互,有的业务还是事务处理),现在连接最多不会超过5个,
运行一直很稳定。

还有,上面的朋友说,把内存调到4G以上,我是win2003的服务器,甚至不能调到2G,调到2G以上,连tomcat都启动不起来。
请问上面的朋友,这个需要怎么配才可以超过2G,我找不到相关的资料
lakesea 2009-03-05
  • 打赏
  • 举报
回复
如果没有什么特殊情况的话,多半就是数据库连接未释放了,
我发现这个是个最简单但是大家犯得最多的问题,并且在测试过程中又不容易发现的问题。
等系统上线运行了,就一下子暴率出来了,
加载更多回复(1)

81,122

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧