1

我正在开发一个在 Tomcat 的 1GB 内存服务器上运行的 Java Webapp。

最近我们注意到该应用程序占用了该服务器上的大部分内存 - 大约 83%。

我已经在我的个人机器上使用 VisualVM 对应用程序进行了概要分析,该机器具有更多的 RAM。

VisualVM 显示大约 400MB 已用堆空间,以及高达 1.4GB 的已分配堆空间。

设置 -Xmx512m 允许我降低分配的堆空间,而不会对站点性能产生任何重大影响。

在此处输入图像描述

几个问题:

  1. 这或多或少正常吗?为什么会这样?
  2. 有什么办法可以减少内存消耗?如果应用程序确实最终需要更多内存,则使用 -Xmx 限制占用的内存量可能会成为问题。
  3. 如果操作系统需要另一个说 100mb 用于另一个进程,java 会释放这个内存供操作系统使用,因为它没有使用堆并且只分配堆,或者操作系统会运行到内存问题吗?
4

1 回答 1

3

按顺序回答您的问题。

  1. 是的,这很正常。例如,当您以最大堆为 2 gb 启动服务器时,则为 java 进程保留 2gb。应用程序可能会或可能不会完全使用它,但即使您在操作系统级别有更多可用内存,它也不能使用超过 2 GB,因为您已将最大使用量限制为 2 GB。此外,应用程序使用更少的内存(仅 100 MB)是正常的,在这种情况下,使用的堆大小将远小于总堆大小。
  2. 使用 -Xms 限制分配的内存,使用预期负载分析您的应用程序或从较低负载开始,查看应用程序是否运行良好并分析内存使用情况。您需要通过改变配置的内存并保留所有其他参数来运行多个测试。多次运行之间的负载常数以找到最佳编号。
  3. 不,在服务器启动之前,jvm 不会将内存释放给另一个进程。一旦启动服务器,jvm 的最大内存配置将保留给 jvm 进程。
于 2020-01-31T18:15:05.870 回答