我有一个jetty应用程序,每秒处理大约2k个请求。机器有8个核心,JVM堆大小为8 8GB。有许多内存映射文件和内部缓存,因此它们占用了大部分堆空间(4.5 GB)。
以下是应用程序稳定且JVM完成调优Young和Old gen空间后的统计数据:年轻一代:2.6 gen老一代:5.4 gen
我看到我年轻的GC每3秒被调用一次,整个伊甸园空间都被清除了(也就是说,传递给老一代的数据非常少)。我知道填满年轻一代意味着我分配了太多的对象,这是一个问题。但在我的应用程序中绝对没有内存泄漏,因为服务器已经启动了两周,没有OOM崩溃。
年轻的GC是一个停止世界的事件。所以我的理解是,所有线程在这段时间内都会暂停。因此,当我从日志中监控延迟时,我可以看到每隔2-3秒,大约6-9个请求的响应时间> 100ms (我的平均响应时间小于10ms)。当完整GC被调用时,我看到6-9个请求的响应时间>3秒(这就是完整GC所需的时间,因为它被调用得非常少,所以在这里不是问题)
是否会将100ms缓冲区添加到我的队列中的所有请求?
如果是这样,测量从添加到队列到输出响应的响应时间的最佳方法是什么?因为我上面提到的6-9请求是通过检查日志来实现的。
一种方法是检查我的负载均衡器。
发布于 2015-12-09 02:58:58
您应该为应用程序启用GC日志记录。尝试添加以下jvm命令行参数
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:-PrintTenuringDistribution -XX:+PrintGCCause -XX:+PrintGCApplicationStoppedTime -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=<REPLACE_ME> -XX:GCLogFileSize=20M -Xloggc:<path_to_gc_log_dir>/gc.log
然后查看GC日志中的事件,并尝试将其与应用程序日志相关联
https://stackoverflow.com/questions/34115847
复制相似问题