最近项目测试中发现用一会就报java.lang.OutOfMemoryError: Java heap space,程序模块太多,排查起来比较困难,我想应该有一种工具可以很好监控虚拟机当前的状态,甚至帮我找出程序哪个地方最消耗内存,我想从根源上找到问题,不知道有没有好的工具,大家相互推荐下,在此先拜谢了!

解决方案 »

  1.   

    如果你每个模块都有测试用例,直接跑一次就知道了。
    如果没有,自己写一个拦截器,将所有模块调用之前的内存使用量和模块名用log打印。
    分析log,判断内存泄露的可能方式。
    一般来说在 “循环(包括递归)”、“I/O流”、“数据库海量数据存储”等地方比较容易出现。最后罗嗦一句,做一个项目时最好团队成员一开始就相互做代码check。对技术功底比较弱的人员分配一些风险低的功能。这种项目一开测就出现OutOfMemoryError还算好,要的碰到每跑几周才出现OutOfMemoryError异常的话测试都发现不了。
      

  2.   

    有一个东西叫 Java memory profiler 不知道好不好
    可以判断在程序中哪些方法分配了大量对象,也可以判断有没有被引用或者一开始不分配之类http://www.khelekore.org/jmp/.
      

  3.   

    jprofile 可以跟踪到内存溢出的原因