Java 垃圾收集如何影响码头延迟?

Java 垃圾收集如何影响码头延迟?,java,garbage-collection,jvm,jetty,Java,Garbage Collection,Jvm,Jetty,我有一个jetty应用程序,每秒处理大约2k个请求。机器有8个核,JVM堆大小为8GB。有很多内存映射文件和内部缓存,因此占用了大部分堆空间(4.5 GB) 以下是应用程序稳定且JVM完成年轻和老gen空间调优后的统计数据: 年轻一代:2.6GB 老一代:5.4GB 我看到我的年轻GC每3秒钟被调用一次,整个Eden空间被清除(即,很少的数据被传递到老一代)。我明白,如此迅速地填满年轻一代意味着我分配了太多的对象,这是一个问题。但在我的应用程序中绝对没有内存泄漏,因为服务器已经运行了两周,没有发

我有一个jetty应用程序,每秒处理大约2k个请求。机器有8个核,JVM堆大小为8GB。有很多内存映射文件和内部缓存,因此占用了大部分堆空间(4.5 GB)

以下是应用程序稳定且JVM完成年轻和老gen空间调优后的统计数据: 年轻一代:2.6GB 老一代:5.4GB

我看到我的年轻GC每3秒钟被调用一次,整个Eden空间被清除(即,很少的数据被传递到老一代)。我明白,如此迅速地填满年轻一代意味着我分配了太多的对象,这是一个问题。但在我的应用程序中绝对没有内存泄漏,因为服务器已经运行了两周,没有发生OOM崩溃

Young GC是一项世界性的赛事。所以我的理解是,所有线程在此期间都会暂停。因此,当我从日志中监控延迟时,我可以看到每2-3秒大约有6-9个请求的响应时间>100ms(我的平均响应时间<10ms)。当调用fullgc时,我看到6-9个请求的响应时间大于3秒(这是fullgc所需的时间,因为调用它的次数非常少,所以这里没有问题)

我的问题是,既然我的jetty应用程序有一个200大小的线程池,并且没有有界的请求队列,那么调用young GC是否应该对我的响应时间产生影响呢?是否会向队列中的所有请求添加100毫秒的缓冲区

如果是这样的话,从添加到队列到输出响应,测量响应时间的最佳方法是什么?因为我上面提到的6-9请求是通过检查日志实现的。因此,基本上,当在发送响应之前调用应用程序逻辑时,我维护开始和结束时间变量,减去这2,并将其转储到日志中


一种方法是检查我的负载平衡器。但是,由于这些服务器位于ELB后面,因此除了平均响应时间之外,我在这里没有太多访问权限,这对我没有任何帮助。

您应该为应用程序启用GC日志记录。尝试添加以下jvm命令行参数

<代码>-XX:+PrintGCDetails-XX:+PrintGCDateStamp-XX:-PrintgTimestamp-XX:-PrintTenuringDistribution-XX:+PrintGC事业-XX:+PrintGCApplicationsTopedTime-XX:+UseGCLogFileRotation-XX:NumberOfGCLogFiles=-XX:GCLogFileSize=20M-Xloggc:/gc.log

然后查看GC日志中的事件,并尝试将其与应用程序日志关联