我正在使用AWS EC2(ECS)运行托管在docker容器内的tomcat服务器上的java应用程序。最近,Java应用程序服务在一段时间后重新启动。检查ECS代理日志后,它显示OutOfMemoryError。
密码:
Level: INFO
Message: DockerGoClient: Process within container 02118442aba47dbe536651b90ca1cd64c43ec419ea949dbe8ca3797f0df1dd71 (name: "my-java-app10-f8e5abadedfbd0c9d901") died due to OOM
Module: docker_client.go
Level: INFO
Message: Handling container change event
Task: 3825f1c6-0d3d-4771-bed7-15332dab4ad9
Container: service-layer
RuntimeID: 02118442aba47dbe536651b90ca1cd64c43ec419ea949dbe8ca3797f0df1dd71
Status: STOPPED
Level: WARN
Message: Error stopping the container; marking it as stopped anyway
Task: 3825f1c6-0d3d-4771-bed7-15332dab4ad9
Container: service-layer
RuntimeID: 02118442aba47dbe536651b90ca1cd64c43ec419ea949dbe8ca3797f0df1dd71
ErrorName: OutOfMemoryError
Error: Container killed due to memory usage
我不知道哪个Java线程/进程正在消耗内存。我试着在下面:
docker inspect <containerName>
docker ps --all (This shows Exited 137))
检查了应用程序日志,以及在那里我看不到任何特定的调用。
有没有人给予提示,我应该如何检查哪个java线程/进程正在不断运行并消耗内存。请注意,最大内存限制是1GB,它在此之前工作得很好。
1条答案
按热度按时间z9zf31ra1#
这是一个Java调试问题。我帮不上忙,但我可以帮助崩溃和重新启动任务。
与此同时,您可以调整ECS任务的Task Definition,使其具有更大的CPU/内存任务大小,以便在您找出服务消耗更多内存的原因时保持稳定。
您可以考虑使用Fargate作为容量提供者,而不是在EC2上启动,这样您就不会与任务定义中的任务大小和与集群关联的EC2示例的大小发生冲突。你应该知道这是有成本影响的(如果你试图将它保留在EC2免费层)。