java - Upstart java应用程序看到CPU使用率很高

标签 java upstart

我有一个基于java的应用程序要在ubuntu上运行,为了启动服务器并使其保持 Activity 状态,我编写了一个upstart脚本。

问题是upstart服务启动了,它消耗了100%的cpu,这个应用程序有一堆线程,只有一个是高的。

请注意,从命令行启动java应用程序不会出现此问题。

description "adworker upstart service"
#umask 0007
respawn limit 15 5
oom never

start on (local-filesystems
    and net-device-up IFACE!=lo)
stop on shutdown

respawn

pre-start script
  . /etc/adworker.conf
  rm -rf $LOG_DIR
  mkdir -p -m0755 $LOG_DIR
  chown $USER:$GROUP $LOG_DIR
end script

script
  . /etc/adworker.conf
  OPTS="-Djava.ext.dirs=lib"
  chdir $APP_DIR
  JAVA_OPTS="-Xms${XMS} -Xmx${XMX} -Xss${XSS} $OPTS"
  exec su -s /bin/sh -c "/usr/bin/java ${JAVA_OPTS} -classpath ${CP} ${MAIN_CLASS}" $USER > ${LOG_DIR}/adworker.stdio 2>&1
end script

post-stop script
end script

谢谢。

最佳答案

好的,问题解决了:

引用the solution from this post

使用top -H来识别

  • 进程 pid 7848
  • 高 CPU 线程 pid 7849

然后在python

>>> hex(7849)
'0x1ea9'

执行线程转储:

$ sudo jstack 7849 >> threaddumps.log
$ cat threaddumps.log | less

搜索0x1ea9并发现它位于主类的第24行,其中有一个从标准输入读取的愚蠢的while循环。

"main" prio=10 tid=0x00007f6714008800 nid=0x1ea9 runnable [0x00007f6719088000]
   java.lang.Thread.State: RUNNABLE
        at java.io.FileInputStream.readBytes(Native Method)
    at java.io.FileInputStream.read(FileInputStream.java:242)
    at java.io.BufferedInputStream.fill(BufferedInputStream.java:235)
    at java.io.BufferedInputStream.read(BufferedInputStream.java:254)
    - locked <0x00000000bfb81980> (a java.io.BufferedInputStream)
    at com.adcade.SessionEventWorker.main(SessionEventWorker.java:24)

我相信在命令行中是可以的,因为进程优先级较低,但在 upstart 中情况并非如此。

关于java - Upstart java应用程序看到CPU使用率很高,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16718653/

相关文章:

java - 将我的java应用程序与fosuserbundle的表用户同步

node.js - 在机器启动时启动 Node 服务器

process - 使用Upstart设置内存消耗限制

java - 随机化顶点位置 JUNG

java - 如何通过 arquillian.xml 中的限定符选择容器?

java - 如何在 java 中格式化像 0#.## 这样的 float ?

java - 我的自定义 JDialog 出现,但为空

ruby-on-rails - 使用 Upstart 管理 Unicorn w/rbenv + bundler binstubs w/ruby-local-exec shebang

node.js - 如何使用通用规范或元配置生成 upstart 和 monit 配置文件?

linux - 从 Upstart 脚本中读取文件