有什么方法可以记录 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/