求教

08-07-30 qiullin
本人现在作一个实时性要求较高的项目,短时间内需要处理大量的消息,目前采用的是多线程处理这些消息,但是现在发现有些问题,多线程执行是乱序的,而我需要处理的消息有些需要按顺序执行(ID相同的信息),这样会对产生的结果带来无法预知的影响,不知道各位有什么好的办法处理这类事件没?

比如加线程池,单线程还是会乱序执行,不使用多线程,那如何来保证整个系统的性能?

忘赐教,不胜感激!

banq
2008-07-31 11:11
使用JMS 的Queue方式,性能可伸缩,可集群分布式。

qiullin
2008-09-02 15:46
非常感谢banq的回复!

现在系统又遇到一个问题了,内存泄露,问题比较严重.

系统运行一段时间后内存不断减低,基本上一天1个百分点的下降,而且现在用户量并不太多,一天也就几百个而已.用JProfiler监测了下,发现用户操作时GC的频率比较高,基本上是连续不断的在处理.而且,从任务管理器看到当用户操作时内存占用不断攀升,并且系统流量为0时,内存也不下降,当下次用户操作时候内存继续攀升,基本上10天就要重启服务,而且有意思的是,重启服务也不能释放多少内存,必须重启服务器,这样可以彻底释放内存.自查了下代码,基本上缓存啊什么的都有释放清除,而且还要定时器清除.现在不知道该如何查下去了,希望赐教!!!

不胜感激!!!

banq
2008-09-02 19:50
用JProfiler监测内存最大增长来自哪几个类,可以差错的,如果是自己应用程序,那肯定存在内存泄漏。

qiullin
2008-09-03 10:29
监控了几天了,以下是些图片:

1.堆使用情况:


qiullin
2008-09-03 10:32
2.垃圾回收情况:


qiullin
2008-09-03 10:37
3.对象使用内存分配图:

观察了许久,没发现那个实例个数爆炸似的增长


qiullin
2008-09-03 10:44
4.WINDOWS任务管理器的内存情况:


qiullin
2008-09-03 10:48
在本机模拟,客户端不断的发送操作指令,发现内存在不断的攀升,从服务启动时候的40M到现在的近300M,

一旦客户端停止操作,内存不会降下来,也不会涨上去.

不知道这部分内存是被什么吃了的,从监控结果看实在是看不出来

banq
2008-09-03 14:12
象使用内存分配图 不详细,应该有根据包package分类的,找到你自己的包情况。

另外不要在本地测试本地,也要注意CPU负载不能100%。

Java内存一般占用不会立即释放,垃圾回收机制启动才会释放,所以,内存撑着不用担心。

qiullin
2008-09-03 17:21
我所有包的内存使用实例大概在2200-2600范围之间徘徊,并没有出现暴涨现象,

我现在就纳闷了,监控结果看,系统并没有明显的内存泄露,但为什么WINDOWS的内存使用在不断的涨,物理内存降到20%左右时就要重启服务器才能解决问题,真不知道有什么办法能解决这个问题,另外,能否详细解释下JAVA的内存管理机制及操作系统的内存管理机制,为什么WINDOWS的内存使用在不断的涨一直到系统崩溃?


banq
2008-09-04 17:02
一般到内存剩余5%左右,垃圾回收机制会启动,启动后内存没有减少,说明存在内存泄漏,你这个现象明显内存泄漏,只是你没有仔细去跟踪你的包中哪些类耗费内存最多,GC后又不能完全恢复之前状态的。

pushboy
2008-09-04 17:30
我记得HPjmeter可以看jvm的heapdump信息

包括引用树

这样可以很明显的看出哪些东西占用内存一直没有释放

猜你喜欢