繁体   English   中英

如何获取运行 Spring Boot (Spring Web MVC) API(运行时)的 JVM 堆大小?

[英]How to get JVM Heap Size of Running Spring Boot (Spring Web MVC) API (runtime)?

我在 Docker 容器内运行的 AWS 弹性容器服务 (ECS) 上托管了一个 Spring Boot API。 我正在使用一个m5.xlarge实例,它在集群的16GB on physical RAM上有4 vCPUs16GB on physical RAM 我目前正在微调 CPU 和内存,但发现它非常随机和乏味,尽管遵循了这篇文章: https : //medium.com/@vlad.fedosov/how-to-calculate-resources-reservation-for-ecs-任务-3c68a1e12725

我仍然对设置 JVM 堆大小的内容有些困惑。 从我读到的内容来看,Java 10+ 允许自动检测容器,并将 JVM 设置为容器 RAM 的 25%(或者这是集群的实际物理 RAM??),但是,我使用的是 Java8

我正在通过 VM 参数记录垃圾收集日志:

-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -Xloggc:${LOG_DIR}/gc.log -

我的问题是——

  1. 获取我的应用程序在运行时使用的 JVM 堆大小的最简单方法是什么? 是否有命令、工具等...?
  2. 我正在运行 Java8,我相信它不会检测到容器,并且会根据物理服务器 RAM 设置 JVM - 我在 AWS 上使用了一个 m5.xlarge 实例,有 4 个 vCPU 和 16GB RAM,所以如果我没有指定-Xms-Xmx JVM 堆大小应该是 16GB * 0.25 = 4GB 正确吗??
  3. 如果我在 AWS ECS 上的容器内存/任务当前是 120%,我怎么知道这是 JVM 堆还是容器内存有问题/太低,或者甚至我的应用程序代码效率低下? 这是一个 API,它每分钟查询数据库数千次,因此许多对象在内存中残留而没有被垃圾收集? 我不确定,但希望得到任何帮助
  1. 和 3. 您将在 ${LOG_DIR}/gc.log 中指定的日志文件中获得数据 提示:使用 gc_%t.log 获取所有 gc 日志(不仅是最后一个)并将它们写入持久化存储。 您可以在 gceasy.io 等处可视化数据 - 您将看到整个堆 - 集合、时间等。

但请记住,您的应用程序不仅是堆的,它也是堆外的——而且跟踪堆外并不是那么容易(例如,本机内存跟踪正在消耗额外的资源等)——最简单的方法是抓取线程转储(最快的方法,但不是PROD env 上的推荐是使用 JDK 构建您的应用程序,在应用程序终端中运行 jstack 命令并将其重定向到持久存储上的文件)。 然后你也可以在https://fastthread.io/可视化它

  1. 这取决于哪个更新,例如博客特别注意 vm 标志 XX:***RAMPercentage

开始调查您的应用程序 - gc.​​log 如果您没有发现任何可疑内容,那么您需要检查您的容器利用率。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM