【发布时间】:2014-12-23 07:00:25
【问题描述】:
这是一个模糊的问题。因此,请随时询问任何具体数据。
我们有一个运行两个 web 服务的 tomcat 服务器。使用 spring 构建的一个 tomcat。我们使用 mysql 来处理 90% 的任务,使用 mongo 来缓存 jsons (10%)。另一个 Web 服务是使用 grails 编写的。这两个服务都是中型代码库(每个大约 35k 行代码)
只有在有 HTTP 请求时才会进行计算(无批处理)。每个请求大约有 2000 个数据库命中(我知道它的巨大。我们正在努力)。请求速率约为 30 req/min。对于一个特定的请求,有一个非常昂贵的图像处理。任何地方都没有 JNI
我们发现了一个奇怪的行为。昨晚,我可以确认大约 12 个小时没有对服务器的请求。但是当我查看内存消耗时,它非常混乱:
在没有任何请求的情况下,内存不断地从 500Mb 跳到 1.2Gb(700Mb 的跳动令人担忧)。如前所述,服务器端没有计算。我不确定它是否是内存泄漏:
- 内存使用量下降。 (如果内存没有下降,事情会容易得多)。
- 这种行为可以通过基于 SoftReference 左右的缓存重现。带有完整的gc。但我没有在任何地方使用它们(不确定是否有其他东西在使用它)
还有什么原因。有什么担心的吗?
PS:最近我们经常发生内存崩溃(不是错误,而是 JVM 崩溃)。
【问题讨论】:
-
连接池泄漏?
-
你使用ThreadLocal变量吗?
-
@shazin ThreadLocal 没有。
-
@ochi 可以。但是能造成这么大的消耗吗
-
确保您使用的任何第三方库也没有 ThreadLocal,因为带有线程池的 ThreadLocal 可能会导致像这样不必要的内存保留。