1

因此,我正在使用嵌入式码头和 maven app-assembler 插件运行 Web 服务器。当我直接调用 app-assembler 应用程序(以 root 身份运行)时,服务器启动正常。即使在 nohup 下运行,Web 服务器也可以完全正常启动。

当我将 app-assembler 脚本注册为 init.d 脚本(Runlevels 235 / Start pri 98 / Stop pri 20 )并使用 service 命令运行 init.d 脚本时,Web 服务器在启动期间挂起。

应用程序挂起的地方是在 Struts 2 约定插件中的类路径扫描期间。

如果我使用 'kill -QUIT' 杀死 Web 服务器,代码看起来就像卡在 Unix 文件系统中:

"main" prio=10 tid=0x09add800 nid=0xb33 runnable [0xb7361000]
   java.lang.Thread.State: RUNNABLE
        at java.io.UnixFileSystem.getBooleanAttributes0(Native Method)
        at java.io.UnixFileSystem.getBooleanAttributes(UnixFileSystem.java:228)
        at java.io.File.isDirectory(File.java:754)

我做了一些研究,似乎 NFS、java 和文件系统访问可能存在性能问题。

我遇到的问题是我们没有在我们的服务器上运行 NFS,据我所知,我们正在以相同的方式由同一个用户运行应用程序。

即使模仿服务命令的工作方式(在脚本启动之前运行'env -i'),直接运行脚本也不会挂起。

寻找解决此问题的任何建议或指示,或解决此问题的任何方法。

更新 (4/8/12)

我正在使用 Sun(Oracle) JDK 1.6.0_31

/usr/java/latest/bin/java -version  
java version "1.6.0_31"  
Java(TM) SE Runtime Environment (build 1.6.0_31-b04)  
Java HotSpot(TM) Server VM (build 20.6-b01, mixed mode)
4

1 回答 1

0

所以,我想通了这个问题。看起来我看到的线程卡在文件系统操作中的问题是由于递归符号链接,Java 将无限期地遵循。从 Unix 系统的根目录开始的任何扫描,遵循符号链接,都应该导致相同的问题(100% 的 CPU 使用率,并且文件扫描挂起)。

问题最终是服务脚本从根目录运行,调用脚本直接从我当前的工作目录开始。我修改了我的启动脚本,在运行之前移动了应用程序组装脚本的根,一切都很好。

于 2012-04-09T18:43:20.170 回答