【发布时间】:2014-08-08 09:39:00
【问题描述】:
我希望我的应用程序分析自身并告诉我内存分配发生在哪里。 Profilers 能够做到这一点,所以我的应用程序也应该能够做到这一点。探查器如何捕获对象实例化,我该如何自己做?
【问题讨论】:
标签: java optimization memory-management profiling profiler
我希望我的应用程序分析自身并告诉我内存分配发生在哪里。 Profilers 能够做到这一点,所以我的应用程序也应该能够做到这一点。探查器如何捕获对象实例化,我该如何自己做?
【问题讨论】:
标签: java optimization memory-management profiling profiler
您可以通过使用 -javaagent 将检测代码传递到 JVM 来做到这一点。我们实际上使用this technique 来查找应用程序中的实例泄漏。下面是一个例子:
ConcurrentLinkedQueue<String> queue = new ConcurrentLinkedQueue<String>();
String s = new String("hi");
MemorySampler.start();
queue.offer(s);
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 行。
免责声明:我为开发上述MemorySampler 类的Coral Blocks 工作。
【讨论】:
-javaagent 命令行选项进行代码注入。这是我用的教程javamex.com/tutorials/memory/instrumentation.shtml
MemorySampler 的信息?
MemorySampler
分析器如何捕获对象实例化,我该如何自己做?
分析器通常通过与监视 JVM 内部发生的情况的调试代理交互来做到这一点。
但是,应用程序无法与自己的 JVM 的调试代理进行交互。它不受支持,如果您尝试(以某种方式)这样做,您的 JVM 可能会被锁定。
如果您将分析代码注入到所有需要分析其内存使用情况的类的字节码文件中,您也许可以让应用程序对其自身进行分析。例如,将每个“new”或“newarray”指令替换为对创建对象/数组并进行分析的方法(适当类型的)的调用。但这是相当棘手的事情......
【讨论】: