Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果探查器可以';你不采集样本吗?_Java_Performance_Clojure_Profiling_Yourkit - Fatal编程技术网

Java 如果探查器可以';你不采集样本吗?

Java 如果探查器可以';你不采集样本吗?,java,performance,clojure,profiling,yourkit,Java,Performance,Clojure,Profiling,Yourkit,我写的服务器偶尔会出现问题。它在Clojure中,但我认为这无关紧要,我们可以假装它在Java中。不管怎么说,它一次可以正常工作几个小时,但在表现非常糟糕的情况下会出现阵发性反应:所有活动都停止,大约15秒,然后正常工作几秒钟,然后停止15秒……然后(通常)大约10分钟左右,然后恢复正常 我用YourKit做了很多分析,排除了一些可能的嫌疑犯: 这不是垃圾收集问题:我正在使用-XX:+UseConMarkSweepGC运行它,并且我已经验证了服务器在次要和主要收集期间都可以正常运行,这是由于此

我写的服务器偶尔会出现问题。它在Clojure中,但我认为这无关紧要,我们可以假装它在Java中。不管怎么说,它一次可以正常工作几个小时,但在表现非常糟糕的情况下会出现阵发性反应:所有活动都停止,大约15秒,然后正常工作几秒钟,然后停止15秒……然后(通常)大约10分钟左右,然后恢复正常

我用YourKit做了很多分析,排除了一些可能的嫌疑犯:

  • 这不是垃圾收集问题:我正在使用
    -XX:+UseConMarkSweepGC
    运行它,并且我已经验证了服务器在次要和主要收集期间都可以正常运行,这是由于此垃圾收集器的并发性。而且,当内存耗尽时,我们并没有受到影响:当前的堆大小远远低于其最大值

  • 我不认为这是一个锁定/同步问题,但我不是100%确定。YourKit探查器显示线程有时会等待,例如争夺System.out的锁以生成日志消息,但唯一长时间的等待是在线程池中无事可做时等待工作线程。当然,你的工具包说它从未检测到任何死锁

  • 这并不是由于连接了探查器而导致的,因为即使我启动服务器,然后不连接探查器就让它单独运行,这种情况仍然会发生

  • 它不是系统上的其他进程占用所有CPU时间:
    top
    显示我的java进程的CPU使用率为100%,其他所有进程的CPU使用率基本为0%

我最大的问题是,在这些奇怪的恐慌期间,我看不到服务器在做什么,因为分析器停止接收样本。以下是CPU使用率图表:

图的左侧是正常操作,在此期间,我们每隔一秒钟左右获取一次分析器样本。右侧是“断开的”,并且非常尖锐,因为分析器大约每10秒才获取一次样本。在它确实得到的示例中,服务器似乎在做它通常的事情:响应请求等等;日志确认它正在做正常的事情,但只是在探查器有样本的时候:在图形上向上倾斜的“直线”期间,探查器没有样本,服务器什么也不做

那么,这张图大家熟悉吗?您以前有过这个问题并解决了吗?或者,您可以为我指出一个工具的方向,该工具可以在您的工具包无法完成任务的情况下确定我的服务器在做什么?如果有问题,服务器机器运行的是Ubuntu 10.04,并且

$ java -version
java version "1.6.0_22"
OpenJDK Runtime Environment (IcedTea6 1.10.10) (rhel-1.28.1.10.10.el5_8-x86_64)
OpenJDK 64-Bit Server VM (build 20.0-b11, mixed mode)

好的,从评论中我看很清楚,根据你目前提供的信息,我们无法解决这个问题。我们能做的最好的事情就是给出如何调试它的建议


我会尝试在其中一个峰值期间使用,看看您是否可以使用它来确定它挂起的位置。

如果您没有机会在代码中进行测量或调试,请尝试从外部查看

我会首先尝试重现这个问题。换句话说,是否存在产生该行为的外部事件。尝试更改服务器上的负载。尽可能切换每件事以重现问题

也许在服务器挂起时,嗅探网络流量(tcpdump)来发现一些有趣的东西也是一个好主意

您还可以在另一个操作系统上运行它,以检查它是否依赖于您的安装环境

如果你不能重现问题发生的情形,那么试着找出你没有遇到问题的情形。例如,从网络中删除服务器。关闭所有其他服务

如果您无法找到程序行为的任何变化,请尝试降低工作代码的复杂性,并查看是否可以找到与问题相关的内部模块

您以前有过这个问题并解决了吗?或者你能给我指一指吗 工具的方向,该工具可以了解我的服务器正在做什么 当你的装备不能用的时候

如果您在服务器上具有shell访问权限,并且可以看到stdout,请在服务器无响应时尝试执行线程转储。不确定这是否会给你带来与jstack(在另一个答案中提到)不同的东西

在Ubuntu上:
kill-QUIT
(实际上不会终止Java进程)


这可能是一个巨大的麻烦,但您可以在整个代码中调试日志记录,然后查看写入日志的内容。另一种可能性是,问题不在于java程序,而在于服务器上的某个其他作业占用了10分钟的所有资源。挂起时需要得到什么,然后检查并理解它。这不是关于测量-这是关于“为什么挂起?”当然,正如durron597所说,这可能不是您的代码出了问题,因此您可能需要所有线程的样本。这是一个很好的观点,@durron,但在这台机器上运行的没有其他有趣的内容,
top
显示了java进程在其“悲伤时期”使用100%CPU的情况。我将把它编辑成问题。正如我提到的,我已经有很多日志记录了:当服务器被卡住时,这些都不会发生。即使使用CMS,停止world full GC有时也会启动。您是否启用/检查了普通GC日志?@fglez是的,并且还通过探查器观察了应用程序在GC期间的行为。我很自信这不是一个GC相关的问题。我以前没有使用过jstack-它告诉你的不仅仅是一个简单的线程转储吗?@Alex是的,它告诉了你。阅读文档好吧,他专门询问关于调试它的建议。