java - 从 Java 跟踪 native 内存使用情况?

标签 java memory java-native-interface swig

有什么方法可以记录 Java 的 native 内存使用情况,即直接记录 native 内存或进程使用的总内存(例如,询问操作系统)?

我想在用户的机器上在后台运行它,所以 NativeMemoryTracking 命令行工具并不是最吸引人的选择。我已经记录了空闲/最大/总堆大小。

背景:我的软件用户报告了一个异常(如下),我不知道为什么。我的程序确实使用了 SWIG 的 native 代码,但它是一个简单的 API,我认为它没有内存泄漏,并且不在堆栈跟踪中(或在错误发生前立即运行)。我的日志表明错误发生时有足够的堆空间可用。所以我真的不知道如何追踪它。

java.lang.OutOfMemoryError: null
    at java.io.RandomAccessFile.writeBytes0(Native Method) ~[na:1.7.0_45]
    at java.io.RandomAccessFile.writeBytes(Unknown Source) ~[na:1.7.0_45]
    at java.io.RandomAccessFile.write(Unknown Source) ~[na:1.7.0_45]

错误发生在 Windows(7 或 10)(?) 的 webstart 中,配置了这些参数:

<java href="http://java.sun.com/products/autodl/j2se" initial-heap-size="768m" java-vm-args="" max-heap-size="900m" version="1.7+"/>

最佳答案

如果您希望在您的特定方法或代码行上跟踪 JVM 内存,您可以使用运行时 API。

    Runtime runtime = Runtime.getRuntime();
    NumberFormat format = NumberFormat.getInstance();

    long maxMemory = runtime.maxMemory();
    long allocatedMemory = runtime.totalMemory();
    long freeMemory = runtime.freeMemory();

System.out.println("free memory: " + format.format(freeMemory / 1024));
System.out.println("allocated memory: " + format.format(allocatedMemory / 1024));
System.out.println("max memory: " + format.format(maxMemory / 1024));
System.out.println("total free memory: " + format.format((freeMemory + (maxMemory - allocatedMemory)) / 1024));

关于java - 从 Java 跟踪 native 内存使用情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39886664/

相关文章:

java - GWT 导出表

node.js - 从内存中释放大 Node 模块

java - SWIG 问题,正在生成空文件

Java JNI 引用类型,传递 ByteBuffer

c# - 生成所有递增的数字

java - 如何在 BEA weblogic 8.3 中为 Web 应用程序设置 java VM 参数

java - 如何在 Android 中使用 Xpath 比较日期

C Segmentation Fault (core dumped) 链表

javascript - 确保 JavaScript 中的构造函数之后忘记变量

Java 绿色线程通过 JNI 使用 UNIX ucontext 库。是否可以?