【问题标题】:Memory allocation by javajava的内存分配
【发布时间】:2012-03-01 14:46:02
【问题描述】:

问题: 我为运行应用程序设置了 Xms512m 和 Xmx1024m,实习生使用 C++ 本机层执行其他操作,运行应用程序时出现 OutOfMemory 异常。我需要知道 C++ 使用哪个内存(即来自分配的内存 Xms512m 和 Xmx1024m 或者它使用的不是这个设置的内存)。

如何在分别运行应用程序时为 Java 和 C++ 代码获取堆空间和堆栈空间。

【问题讨论】:

    标签: java c++ memory heap-memory stack-memory


    【解决方案1】:

    本机代码分配的内存不在 Java 堆中。由 java 应用程序引起的 OutOfMemory 异常。 OOM 是一个线索,可以让您知道 java 应用程序可能使用超过 1024mb 的内存。您可以将其放大或考虑内存泄漏问题。

    有一些关于内存泄漏检测的链接:

    你可以简单地做到这一点:

    • 通过 jps 获取 java 应用 pid
    qty:~ qrtt1$ jps
    4437 start.jar
    10470 Jps
    
    • 通过 jmap 获取堆转储数据
    jmap -dump:format=b,file=my_app_heap_data.hprof 4437
    
    • 用垫子打开它,像这样:

    【讨论】:

      【解决方案2】:

      您可以使用jconsoleVisualVM 查看应用程序的堆使用情况。

      【讨论】:

        【解决方案3】:

        您可以使用以下监控应用程序:
        jconsole
        javamelody
        visualvm

        【讨论】:

          【解决方案4】:

          分配给您的 JVM 的内存与 JNI 和本机应用程序使用的内存完全不同。 VisualVM 和 Jprofiler 等工具可以帮助您确定 JVM 特定的堆使用情况。但是,如果内存泄漏来自 JNI 或本机应用程序,则应使用 -Xrunjnichk(在 IBM JDK 上可用)等选项来调试 JNI 调用。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-07-27
            • 2018-07-02
            • 1970-01-01
            • 2019-03-08
            • 2011-12-02
            • 2015-12-19
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多