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工作
# 2 楼答案
How do profilers trap object instantiation and how can I do it myself?
# 1 楼答案
您可以通过使用
-javaagent
将插装代码传递到JVM中来实现这一点。实际上,我们使用this technique在应用程序中查找实例泄漏。下面是一个例子:产出:
您可以看到对象分配发生在
ConcurrentLinkedQueue
的第327行免责声明:我为开发上述
MemorySampler
类的Coral Blocks工作# 2 楼答案
探查器通常通过与监视JVM内部情况的调试代理交互来实现这一点
但是,应用程序无法与自己JVM的调试代理交互。它不受支持,如果您试图(以某种方式)这样做,您的JVM可能会被锁定
如果您将分析代码注入需要分析其内存使用情况的所有类的字节码文件中,您可能能够让应用程序对其本身进行分析。例如,将每个“new”或“newarray”指令替换为对方法(适当类型)的调用,该方法创建对象/数组并执行分析工作。但这是相当棘手的事情