在Java Web应用程序中的内存泄漏

32 浏览
0 Comments

在Java Web应用程序中的内存泄漏

我的Java Web应用在Tomcat 7上运行,似乎存在内存泄漏问题。应用程序的平均内存使用量在负载下随时间线性增加(使用JConsole确定)。在内存使用量达到平台后,性能显著下降。响应时间从约100毫秒增加到[300毫秒,2500毫秒],因此实际上导致了实际问题。\n使用VisualVM,我发现至少一半的内存被字符数组(即char[])使用,并且大多数字符串(大约30万个实例)是以下之一:“Allocation Failure”,“Copy”,“end of minor GC”,这些似乎与垃圾收集通知有关。据我所知,应用程序根本不监视垃圾收集器。VisualVM找不到这些字符串的GC根,所以我很难追踪到这个问题。\n我无法解释为什么内存使用量会达到平台,但我有一个理论,为什么一旦达到平台,性能会下降。如果内存碎片化,应用程序可能需要很长时间来分配连续的内存块来处理新请求。\n与内置的Tomcat服务器状态应用程序进行比较,内存增加并达到平稳状态,但没有像我的应用程序那样达到高的“底线”。它也没有高数量的不可达char[]。\n这些字符串可能在哪里分配,为什么它们不会被垃圾收集?是否有Tomcat或Java设置可能会影响此问题?是否有特定的包可能会影响此问题?

0
0 Comments

Java web应用程序中的内存泄漏问题通常是由于可用内存降低到默认百分比阈值以下,导致进行了Full GC。这就解释了为什么性能会下降,因为JVM在尝试查找和释放内存时会频繁暂停。

通常我会建议检查对象缓存,但在你的情况下,我认为你的堆大小对于一个Tomcat实例和Web应用程序来说太小了。我建议将堆大小增加到1G(-Xms1024m -Xmx1024m),然后再次检查内存使用情况。

如果你仍然看到相同的行为,那么你应该再次进行堆转储,并查看String和Char之后的最大资源消耗者。根据我的经验,通常这些是缓存机制。如果可能的话,要么增加内存,要么减少缓存存储。有些缓存只定义对象数量,所以你需要了解每个缓存对象的大小。

一旦你了解了内存使用情况,你可能可以再次降低它,但在我看来,512MB应该是一个最低值。

更新:

你不需要担心不可访问的对象,因为它们应该被GC清理掉。此外,最常见的消耗者按类型分别是String和Char - 大多数对象都会包含某种类型的String,所以最常见的是String和Char。理解包含String的对象的保持方式是找到内存消耗者的关键。

0
0 Comments

内存泄漏是Java Web应用程序中常见的问题之一。它会导致应用程序占用过多的内存并最终导致应用程序崩溃或响应时间延迟。本文将从以下内容中整理出内存泄漏问题的原因和解决方法。

首先,我们可以使用MemoryAnalyzer来分析堆内存,该工具提供了更多的信息。可以在http://www.eclipse.org/mat/下载到这个工具,它有独立应用程序和Eclipse插件两种版本。只需运行jmap命令并使用MemoryAnalyzer分析结果即可。

Memory Analyzer确认了VisualVM所指示的问题:不可达的char[]和String对象占用了210MB堆内存中的176MB。然而,这并没有解释字符串是从哪里来的,也没有解释为什么它们没有被垃圾回收。

为了解决这个问题,建议检查可达对象而不是不可达对象,因为问题可能出在这里。

0
0 Comments

内存泄漏是Java Web应用程序中常见的问题之一。它会导致应用程序的内存使用量不断增加,最终导致应用程序崩溃或变慢。本文将讨论一个Java Web应用程序中出现内存泄漏的原因以及解决方法。

在上述内容中,作者提到从tomcat\bin\setenv.bat中删除了JMX配置。这些配置用于启用Java管理扩展(Java Management Extensions,JMX),以便在运行时监视和管理应用程序。尽管删除了这些配置后,无法获取详细的内存堆转储,但内存使用情况有所改善。

然而,24小时后,内存使用情况仍然相同,这表明可能存在内存泄漏问题。内存泄漏是指应用程序中的对象在不再使用时没有被正确释放,导致内存无法回收。这可能是由于以下原因之一导致的:

1. 对象的生命周期管理不当:如果应用程序中的对象没有正确地被销毁或释放,它们将继续占用内存空间。

2. 长期存活的对象持有对其他对象的引用:如果一个对象持有对其他对象的引用,并且这些被引用的对象不再需要时没有被正确释放,那么这些对象将继续存在于内存中。

为了解决内存泄漏问题,可以采取以下措施:

1. 检查代码中的对象创建和销毁:确保每个对象都在不再使用时被正确销毁或释放。

2. 避免长期存活的对象持有引用:如果一个对象不再需要,应该将其引用设置为null,以便垃圾回收器可以回收它。

3. 使用内存分析工具:使用工具如Eclipse Memory Analyzer等来分析内存使用情况,并找出可能的泄漏点。

4. 进行代码审查:定期进行代码审查,以找出可能导致内存泄漏的潜在问题。

总之,Java Web应用程序中的内存泄漏是一个常见的问题,可能会导致应用程序的性能下降或崩溃。通过正确管理对象的生命周期和避免长期存活对象持有引用,可以减少内存泄漏的发生。同时,使用内存分析工具和进行代码审查也是解决内存泄漏问题的有效方法。

0