我正在测试一个用Java编写的API,它可以最大限度地减少处理通过网络接收的消息的延迟.为了实现这些目标,我正在使用可用的不同垃圾收集器.
我正在尝试四种不同的技术,它们利用以下标志来控制垃圾收集:
1)Serial:-XX:+ UseSerialGC
2)并行:-XX:+ UseParallelOldGC
3)并发:-XX:+ UseConcMarkSweepGC
4)并发/增量:-XX:+ UseConcMarkSweepGC -XX:+ CMSIncrementalMode -XX:+ CMSIncrementalPacing
我在五个小时的过程中运行了每种技术.我定期使用ManagementFactory.getGarbageCollectorMXBeans()提供的GarbageCollectorMXBean列表来检索收集垃圾所花费的总时间.
我的结果?请注意,此处的"延迟"是"我的应用程序+ API用于处理从网络中提取的每条消息所花费的时间."
序列号:789次GC事件总计1309 ms; 平均潜伏期47.45 us,中位潜伏期8.704 us,最大潜伏期1197 us
平行:1715个GC事件总计122518毫秒; 平均延迟450.8 us,中位潜伏期8.448 us,最大延迟8292 us
并发:4629次GC事件总计116229 ms; 平均潜伏期707.2 us,中位潜伏期9.216 us,最大潜伏期9151 us
增量:5066 GC事件总计200213 ms; 平均潜伏期515.9 us,中位潜伏期9.472 us,最大潜伏期14209 us
我发现这些结果是如此不可能,以至于它们与荒谬相接.有谁知道为什么我会有这样的结果?
哦,为了记录,我正在使用Java HotSpot(TM)64位服务器VM.
我的工作是支持一家科技公司.我正在尝试在现场解决我们的一个应用程序的实例,并需要监视TCP套接字缓冲区的完整性.
我知道如果我可以访问源代码,我可以使用ioctl和SIOCOUTQ在任何时间点查询套接字缓冲区的完整性.
但我没有.
所以我的问题是,有没有办法从应用程序外部查看套接字缓冲区的完整性?
Google引导我进入/ proc/net/tcp,但我并不是100%确定tx_queue列是我正在寻找的.是吗?
如果是这样,是否足够"实时"我可以编写一个perl脚本来不断轮询它以获得套接字缓冲区利用率的视图?