当我试图通过名字找到一个虚假的进程时,JNA正在制造疯狂的垃圾。
以下是分配的屏幕截图(约100k.sec)
这是测试用例(使用4.3.0 SNAPSHOT of JNA)
x.getWrappedInstance().type
最后这是内存快照 https://dl.dropboxusercontent.com/u/91292881/ShareX/2016/08/JNA%204.3.0.snapshot
答案 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>