Java JNA 4.3.0在查找进程时创建疯狂的垃圾

时间:2016-08-27 02:59:33

标签: java garbage-collection jna garbage

当我试图通过名字找到一个虚假的进程时,JNA正在制造疯狂的垃圾。

以下是分配的屏幕截图(约100k.sec)

enter image description here

这是测试用例(使用4.3.0 SNAPSHOT of JNA)

x.getWrappedInstance().type

最后这是内存快照 https://dl.dropboxusercontent.com/u/91292881/ShareX/2016/08/JNA%204.3.0.snapshot

1 个答案:

答案 0 :(得分:1)

我强烈怀疑你的堆使用是在循环中重复创建新的String对象。

您的代码在另一个无限循环中执行进程搜索(查看每个进程),因此您可以反复执行此行...

String fileName = Native.toString(entry.szExeFile);

在内部,Native.toString(char[] buf)每次创建new String()

public static String toString(char[] buf) {
    int len = buf.length;
    for (int index = 0; index < len; index++) {
        if (buf[index] == '\0') {
            len = index;
            break;
        }
    }

    if (len == 0) {
        return "";
    } else {
        return new String(buf, 0, len);
    }
}

这些String对象用于测试相等性,然后被扔到堆上。

由于创建String的主要目的是测试相等性,因此您可以使用基础char[]数组直接测试相等性。将processName转换为char[]并在两个数组上同时迭代,在processName的下一个字符中使用空终止符测试长度为entry.szExeFile的字符相等。< / p>