如何在代码中配置JVM内存?

时间:2011-03-18 07:09:12

标签: java servlets jvm memory-profiling

我正在编写一个无法在Eclipse中测试的servlet,我需要在服务器上运行。我想做内存分析并找出任何泄漏。所以,我想我需要编写调试语句来告诉我当前的内存使用情况。有人能指出我如何做这个和/或JDK中哪些类做这个的好参考?

请注意,我不能使用“Eclipse MAT”。

5 个答案:

答案 0 :(得分:5)

你不能使用jdk jvisualvm中的内置工具吗?

答案 1 :(得分:1)

JConsole拯救你!

答案 2 :(得分:1)

  

所以,我认为我需要编写可以告诉我当前内存使用情况的调试语句。

这很可能对你没什么帮助,因为垃圾收集器只是通过查看计数来查找内存泄漏有点困难(你不知道gc何时运行以及它实际收集的内容,有时它不会收集所有可收集的东西。因此,您可能需要制作一些内存快照并对其进行分析,即查看未收集哪些对象(或哪些类型的对象),从而创建越来越多的实例。

为此,请查看建议的工具(JVisualVM,JConsole)。

如果您仍想从程序中获取内存使用信息,请尝试使用java.lang.management包中的类;

答案 3 :(得分:1)

分析应用程序内存并查找泄漏将是一项艰巨的任务,更不用说使用简单的调试语句会产生误导。如果您无法使用远程连接到您的流程的工具,使用hprof将是IMO的一个不错的选择。另外,请查看故障排除文档here

但我仍然认为如果可能的话,如果你尝试在本地做同样的事情(即修复泄漏)会更好。

答案 4 :(得分:1)

  

所以,我认为我需要编写可以告诉我当前的调试语句   内存使用情况。

我认为你喜欢我喜欢在代码中分析,而不是使用像JVisualVM或JConsole这样的外部分析工具。

您可以使用来自MemorySampler的名为CoralBits(由我编写)的工具,该工具将准确地告诉您在您的代码内存的哪一行分配。下面是一个例子:

ConcurrentLinkedQueue<String> queue = new ConcurrentLinkedQueue<String>();
MemorySampler.start();
for(int i = 0; i < strings.length; i++) queue.offer(strings[i]);
for(int i = 0; i < strings.length; i++) queue.poll();
MemorySampler.end();
if (MemorySampler.wasMemoryAllocated()) MemorySampler.printSituation();

提供以下输出:

Memory allocated on last pass: 24576
Memory allocated total: 24576

Stack Trace:
    java.util.concurrent.ConcurrentLinkedQueue.offer(ConcurrentLinkedQueue.java:327)
    TestGC.main(TestGC2.java:25)

现在,如果你转到ConcurrentLinkedQueue源代码的第327行,你会发现它在那里分配了一个Node实例。

免责声明:我是CoralBits的开发者之一。