提供给用户现场的一个程序出现了些问题,数据上传进程并发数达到一定数量后java会进程奔溃。经过测试和jstack定位后发现是因为等待gc的对象占用过多内存导致服务器资源被用光导致的。
这是原有的数据上传进程的设计。又一个读线程,一个写线程和一个定长缓冲队列组成的异步上传功能。其读线程读到数据后会产生新的对象传递给上传线程。使用完后对象便会等待gc。由于gc的逻辑和频率,上传较大数据量时一般会将配置给jvm的内存空间全都占满。
这是我的优化方案。使用两个转运队列,任务周期内始终使用这些对象,而不产生新的对象,经过测试有效的控制了内存空间的使用。
对此我和领导对于此问题的看法产生了分歧。领导的原因有两点
1.此方案是c的思路,维护不便,背离了java提供gc的初衷
2.线程应该根据实际情况调整jvm参数。此问题是Notbug
陷入沉思。我认为虽然有gc,但是控制内存占用的优化还是有必要的。