首页 文章

使用Jetty的应用程序在突然的内存和线程突发时获得OutOfMemoryError

提问于
浏览
2

我有一个嵌入式Jetty应用程序的问题 . 该应用程序突然需要大量的内存和线程,我得到一个内存不足的错误 .

该应用程序在java 1.7.51上运行Jetty 9.1.2.v20140210

发射参数是(现在)

-Xmx4096m -Xss4096k -XX:ParallelGCThreads=2 -Djava.awt.headless=true -server

到目前为止,我一直在尝试一些启动选项但没有取得多大成功 .

堆栈大小很大,因为我需要序列化/反序列化一个巨大的Java对象 .

Jetty设置是:

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有一个小文件I / O和日志记录 .

我无法100%确定没有内存韭菜,但我使用的各种工具(Java Visual VM和各种Jetty LeekPreventers)似乎表明没有(或者它是无关紧要的) .

该应用程序运行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 回答

  • 0

    升级到9.2.2-SNAPSHOT可以解决问题 .

相关问题