我注意到我在Tomcat 5上运行的应用程序以1gig的内存开始,一旦它开始接收来自客户端的请求,内存就会开始下降,直到它降到100MB并从那里开始出现故障。我在JVM部分查看tomcat的/ manager / status页面,其中列出了“Free Memory”,“Total Memory”,“Max Memory”。
这是内存泄漏的指标吗?即使没有来自客户端计算机的请求,内存似乎也不会自动释放。
答案 0 :(得分:1)
首先你应该analyze your garbage collection activity并了解GC行为(锯齿模式)。这是一个explanation of GC statements。
如果您遇到不受欢迎的长GC暂停,请尝试GC tuning。
如果您遇到OutOfMemory错误,则应继续detect memory leak。
答案 1 :(得分:0)
启用JMX on your tomcat并使用某个分析器监控它。像Jconsole或visualvm。如果趋势表明堆使用量随时间快速增加,则可能存在内存泄漏。检查已加载的类,您可能能够找出导致此问题的原因。
另外,你的问题还不够明确。 “记忆掉落”究竟是什么意思?你的意思是免费记忆减少了吗?
答案 2 :(得分:0)
你在静态块中做了什么而没有使用这些对象? 如果您只是启动服务器使其运行一段时间然后启动浏览器会发生什么?如果有未使用的对象,并且GC已运行,则可用的内存应该增加。可能无法解决您的问题,但您可以缩小范围。
答案 3 :(得分:0)
您最好打开GC记录,然后针对这些日志运行HP Jmeter等工具,而不是检查您的编码以寻找标准泄漏模式。
您可以在此处找到有关如何使用JMeter的说明:http://www.javaperformancetuning.com/tools/hpjmeter/index.shtml#howto
分析GC日志时要查找的一个常见模式是生活在多代中的对象。在一个普通的(非泄漏的)java程序中,你会发现对象是短暂的或长寿的,这意味着它们很快被创建和销毁,或者它们在应用程序的持续时间内存在。如果一个物体是短暂的,它只会存在一小段稳定的世代。如果一个对象是长寿的,它的年龄将随着程序的运行而增加。但它只属于有限的几代人。如果您发现一个对象具有不同年龄和增加生成数的多个实例,则可能是该对象被泄露。有关更好的解释,请查看此演示文稿:http://www.hjug.org/present/Sporar-MemoryLeaks.pdf
一旦确定了泄漏对象,下一步就是分析堆以查看谁对泄漏对象持有引用。从那里,问题应该非常容易识别