java - 使用 Jetty 的应用程序在内存和线程突然爆发时获取 OutOfMemoryError

标签 java jetty

我的嵌入式 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)

有没有人知道这个问题的原因和解决方案?

最佳答案

升级到 9.2.2-SNAPSHOT 解决了这个问题。

关于java - 使用 Jetty 的应用程序在内存和线程突然爆发时获取 OutOfMemoryError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24308840/

相关文章:

java - TCP服务器接受连接后新线程的代码不执行

java - org.eclipse.ui.internal.WorkbenchPage.showView 的 NullPointerException

jetty - 如何在嵌入式jetty服务器中启用eTag

java - 在 jetty 和 tomcat 上运行 spring hibernate web 应用程序

java - 通过链接的 docker 容器将正确的 ip 从 nginx 传递到 jetty

tomcat - Jenkins 独立实现 : Winstone or Jetty?

java - 如果应用程序包含@KafkaListener注释,SpringBootTest会失败

java - Flying Saucer 库是否支持 Google App-Engine?

java - 按集合中的内部集合元素类型分组

java - 在 Maven 中设置外部依赖关系的最佳方法