这种情况,如何设置JVM参数?难,头疼,高分
我最近做的一个项目,在性能上有严重的问题,希望大家给些建议。
情况如下:
一个java程序,需要不断地从服务器上接收信息(一些二进制数据),并且把它们缓存在内存中。(一个hashmap来放它们)
每个二进制数据的大小大约0.5K,每秒约80个。
这些二进制数据被解析后,每一个都会生成一个对象,但每个对象内部都有一些更小的对象的引用,来表示信息内容,平均下来每个信息大约有20个这样的小对象。在生成对象的过程中,有大量的短命对象生成。
一天下来,大约会收到500000个这样的信息。
合计起来,每天大约有250M左右的内存被固定占用。
有500000个这样的信息对象和500000*20个小对象被一直引用。
我使用默认运行方式(使用JVM默认参数),很快就CPU100%,程序运行很慢,不一会儿就outofmemory。
后来改成了-verbose:gc -Xms60M -Xmx512M,发现在接收前5000个信息时很快,只有少量gc。但是超过5000后,系统就非常慢,并且在不断的fullgc,经常连续好几个。
我反复检查了程序,没有发现内存泄漏,估计关键在于JVM的参数设置上,但是不会,希望大家给点意见!