我怎么知道我有Java漏洞?

时间:2010-08-09 06:28:02

标签: java memory-leaks

我正在使用Netbeans探查器运行我的应用程序,并且char类型似乎非常活跃。我看到世代数量一直延续到180代,并且下降到80并且回升到平均160代。

很难分辨,因为它是一个使用JDBC,Hibernate和连接池的自定义TCP / IP服务器应用程序。

1-如果世代数量上下变化,可以假设它没问题吗?只有当它不断上升而且永远不会下降时才会出现潜在的问题?

2- Netbeans生成图表一直在上升。在我的压力测试结束时,它是20000代。图表是否随着时间的推移而变化?我很困惑,因为在查看实时结果时,如上所述,几代人会为char类型上下移动。

3-通过从分析器手动调用垃圾收集器,内存似乎会回落。所以我认为那也没关系?

3 个答案:

答案 0 :(得分:1)

  • 1)是的。它由于所有构造的实例而上升,而在垃圾收集器启动时下降。
  • 3)嗯,是的,你手动做1。但是,它应该没有必要。

通过查看随时间变化的最小量,可以识别内存泄漏。每次GC运行时,如果你继续运行相同的代码,它应该几乎相同。

如果你输入代码的不同部分,它可能会增长一些,因为类被加载并且可能会构造静态。

实际上,在不知道所采用的代码路径的情况下很难识别泄漏。我已经有泄漏,直到大约100000条消息被处理后才会显现,并且在运行几周之后才出现问题。

另见This SO question on identifying those leaks

答案 1 :(得分:0)

我通常接触可疑内存泄漏的方式是:

  • 让应用程序在生产环境(不是您的IDE)中运行一段时间
  • 触发应用程序编写Java heapdump
  • 使用IBM alphaworks HeapAnalyzer检查并查找可能的问题点

答案 2 :(得分:0)

GC无法清理的内存最终会进入老一代,然后是烫发空间。这也是.class文件和字符串池的位置,所以如果你发现它不是空的,不要惊慌。

你必须能够将漏洞与通常最终陷入烫发空间的东西区分开来。这不容易。