情况
我正在使用Java开发一个客户端参加比赛,每当我收到请求时,我有两秒钟的时间来做出响应。从响应到下一个请求的时间未知。
有时,找到正确的响应需要近2秒钟,有时只需要几毫秒。问题在于,当长时间计算(还分配了大量对象)中的垃圾回收在两秒钟结束前发生时,响应就会被发送太晚,我就会被取消资格。
使用verbose gc输出,我确定gc通常需要约0.6秒,尽管我试图将其限制在更低的时间。我还尝试在短计算上调用System.gc()
(因为我确定有约1.8秒不需要做任何事情),但它需要1-3秒,这也不安全。
我的程序中几乎没有长期存在的对象,大多数对象生存周期都不到一秒。
规格
我知道该程序将始终运行在同一台机器上,并可用以下资源:
- 64位Ubuntu
- openjdk:8u151-jre
- Intel® Xeon®处理器E5-2620 v4的一个核心
- 1.5 GB的RAM
我的当前jvm参数:
java -Dfile.encoding=UTF-8 \
-XX:MaxGCPauseMillis=200 \
-XX:GCPauseIntervalMillis=2050 \
-XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled \
-XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 \
-XX:+ScavengeBeforeFullGC -XX:+CMSScavengeBeforeRemark \
-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps
想法
- 我是否可以告诉垃圾回收器现在应该回收一些垃圾,但只要大约1.5秒钟?
- 是否有一个
System.gc()
等效的方法只使用于年轻对象,并且不检查老年代? - 是否可以优化jvm参数以取得更好的结果?