【发布时间】:2020-04-03 09:03:26
【问题描述】:
当应用程序使用几分钟后,它会慢慢增加 Used 内存值并减少 Free 内存值。几分钟后应用程序变得非常缓慢。为什么不释放内存。
系统配置:
- CPU:Intel(R) Xeon(R) Platinum 8175M CPU @ 2.50GHz(处理器数量:4 / CPU 内核数量:8)
- 内存:30 GB
- 操作系统:CentOS-7
应用配置:
- java 版本 "1.8.0_171" -- build 1.8.0_171-b11
- apache-tomcat-7.0.55
Tomcat 设置
免费 -h 命令
顶部命令
。 .
Used 内存值显示占用 12 GB,Free 内存值显示 600 MB 可用。我执行了多个并发用户搜索并运行 jcmd 命令生成 heapdump.hprof 以分析内存使用情况,并观察到 heapdump 文件大小不超过 600 MB。
已用内存为 12 GB,堆转储为 600 MB - 我不知道为什么内存没有释放或释放。
任何人都可以就如何设置/配置以提高特定硬件配置的内存使用率提出任何建议。
【问题讨论】:
-
为什么会释放内存?与其担心操作系统内存分配,不如检查应用程序变慢的原因。
-
当应用程序启动时 - 使用的内存值为 5 到 6 GB,然后每次搜索后,大约 600 到 800 MB 被添加到“已用”内存值中,并且慢慢地,内存消耗增加。一段时间后,总内存使用量达到 12 GB。 GC 应该释放内存,但它没有发生。由于没有足够的内存可用,系统变慢。
-
根据
top或free,您无法可靠地知道 GC 在做什么,所以您是在假设。您需要分析您的应用程序以查看实际内存使用情况以及导致速度变慢的原因。 -
您是否使用任何集合来存储大量数据?如果是,当该集合不再使用包含大数据的集合时,您是否取消引用它?
-
从 Java 8 开始没有 PermSpace。所以你不必设置 MaxPermSize。您可以尝试为您的应用程序设置 Xms 和 Xmx 吗?分析 GC 日志可能会让您了解应用程序的内存占用情况。
标签: java memory memory-leaks out-of-memory tomcat7