resin自动重启(程序无限循环导致)

问题:生产库Web集群服务器中Resin容器不断不定时自动重启

0,查看应用程序日志,没有发现自动重启的原因
1,查看resin日志,希望从中得到更多的异常信息辅助排查,没有看到有价值的异常信息。
修改resin默认的日志配置,显示更加多的信息来排查
2,查看系统日志文件(/var/log下面的各种日志),没有发现问题
3,设置jvm出错时的日志文件位置,java -XX:ErrorFile=/var/log/java/java_error_%p.log(11),发现在resin自动重启时,没有产生上述的异常日志文件。
4,参考resin官网trouble shooting
5,用jstat命令查看jvm中堆和永久代内存的分配使用情况,没有发现问题(在上述内存没有满时,resin又自动重启了)
6,调大每个线程使用的堆大小,配置jvm参数-Xss16M,问题依旧
7,<jvm-arg>-Xcheck:jni</jvm-arg>
8,后发现每次resin自动重启前,在nginx的access日志中都有一个google robot访问某url的记录,查看具体url相关代码,发现里面有一死循环。。。。。

附录1(jvm crash log):
Java的应用有时候会因为各种原因Crash,这时候会产生一个类似java_errorpid.log的错误日志。可以拿到了这个日志,怎样分析Crash的原因呢?下面我们来详细讨论如何分析java_errorpid.log的错误日志。
一. 如何得到这个日志文件如果有一个严重的错误引起Java进程非正常退出,我们叫Crash,这时候会产生一个日志文件。缺省情况下,这个文件会产生在工作目录下。但是,可以在Java启动参数通过下面的设置,来改变这个文件的位置和命名规则。例如:
java -XX:ErrorFile=/var/log/java/java_error_%p.log
就将这个错误文件放在/var/log/java下,并且以java_error_pid.log的形式出现。

查找JVM的致命错误日志
这时候可以查一个以 "hs_err_pid" 开头的日志名,例如hs_err_pid1125.log,其中1125是进程号。这个文件中也记录了一些宝贵的信息来提供一些线索,特别是Java自身的一些Bug。这个文件一般为于当前的工作目录中 bin目录下,同时会有core.1125的文件,可以用jstack来查看程序崩溃当时的线程状态,是否有死锁。用户可以用find命令自己搜索到。

附录2(resin log):
把修改resin.conf文件中的日志的级别由info-》finer(all)
<!--
     - Logging configuration for the JDK logging API.
    -->
  <log name="" level="[color=red]all[/color]默认值是info" path="stdout:"
       timestamp="[%H:%M:%S.%s] {%{thread}} "/>

  <!--
     - 'info' for production
     - 'fine' or 'finer' for development and troubleshooting
    -->
  <logger name="com.caucho" level="[color=red]all[/color]默认值是info"/>

  <logger name="com.caucho.java" level="[color=red]all[/color]默认值是config"/>
  <logger name="com.caucho.loader" level="[color=red]all[/color]默认值是config"/>

在host-default标签下添加如下配置,把系统的stdout和stderr日志输出到指定文件
<log name="" level="all" path="stdout:"   timestamp="[%Y-%m-%d %H:%M:%S] {%{thread}} "/>
<log name="" level="all" path="stderr:"   timestamp="[%Y-%m-%d %H:%M:%S] {%{thread}} "/> 
<stdout-log path="logs/${host.name}/stdout.log" (12)
            archive-format="stdout-%Y%m%d.log.gz"
            timestamp="[%Y.%m.%d %H:%M:%S.%s]" 
            rollover-size="10mb"
            rollover-period="1D"/>
      <stderr-log path="logs/${host.name}/stderr.log" 
            archive-format="stderr-%Y%m%d.log.gz"
            timestamp="[%Y.%m.%d %H:%M:%S.%s]" 
            rollover-size="10mb"
            rollover-period="1D"/>



附录3(resin jmx配置):
<jvm-arg>-Dcom.sun.management.jmxremote</jvm-arg>
<jvm-arg>-Dcom.sun.management.jmxremote.port=12345</jvm-arg>
<jvm-arg>-Dcom.sun.management.jmxremote.ssl=false</jvm-arg>
<jvm-arg>-Dcom.sun.management.jmxremote.password=false</jvm-arg>
<jvm-arg>-Dcom.sun.management.jmxremote.authenticate=false</jvm-arg>
<jvm-arg>-Djava.rmi.server.hostname=192.168.0.31</jvm-arg>

重启resin,查看12345端口有没有在监听

参考:
caucho resin Troubleshooting
infinite loop

你可能感兴趣的:(java,jvm,nginx,应用服务器,sun)