Tomcat垃圾回收未彻底

18 浏览
0 Comments

Tomcat垃圾回收未彻底

当我需要监控内存时,我真的很不适应。但是我这里只有我一个人,而我又毫无头绪:我有一个运行在Tomcat应用服务器上的Java8应用程序(CMS),目前遇到一些麻烦。过了一段时间,服务器就会崩溃。\n经过一些调查,我发现问题与内存有关,所以我在我的环境中附加了visualVM,并开始监控。\n我看到内存正在慢慢填满。垃圾回收器在工作,但不彻底。它总是在已使用堆中留下一些更多的内存。当我在visual VM中手动执行\'Perform Garbage Collection\'时,垃圾回收效果要好得多。(见屏幕截图)\n\"Garbage\n这可能需要几个小时,但在每次垃圾回收后,已使用堆的大小都会再次增大。当我再次手动执行GC时,最小的已使用堆将恢复到“正常”状态。\n我注意到堆中充满了byte[]。它们占用了大部分空间。有人可以帮我解决这个问题吗?

0
0 Comments

Tomcat垃圾回收没有彻底的原因可能有:

- 内存不足,可以通过增加JVM和底层机器的内存来缓解问题。

- 手动运行System.gc()可能会有帮助,但大多数人认为这不会解决问题。可以将其自动化。

- 如果以上方法可以防止崩溃,那么你就有更多时间来寻找真正的解决方法。

解决方法可能包括:

- 向经理汇报需要2、4、8周的时间来学习并解决问题。

- 寻求外部咨询服务来帮助解决问题。

总之,团队/产品需要一些"专家"知识,要么内部建立这种知识,要么从外部购买。

需要注意的是,禁用System.gc()是一个常见的最佳实践,但在这种情况下,他每隔几分钟就必须这样做。考虑到堆大小,这将需要几秒钟,甚至几十秒钟,情况可能会变得更糟。

需要谨慎使用显式GC,因为如果真正的GC出现问题,显式GC并不能解决问题。可以考虑使用ExplicitGCInvokesConcurrent来替代禁用显式GC。

0
0 Comments

Tomcat垃圾收集不彻底的原因可能是多方面的,下面是一些可能的原因和解决方法。

在第一个案例中,问题出在我们的应用程序上。当抛出异常时,我们没有关闭SQL连接。通过测试异常情况,我发现连续抛出大约100个异常时,服务器的内存会枯竭。在异常处理程序中添加代码来手动清理资源可以解决这个问题。

在第二个案例中,问题出在WebSphere上。我验证了我们的应用程序正确地关闭了所有资源,但问题仍然存在。于是我开始阅读WebSphere文档,发现这是与JAX-WS客户端相关的已知问题。幸运的是,WebSphere有一个修补程序可以解决这个问题。

在第三个案例中,我无法确定问题的原因。因此,通过增加JVM内存分配的大小,使OOM异常需要超过1周才会发生,并配置服务器在每个周末重新启动,来缓解问题。

解决这些问题的方法是通过使用JProfiler监视内存使用情况并运行各种正常和异常测试来找出问题的原因。这个测试过程可能需要花费大约一周的时间。对于应用程序的问题,需要检查是否正确关闭了所有资源。对于服务器的问题,需要查阅相关文档或寻找已知问题的修补程序。对于无法确定原因的问题,可以通过增加内存分配或定期重启服务器来缓解。

0
0 Comments

Tomcat垃圾回收没有彻底的原因可能有以下几点:

1. JVM触发Full GC的条件比较苛刻,它会根据一些因素如Xms和Xmx参数来判断是否需要进行Full GC。所以在没有内存溢出异常的情况下,不需要过于担心。解决方法是增加堆内存并尝试。

2. 可能存在内存泄漏的问题,即垃圾回收后内存占用仍然增加。解决方法是找出内存泄漏的原因并进行修复。

3. 可能存在没有驱逐算法的缓存构建问题,当缓存接近满时,内存占用会增加。解决方法是实现合适的缓存驱逐算法。

如果Tomcat垃圾回收没有彻底,可能是由于JVM触发Full GC的条件限制、内存泄漏或缓存构建问题所致。解决方法包括增加堆内存、修复内存泄漏问题和实现合适的缓存驱逐算法。

0