1

我有一个具有 doPost 方法的 Java Servlet,当 doPost 完成时,我认为 Glassfish 会关闭连接,但我错了。Servlet 位于 Linux 服务器上,在 300 个帖子后返回线程数:

ps -eLFU glassfish | grep domain1 | wc -l
362

在任何帖子之前,线程数是 72。响应都是成功的,但我不明白为什么 Glassfish 没有关闭连接。我正在使用 Glassfish 的默认配置。

我试图解决这个问题的原因是当我的 servlet 在某个时候被命中时,我在 Linux 服务器上收到了这个错误:

su: cannot set user id: Resource temporarily unavailable

在 /etc/security/limits.conf 我有这个:

glassfish hard nproc 4192
glassfish soft nproc 2024

我不想更新limits.conf,而是尝试确保它没有达到这些数字。

4

2 回答 2

1

glassfish 是否保持连接打开?还是线程正在运行?它们是不同的东西。线程可能会启动,但不会关闭以在将来为新连接提供服务。这是标准行为。您可以使用“kill -3 PID”进行线程转储,其中 PID 是 glassfish 进程的进程 ID?这会将所有正在运行的线程转储到标准输出,您可以看到每个线程在做什么。在那里,您将能够查看它是否卡在您的代码中或等待新连接。您可以在此处找到有关如何获取线程转储的更多信息。

于 2013-02-19T13:55:58.810 回答
0

发现问题是代码问题。servlet 使用客户端来调用 Web 服务,并且客户端需要是单例的。最初我为每个 POST 创建一个客户端到 servlet,它在 glassfish 下创建了很多线程。一旦我让客户端成为单例,线程数就会下降很多。

于 2013-02-20T17:42:06.563 回答