首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在tomcat中运行占用高内存的超长请求?

如何在tomcat中运行占用高内存的超长请求?
EN

Stack Overflow用户
提问于 2019-11-24 15:25:47
回答 3查看 527关注 0票数 1

我有一台tomcat服务器。在tomcat服务器中,我处理了一些restful请求,这些请求调用了内存使用率非常高的服务器,这可能会持续15分钟,最终导致tomcat崩溃。

我如何运行这个请求: 1.不使tomcat崩溃? 2.不超过restful请求的3分钟限制?

谢谢。

EN

回答 3

Stack Overflow用户

发布于 2019-11-24 16:24:15

基本上,你所问的问题可以归结为:

对于在Tomcat上运行的一些任务,我没有告诉你任何事情,我如何让它运行得更快,使用更少的内存,而不会崩溃。

在一般情况下,你需要分析你的代码,找出为什么它花了这么长的时间和使用了这么多的内存。然后,您需要根据需要对其进行修改或重写,以降低内存使用率,提高效率。

我不认为在没有更多细节的情况下,我们可以提供明智的建议来让请求更快,等等。例如,有些人建议将请求拆分为较小的请求,或者异步执行较大的请求,这些建议不一定会有帮助。在没有了解真正的问题之前,你不应该尝试这些想法。

也有可能是您的任务耗时太长,并且由于特定原因导致Tomcat崩溃:

  • 可能是请求使用(过多)内存实际上导致请求花费的时间太长。如果JVM耗尽了堆内存,它将花费越来越多的时间运行GC。最终,它会因为OutOfMemoryError而失败。内存的过度使用可能与请求的任务大小有关,过度的内存使用可能是由您的代码中的错误(内存泄漏)或某个第三方库中的错误(内存泄漏)引起的,该问题可以通过以下方法解决:

代码语言:javascript
运行
复制
- increasing Tomcat's heapsize,
- fixing the memory leak, or
- limiting the size of the "problem" that the request is trying to solve.

也有可能你的代码中有一个bug;例如一个无限循环。

总而言之,您没有提供足够的信息来进行正确的诊断。我们能做的最多的就是提出可能的原因。我猜,真的。

票数 1
EN

Stack Overflow用户

发布于 2019-11-24 16:42:31

尝试另一种架构方法。REST被设计成无状态的,所以你必须引入状态。

我建议你去实现...

在后台以批处理的形式提交长时间运行的任务(如@kamran-ghiasvand所建议的)。

  • 提交启动批处理并返回唯一ID的提交请求
  • 报告任务状态的状态请求(例如每5秒自动刷新屏幕一次)。您可以在html/页面上执行此操作,也可以作为ajax。

为了让您了解在后端可能需要什么,我在下面引用了我们的PaymentService接口。

代码语言:javascript
运行
复制
public interface PaymentService {

   PnExecution createPaymentExecution(List<Period> Periods, Date calculationDate) throws PnValidationException;
   Long createPaymentExecutionAsync(List<Period> Periods, Date calculationDate);

   PnExecution simulatePaymentExecution(Period Period, Date calculationDate) throws PnValidationException;

   Void deletePaymentExecution(Long pnExecutionId, AsyncTaskListener<?, ?> listener);
   Long deletePaymentExecutionAsync(Long pnExecutionId);

   void removePaymentNotificationFromPaymentExecution(Long pnExecutionId, Pn paymentNotification);
}

关于性能:尝试找到内存消耗者,并尝试将问题排序,将其分成几个步骤。确保您没有通过引用未使用的对象来创建内存泄漏。最后的办法是并发(独立任务)或并行(处理相似任务)。但这些问题中的大多数都是过于直接的体系结构方法造成的。

票数 1
EN

Stack Overflow用户

发布于 2019-11-24 16:50:48

tomcat服务器崩溃与请求处理时间无关,但它可能是由于JVM堆内存溢出(或数千种其他原因)造成的。你应该通过仔细调查tomcat日志来确定崩溃的原因。如果原因是内存不足,您可以在启动tomcat时使用'-Xmx‘标志为JVM分配更多的内存。例如,您可以在您的setenv.sh中添加以下行,以便为tomcat分配2 2GB的ram:

代码语言:javascript
运行
复制
CATALINA_OPTS="-Xmx2048m"

在请求超时方面,也有许多原因在这里发挥作用。例如,http连接器的connectionTimeout (请参阅server.xml)、网络或浏览器或web客户端限制以及许多其他原因。

一般来说,通过restful请求同步发出这么长的请求是非常糟糕的做法。我建议您考虑另一种解决方法,例如websocket或推送通知,用于通知用户其耗时的请求已在服务器端完成。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59015505

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档