【问题标题】:Tomcat 6 thread issueTomcat 6 线程问题
【发布时间】:2013-02-15 00:24:59
【问题描述】:

您好,我们已经在 java 1.6、tomcat 6、oracle 11g 上迁移了我们的 java web 应用程序 但是现在我们在网站关闭一段时间后面临问题: 我们得到 java heap out of memory 错误,许多线程处于等待状态。 tomcat 被挂了,我们的网站正在崩溃

INFO:为地址为空且端口为 80 的连接器创建的最大线程数 (200) 2013 年 2 月 21 日晚上 9:56:04 这是线程日志:

日志
"main" prio=10 tid=0x09f67c00 nid=0x2d51 runnable [0xf7622000]
       java.lang.Thread.State: RUNNABLE
        at java.net.PlainSocketImpl.socketAccept(Native Method)
        at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:390)
        - locked <0xc5078c60> (a java.net.SocksSocketImpl)          
    "VM Thread" prio=10 tid=0x09f8ac00 nid=0x2d52 runnable     
    "VM Periodic Task Thread" prio=10 tid=0x09f9cc00 nid=0x2d58 waiting on condition     
    JNI global references: 1074    
    Heap
     def new generation   total 78656K, used 78533K [0xbf760000, 0xc4cb0000, 0xc4cb0000)
      eden space 69952K, 100% used [0xbf760000, 0xc3bb0000, 0xc3bb0000)
      from space 8704K,  98% used [0xc4430000, 0xc4c91428, 0xc4cb0000)
      to   space 8704K,   0% used [0xc3bb0000, 0xc3bb0000, 0xc4430000)
     tenured generation   total 174784K, used 174783K [0xc4cb0000, 0xcf760000, 0xcf760000)
       the space 174784K,  99% used [0xc4cb0000, 0xcf75fff8, 0xcf760000, 0xcf760000)
     compacting perm gen  total 33792K, used 33647K [0xcf760000, 0xd1860000, 0xd3760000)
       the space 33792K,  99% used [0xcf760000, 0xd183be68, 0xd183c000, 0xd1860000)
        ro space 10240K,  61% used [0xd3760000, 0xd3d86298, 0xd3d86400, 0xd4160000)
        rw space 12288K,  60% used [0xd4160000, 0xd4896cb8, 0xd4896e00, 0xd4d60000)
结尾

请指导。

谢谢, 阿鲁

【问题讨论】:

  • 处于 WAITING 状态的线程和 OutOfMemoryErrors 是完全不同的东西。第一个绝对不能是问题(但可以是),并且不能与后者相关。我会首先面对 OOM 错误。 heap 和 permgen 大小是否设置为与迁移前相同?
  • @MRalwasser:我们正在使用这些选项 JAVA_OPTIONS="-Xms512m -Xmx2048m -XX:MaxPermSize=512m -verbose:gc";export JAVA_OPTIONS
  • 尝试 JAVA_OPTS 而不是 JAVA_OPTIONS。

标签: java unix tomcat tomcat6


【解决方案1】:

根据您发布的日志,您在上面的评论中提到的 jvm 设置(在JAVA_OPTIONS 中定义)根本没有得到尊重/使用。
(例如,使用 permgen 的 32m 而不是指定的 512m)。

我的猜测是您只是为环境变量使用了错误的名称:
在tomcat中指定JVM设置的正确环境变量命名为JAVA_OPTS

【讨论】:

  • 你能指导我如何调查我是 tomcat 的新手,我在启动 tomcat 脚本中注意到的一件事,无论我写导出它给我错误“:无效标识符”
  • 您根本不应该更改 tomcat 脚本。只需在执行 startup.sh 之前设置环境变量(在 unix 上,调用:export JAVA_OPTS="-Xms512m -Xmx2048m -XX:MaxPermSize=512m" )
  • 如果我 hv 用户 java_options 那么这意味着它正在使用一些默认值它不是全部读取 java_options
  • 正如我在回答中所说,正确的名称是 JAVA_OPTS - 而不是 java_options。恢复您对 tomcat 脚本所做的所有更改并调用我之前评论中所述的命令 - 这很可能会解决您的问题。
  • 感谢您的帮助,我将使用您建议的更改,您能告诉我 unix 中的命令查看默认 jvm 堆大小
【解决方案2】:

看起来 perm gen 空间已全部使用。您是否尝试过使用 -XX:MaxPermSize=128M 来增加它?

【讨论】:

  • 128m和128M有区别吗
猜你喜欢
  • 2011-02-20
  • 2011-10-15
  • 1970-01-01
  • 2011-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-02
相关资源
最近更新 更多