Nat*_*teS 7 java debugging concurrency performance jboss
我正在对部署在JBoss中的Web应用程序进行一些负载测试.它启动很好,但随着测试的增加和更多的模拟用户开始攻击JBoss,性能严重下降:
转发时间表http://i46.tinypic.com/2mob2f9.jpg
将VisualVM连接到它,我可以看到线程都很好,然后突然开始花大部分时间等待监视器(绿色正在运行,红色是监视器,黄色是等待):
线程状态图http://i46.tinypic.com/105v6lk.jpg
运行jstack,我看到线程都在同一个地方等待:
"http-0.0.0.0-8080-172" daemon prio=6 tid=0x000000005da90000 nid=0xd2c waiting for monitor entry [0x000000006cb4e000]
java.lang.Thread.State: BLOCKED (on object monitor)
at org.apache.log4j.Category.callAppenders(Category.java:185)
- waiting to lock (a org.apache.log4j.spi.RootCategory)
at org.apache.log4j.Category.forcedLog(Category.java:372)
at org.apache.log4j.Category.debug(Category.java:241)
[my code]
大多数~200个HTTP处理器线程正在等待同一个监视器.查看WAR的log4j.xml,它为CONSOLE提供了一个appender设置.我删除了appender并再次尝试我的测试.相同的行为,除了jstack显示在不同的地方等待的所有线程:
"http-0.0.0.0-8080-251" daemon prio=6 tid=0x0000000059811800 nid=0x1108 waiting for monitor entry [0x0000000073ebe000]
java.lang.Thread.State: BLOCKED (on object monitor)
at java.util.Hashtable.get(Hashtable.java:333)
- waiting to lock (a org.jboss.util.property.PropertyMap)
at java.util.Properties.getProperty(Properties.java:932)
at org.jboss.util.property.PropertyMap.getProperty(PropertyMap.java:626)
at java.lang.System.getProperty(System.java:653)
at org.jaxen.saxpath.helpers.XPathReaderFactory.createReader(XPathReaderFactory.java:109)
at org.jaxen.BaseXPath.(BaseXPath.java:124)
at org.jaxen.BaseXPath.(BaseXPath.java:153)
at nu.xom.JaxenConnector.(JaxenConnector.java:49)
at nu.xom.Node.query(Node.java:424)
[my code]
什么都不做,我重新启动JBoss,运行测试,然后一旦它变慢就运行jstack.所有线程都在不同的地方等待:
"http-0.0.0.0-8080-171" daemon prio=6 tid=0x000000005d0d1000 nid=0x15d4 waiting for monitor entry [0x000000006cb4e000]
java.lang.Thread.State: BLOCKED (on object monitor)
at sun.nio.cs.FastCharsetProvider.charsetForName(FastCharsetProvider.java:118)
- waiting to lock (a sun.nio.cs.StandardCharsets)
at java.nio.charset.Charset.lookup2(Charset.java:449)
at java.nio.charset.Charset.lookup(Charset.java:437)
at java.nio.charset.Charset.isSupported(Charset.java:479)
at sun.nio.cs.StreamDecoder.forInputStreamReader(StreamDecoder.java:49)
at java.io.InputStreamReader.(InputStreamReader.java:57)
at java.io.FileReader.(FileReader.java:41)
[my code]
到底是怎么回事?我过去使用过jstack,当事情运行正常并得到预期的结果时我尝试运行它.我认为jstack很好.什么可能导致这种奇怪行为的想法?关于从哪里去的任何想法?
我在 Tomcat 中设置了通过 Eclipse 运行的应用程序,但没有发现问题。最终我发现我们使用 32 位 Windows 服务包装器启动 JBoss,尽管我们使用的是 64 位 JDK。该机器是 64 位的。我不确定这会如何运作?无论如何,更改为 32 位 JDK 使这个疯狂的问题消失了,我能够继续我的生活。