java中的程序化内存跟踪

时间:2010-07-16 15:11:07

标签: java memory-leaks memory-management

我正在开发一个大型预先存在的系统,不能使用其他问题中提到的任何外部探查器工具。

话虽如此,是否有任何编程方式让我能够打印出仍然分配了哪些变量并使用堆空间?变量名称和类型将是理想的,但任何识别变量信息都会有所帮助。

3 个答案:

答案 0 :(得分:0)

  1. 对于每个类,添加一个静态int成员(最初为零),使其在构造函​​数中递增并在析构函数中递减。这为您提供了每个类的对象计数。 (如果系统是多线程的,您可能需要同步计数器inc / dec)
  2. 打印出所有类的对象计数,并定期打印Runtime.getRuntime().totalMemory()

答案 1 :(得分:0)

你试过VisualVM吗?它非常具有侵入性,应该可以让你对内存使用情况有所了解。

最糟糕的情况是,你总是可以杀死项目并在核心转储上乱码(假设你在支持核心转储的操作系统上运行)。

答案 2 :(得分:0)

小心将任何代码放在 finalize 中,因为finalize中的任何put代码都可能会增加Object的生命周期;实际上,在极端情况下,它可能导致Object永远不会被GCed。