【问题标题】:Is there a way to trap object allocation in Java inside your code through a method callback?有没有办法通过方法回调在代码中捕获 Java 中的对象分配?
【发布时间】:2014-08-08 09:39:00
【问题描述】:

我希望我的应用程序分析自身并告诉我内存分配发生在哪里。 Profilers 能够做到这一点,所以我的应用程序也应该能够做到这一点。探查器如何捕获对象实例化,我该如何自己做?

【问题讨论】:

    标签: java optimization memory-management profiling profiler


    【解决方案1】:

    您可以通过使用 -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 工作。

    【讨论】:

    • 您能解释一下幕后的实际情况吗?我的信念是您的(专有)库正在进行代码注入。对吗?
    • JVM 支持的东西。 Oracle JVM 支持通过-javaagent 命令行选项进行代码注入。这是我用的教程javamex.com/tutorials/memory/instrumentation.shtml
    • 我在哪里可以阅读更多关于您在上面描述的MemorySampler 的信息?
    • @rdalmeida 能否提供下载链接MemorySampler
    【解决方案2】:

    分析器如何捕获对象实例化,我该如何自己做?

    分析器通常通过与监视 JVM 内部发生的情况的调试代理交互来做到这一点。

    但是,应用程序无法与自己的 JVM 的调试代理进行交互。它不受支持,如果您尝试(以某种方式)这样做,您的 JVM 可能会被锁定。

    如果您将分析代码注入到所有需要分析其内存使用情况的类的字节码文件中,您也许可以让应用程序对其自身进行分析。例如,将每个“new”或“newarray”指令替换为对创建对象/数组并进行分析的方法(适当类型的)的调用。但这是相当棘手的事情......

    【讨论】:

      猜你喜欢
      • 2011-03-16
      • 1970-01-01
      • 2020-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-07
      • 1970-01-01
      • 2022-01-07
      相关资源
      最近更新 更多