码头间歇性撞击的问题

pat*_*oid 8 java logging monitoring jetty

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

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

我开始使用Jetty java -Xmx900m -server -jar start.jar

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

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

mog*_*sie 5

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

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

  1. 在屏幕上开始您的会话. 只要实际机器开机,屏幕就会一直运行,直到您重新启动操作系统(或退出屏幕).

    你像这样开始屏幕

    screen
    
    Run Code Online (Sandbox Code Playgroud)

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

    返回查看screen您键入的内容screen -R,表示恢复现有屏幕.你应该再看看码头.

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

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

    例如:

    nohup ls -l &
    
    Run Code Online (Sandbox Code Playgroud)

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


chu*_*ubs 4

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

在 Windows 上,JVM 在这种情况下表现得更好,并且当系统内存不足时会抛出 OutOfMemoryError。

  1. 验证崩溃期间有多少系统内存可用。
  2. 验证您机器上的其他进程是否占用了大量内存。关闭任何可能与 JVM 竞争的内容。
  3. 运行 jconsole 并将其连接到您的 JVM。这将告诉您 JVM 进程中的内存使用情况,并为您提供崩溃时的历史记录供您回顾。
  4. 进行此类测试时,请消除可能加载到 JVM 中的任何本机代码。

我相信 Jetty 有一些本机代码可以进行大量请求处理。确保它没有被使用。您希望将崩溃隔离到 Java 而不是一些奇怪的本机库。如果您拿出本机的东西并发现它可以工作,那么您就可以找到导致它的原因的答案。如果它继续崩溃那么它很可能就是我所描述的。

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