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

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

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

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

JConsole救你!

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

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

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

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

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

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

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

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

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

ConcurrentLinkedQueue queue = new ConcurrentLinkedQueue(); 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的开发者之一。