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

Java 如何在tomcat中运行使用高内存的超长请求?,java,tomcat,microservices,Java,Tomcat,Microservices,我有一个tomcat服务器。 在tomcat服务器中,我处理一些restful请求,这些请求调用非常高的内存使用率服务器,这可能会持续15分钟,最终导致tomcat崩溃 如何运行此请求: 1.没有撞坏雄猫? 2.在restful请求上不超过3分钟的限制 谢谢。基本上,你的问题归结为: 对于在Tomcat上运行的一些任务,我没有告诉过您,如何使它运行得更快,使用更少的内存,并且不会崩溃 在一般情况下,您需要分析您的代码,以找出它花费如此长时间和使用如此多内存的原因。然后,您需要根据需要修改或重写它

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

如何运行此请求: 1.没有撞坏雄猫? 2.在restful请求上不超过3分钟的限制


谢谢。

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

对于在Tomcat上运行的一些任务,我没有告诉过您,如何使它运行得更快,使用更少的内存,并且不会崩溃

在一般情况下,您需要分析您的代码,以找出它花费如此长时间和使用如此多内存的原因。然后,您需要根据需要修改或重写它,以降低内存利用率并提高其效率

如果没有更多细节,我认为我们无法就如何更快地提出请求等提供明智的建议。例如,一些人提出的将请求拆分为较小的请求或异步执行较大的请求的建议不一定有用。你不应该在不了解真正的问题是什么的情况下尝试这些想法

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

请求占用的内存太多可能会导致请求占用的时间太长。如果JVM的堆内存不足,它将花费越来越多的时间运行GC。最终它将失败,并出现OutOfMemory错误

内存使用过多可能与请求正在执行的任务的大小有关

内存过度使用可能是由于代码或正在使用的某些第三方库中的错误内存泄漏造成的

根据上述情况,可通过以下方式解决问题:

增加Tomcat的治愈率, 修复内存泄漏,或 限制请求试图解决的问题的大小。 也有可能只是代码中有一个bug;e、 无限循环


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

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

对于在Tomcat上运行的一些任务,我没有告诉过您,如何使它运行得更快,使用更少的内存,并且不会崩溃

在一般情况下,您需要分析您的代码,以找出它花费如此长时间和使用如此多内存的原因。然后,您需要根据需要修改或重写它,以降低内存利用率并提高其效率

如果没有更多细节,我认为我们无法就如何更快地提出请求等提供明智的建议。例如,一些人提出的将请求拆分为较小的请求或异步执行较大的请求的建议不一定有用。你不应该在不了解真正的问题是什么的情况下尝试这些想法

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

请求占用的内存太多可能会导致请求占用的时间太长。如果JVM的堆内存不足,它将花费越来越多的时间运行GC。最终它将失败,并出现OutOfMemory错误

内存使用过多可能与请求正在执行的任务的大小有关

内存过度使用可能是由于代码或正在使用的某些第三方库中的错误内存泄漏造成的

根据上述情况,可通过以下方式解决问题:

增加Tomcat的治愈率, 修复内存泄漏,或 限制请求试图解决的问题的大小。 也有可能只是代码中有一个bug;e、 无限循环


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

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

我建议你实施

长时间运行的任务作为批处理在后台作为 @kamran ghiasvand建议。 启动批处理并返回唯一ID的提交请求 报告任务自动刷新状态的状态请求 就像你在网页上做的那样 AJAX 为了让您了解后端可能需要什么,我在下面引用我们的PaymentService界面

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);
}
关于性能:
试着找到内存消耗者,试着将问题按顺序处理,将其分为几个步骤。通过保持引用未使用的对象,确保没有造成内存泄漏。最后的手段是独立任务的并发或类似任务的并行处理。但这些问题中的大多数都是由于过于直截了当的体系结构方法造成的。

尝试另一种体系结构方法 接近。 REST被设计成无状态的,所以您必须引入状态

我建议你实施

长时间运行的任务作为批处理在后台作为 @kamran ghiasvand建议。 启动批处理并返回唯一ID的提交请求 报告任务自动刷新状态的状态请求 就像你在网页上做的那样 AJAX 为了让您了解后端可能需要什么,我在下面引用我们的PaymentService界面

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);
}
关于性能:
试着找到内存消耗者,试着将问题按顺序处理,将其分为几个步骤。通过保持引用未使用的对象,确保没有造成内存泄漏。最后的手段是独立任务的并发或类似任务的并行处理。但是,这些问题中的大多数都是由于过于直接的体系结构方法造成的。

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

CATALINA_OPTS="-Xmx2048m"
就请求超时而言,这里也有很多原因。例如,http连接器的connectionTimeout请参阅server.xml、网络或浏览器或web客户端限制以及许多其他原因。
一般来说,通过restful请求同步发出如此长的请求是非常糟糕的做法。我建议您考虑另一个解决方案,如WebSoCube或Pube通知,用于通知用户在服务器端完成了耗时的请求。

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

CATALINA_OPTS="-Xmx2048m"
就请求超时而言,这里也有很多原因。例如,http连接器的connectionTimeout请参阅server.xml、网络或浏览器或web客户端限制以及许多其他原因。
一般来说,通过restful请求同步发出如此长的请求是非常糟糕的做法。我建议您考虑另一个解决方案,如WebSoCube或Pube通知,用于通知用户在服务器端完成了耗时的请求。

启动更多的服务器实例,并在它们之间加载请求平衡。把问题分解成小块。祝你好运!你能简单介绍一下这项服务的设计吗。通常,这种高资源密集型处理需要在tomcat之外完成。如果你能概述一下设计,那会有帮助的。有可能改变RESTAPI的设计吗?考虑使用两个api。第一个线程收到一个请求并立即向用户返回一个Id,例如UUID,并创建一个线程来完成繁重的工作。第二个api接收Id并返回工作线程的状态根据您的注释,您可能需要检查以下情况,-首先,您需要检查应用程序设计,因为您无法在tomcat服务器内执行更多资源密集型任务。你必须把它带到应用程序设计之外可能存在需要更多内存来处理请求的实例。您的应用程序可能因java而崩溃。lang.OutOfMemoryError:超出GC开销限制。您可以增加tomcat内存并检查该请求-例如,export CATALINA_OPTS=$CATALINA_OPTS-Xms256m-Xmx8192m-XX:+useConmarksweepgc启动更多服务器实例,并对其中的请求进行负载平衡。把问题分解成小块。祝你好运!你能简单介绍一下这项服务的设计吗。通常,这种高资源密集型处理需要在tomcat之外完成。如果你能概述一下设计,那会有帮助的。有可能改变RESTAPI的设计吗?考虑使用两个api。第一个线程收到一个请求并立即向用户返回一个Id,例如UUID,并创建一个线程来完成繁重的工作。第二个api接收Id并返回工作线程的状态根据您的注释,您可能需要检查以下情况,-首先,您需要检查应用程序设计,因为您无法在tomcat服务器内执行更多资源密集型任务。你必须把它带到应用程序设计之外可能存在需要更多内存来处理请求的实例。您的应用程序可能因java而崩溃。lang.OutOfMemoryError:超出GC开销限制。您可以增加tomcat内存并检查该请求-例如。 export CATALINA_OPTS=$CATALINA_OPTS-Xms256m-Xmx8192m-XX:+useConmarksweepgc