使用Jetty的java应用程序在内存和线程突然爆发时出错
我有一个嵌入式Jetty应用程序的问题。应用程序突然需要大量内存和线程,我出现了内存不足错误
该应用程序正在运行Jetty 9.1.2。java 1.7.51上的v20140210
发射参数是(现在)
-Xmx4096m -Xss4096k -XX:ParallelGCThreads=2 -Djava.awt.headless=true -server
到目前为止,我一直在尝试一些发布选项,但没有取得多大成功
堆栈的大小很大,因为我需要序列化/取消序列化一个巨大的Java对象
码头设置为:
QueuedThreadPool threadPool = new QueuedThreadPool(56, 10);
server = new Server(threadPool);
ServerConnector connector = new ServerConnector(server);
connector.setIdleTimeout(1000);
connector.setPort(port);
connector.setHost(hote);
server.addConnector(connector);
该应用程序平均每秒处理6.67个请求(峰值为每秒16.23个请求)。平均请求时间为42毫秒。没有数据库I/O。Lucene和logging提供了一个小文件I/O
我不能100%确定没有内存韭葱,但我使用的各种工具(Java Visual VM和各种Jetty LeekPreventer)似乎表明没有内存韭葱(或者说它无关紧要)
应用程序运行24小时并重新启动。有时,随机的(3小时或20小时后),应用程序突然requires à large amount of memory and threads出现内存不足错误。然后我必须终止应用程序
我做了一次线程转储,发现几乎所有的线程都在等待
"qtp146419630-538" prio=10 tid=0x00007f07b0006800 nid=0x45f4 waiting on condition [0x00007f07fd7f3000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x0000000719d430f8> (a java.util.concurrent.Semaphore$NonfairSync)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:834)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:994)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1303)
at java.util.concurrent.Semaphore.acquire(Semaphore.java:317)
at org.eclipse.jetty.util.BlockingCallback.block(BlockingCallback.java:94)
at org.eclipse.jetty.server.HttpOutput.write(HttpOutput.java:125)
at org.eclipse.jetty.server.HttpOutput.write(HttpOutput.java:351)
at java.io.OutputStream.write(OutputStream.java:75)
at org.eclipse.jetty.server.HttpOutput.print(HttpOutput.java:485)
at javax.servlet.ServletOutputStream.println(ServletOutputStream.java:283)
at com.example.MyHandler.doPost(PhpHandler.java:190)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
有人知道这个问题的原因和解决方案吗
# 1 楼答案
升级至9.2.2-SNAPSHOT可修复此问题