日期:2014-05-20  浏览次数:20686 次

这种情况,如何设置JVM参数?难,头疼,高分
我最近做的一个项目,在性能上有严重的问题,希望大家给些建议。

情况如下:

一个java程序,需要不断地从服务器上接收信息(一些二进制数据),并且把它们缓存在内存中。(一个hashmap来放它们)
每个二进制数据的大小大约0.5K,每秒约80个。
这些二进制数据被解析后,每一个都会生成一个对象,但每个对象内部都有一些更小的对象的引用,来表示信息内容,平均下来每个信息大约有20个这样的小对象。在生成对象的过程中,有大量的短命对象生成。
一天下来,大约会收到500000个这样的信息。

合计起来,每天大约有250M左右的内存被固定占用。
有500000个这样的信息对象和500000*20个小对象被一直引用。

我使用默认运行方式(使用JVM默认参数),很快就CPU100%,程序运行很慢,不一会儿就outofmemory。
后来改成了-verbose:gc   -Xms60M   -Xmx512M,发现在接收前5000个信息时很快,只有少量gc。但是超过5000后,系统就非常慢,并且在不断的fullgc,经常连续好几个。

我反复检查了程序,没有发现内存泄漏,估计关键在于JVM的参数设置上,但是不会,希望大家给点意见!

------解决方案--------------------
建议通过修改程序或者增加硬件来解决
硬件的话增加内存就好了内存修改为: -Xms250M -Xmx1025M

你看看你的java实际占用了多少内存?
------解决方案--------------------
JAVA的内存泄露往往很难检查,我还是觉得再好好查查那个hashtable的使用。
------解决方案--------------------
UP
------解决方案--------------------
拆墙补漏而已,你一再的加大JVM的内存使用大小,只是延长你OUTOFMENMORY发生的时间而已
关键是看你程序,为社么会占用这么多的资源.优化程序(STRING边STRINGBUILDER?之类)或换个思路
------解决方案--------------------
暂时不用的数据,写文件存硬盘阿
------解决方案--------------------
还是得自己来优化程序哦。

------解决方案--------------------
一般来说程序都是可以优化的,应该不会占那么多内存的
------解决方案--------------------
应该是程序的问题吧
------解决方案--------------------
建议将数据持久化,也就是写到数据库或者文件当中去,以减小内存消耗。总之就是拿时间换空间。
------解决方案--------------------
fresh man, 学习
------解决方案--------------------
来学习了。up
------解决方案--------------------
内存数据库会自己管理内存,将暂时不用的数据从内存中拿出来放在磁盘空间中,这样的话可以减少内存的使用量。
------解决方案--------------------
可以用用 SoftReference
------解决方案--------------------
-Xms
------解决方案--------------------
学习一下,第一次了解
------解决方案--------------------
mark
------解决方案--------------------
可以使用borland的内存数据库
------解决方案--------------------
用JRockit看看,另外你的JDK版本是多少?用JRMC进行监控一下,应当有效果。
------解决方案--------------------
既然你要做server,你更不能只用hashmap来做这件事情,否则多少内存可能也不够。