【发布时间】:2020-12-31 09:34:28
【问题描述】:
我们有一个 java8 Web 应用程序在 tomcat8.5.47 服务器上运行。我们每次只有 20-60 个用户会话,但大多数时候在服务器上上传文件高达 600mb。我们还使用休眠和 c3p0 来管理数据库连接。 我们监控服务器几天,发现有时java预留内存突然增加,垃圾收集器没有释放它。我们该如何管理?有没有办法释放预留内存并防止tomcat增加内存?还有什么方法可以减少任务管理器中使用的内存?
这些是我们的设置:
-XX:MaxPermSize=1g -XX:+UseG1GC -XX:+UseStringDeduplication -XX:MaxHeapFreeRatio=15 -XX:MinHeapFreeRatio=5 -XX:-UseGCOverheadLimit -Xmn1g -XX:+UseCompressedOops -Xms10g -Xmx56g
附:我们使用 jprofiler 进行分析,绿色表示保留的 ram,蓝色表示已使用的 ram。在第二个框中您可以跟踪 gc 活动,第三个用于类,第四个显示线程活动,最后一个用于 cpu 活动。
谢谢大家的回答。
【问题讨论】:
-
您确定任务管理器会报告 RAM 使用情况吗?即:常驻内存?我非常怀疑
-
我不知道。但问题是当任务管理器显示高达 56g 的内存时,cpu 使用率也会增加,我们检测到服务器速度很慢。这些数量每小时增加一次是否正常?
-
这里显然缺少了一些东西,但是如果你不希望 JVM 分配一个 56GB 的堆,你为什么告诉它它可以呢?
-
如果答案是“因为它需要 20-60 个用户的 56GB 堆”,我很想先解决这个问题!
-
正如我在 cmets 中所说,我们知道 56g 很大,也知道有问题,但我们必须这样做,因为当任务管理器上显示的 ram 数量增加时,cpu 使用率也会上升,我们在重新启动 tomcat 之前检测缓慢。所以我们必须增加堆大小以推迟这些重新启动,然后尝试解决问题。
标签: java hibernate memory-management garbage-collection tomcat8