码头间歇性撞击的问题

时间:2010-08-18 07:00:42

标签: java logging monitoring jetty

我遇到了码头间歇性撞击的问题,我正在使用Jetty 6.1.24。

我正在运行一个neo4j Spring MVC webapp,Jetty将保持运行大约1小时,然后我必须重新启动Jetty。它运行在小型amazon ec2实例上,debian具有1.7GB的RAM。

我使用java -Xmx900m -server -jar start.jar

启动Jetty

我使用putty连接到服务器,当Jetty崩溃putty会话断开连接时,我看不出是什么错误导致它崩溃。

我希望能够看到它是否是Spring生成的错误,我不知道如何使用Jetty从spring应用程序记录输出。或者如果它是Jetty或内存问题,那么监控Jetty的最佳方法是什么?我无法在运行Windows的本地计算机上重新创建此项。您认为最好的方法是什么?感谢

4 个答案:

答案 0 :(得分:5)

这不是一个程序员问题;也许它会转移到ServerFault。

您没有明确说明您正在使用哪种操作系统,但我对某些Linux发行版有所猜测。你有两种方法可以搞清楚是什么问题:

  1. 在屏幕上开始您的会话。 屏幕将在实际机器启动时生效,直到您重新启动操作系统(或退出屏幕)。

    你像这样开始屏幕

    screen
    

    然后你会得到一个新的提示,你可以在那里开始你的程序(cd foo,jetty等)。如果你很开心并且你只需要去某个地方,你可以通过按CTRL + A然后按CTRL + D来断开屏幕。在调用screen之前,你会回到原来的位置。

    要返回查看screen您键入的screen -R,这意味着要恢复现有的屏幕。你应该再次看到码头。

    好消息是,如果你失去连接(或偶然关闭腻子或其他什么),那么你可以使用screen -list获取正在运行的屏幕列表,然后强行分离它们-D和将它们重新连接到当前的油灰-R,没有伤害!

  2. 使用nohup。 Nohup或多或少地分离了你从控制台运行的进程,因此没有输出到终端。您以正常方式启动程序,但是在命令中添加了单词nohup

    例如:

    nohup ls -l &
    

    ls -l完成后,您的输出存储在nohup.out中。

答案 1 :(得分:4)

当你说崩溃时,你的意思是JVM段错误并消失了吗?如果是这种情况,我会检查并确保您没有耗尽机器的可用内存。当系统内存变得如此之低以至于JVM无法分配到其最大内存时,Linux上的Java将崩溃。例如,您已将最大JVM内存设置为500MB,目前使用250MB。但是,Linux操作系统只有128MB可用。这会产生不稳定的结果,JVM会出现段错误。

在Windows上,JVM在这种情况下运行得更好,并在系统内存不足时抛出OutOfMemoryError。

  1. 验证崩溃时可用的系统内存量。
  2. 验证您的盒子上的其他进程是否占用了大量内存。关闭任何可能与JVM竞争的东西。
  3. 运行jconsole并将其连接到JVM。这将告诉您如何在JVM进程中使用内存,并为您提供历史记录,以便在崩溃时回顾它。
  4. 在进行此类测试时,消除可能加载到JVM中的任何本机代码。
  5. 我相信Jetty有一些本机代码可以进行大量请求处理。确保没有使用。您希望将崩溃隔离到Java而不是一些奇怪的本机lib。如果你拿出原生的东西并发现它有效,那么你就可以得到你的答案。如果它继续崩溃,那么很可能就是我所描述的。

    您可以强制JVM在启动时使用-Xms900m分配所有内存,以确保JVM不会与其他内存进程竞争。一旦分配了完整的Xmx金额,它就不会崩溃。不是解决方案,但您可以通过这种方式轻松测试。

答案 2 :(得分:2)

启动java时,将两个输出(stdout和stderr)重定向到文件:

使用Bash:

java -Xmx900m -server -jar start.jar > stdout.txt 2> stderr.txt

崩溃后,请检查这些文件。

如果崩溃是由信号引起的(如SEGV =分段错误),那么JVM应该在您启动java的位置进行文件转储。对于Sun VM(热点),它类似于hs_err_pid12121.log(此处12121是进程ID)。

答案 3 :(得分:1)

Putty断开连接强烈提示服务器内存不足并开始左右关闭进程。可能你的码头实例变得太大了。

现在最简单的做法是添加1-2 Gb 更多交换空间并再次执行此操作。另请注意,您可以使用jvisualvm附加到jetty实例以直接获取运行时信息。