JNA内存泄漏 - 如何修复?

时间:2017-11-26 05:44:34

标签: java memory-management memory-leaks java-native-interface jna

        public static User32 USER32_INSTANCE = (User32) Native.loadLibrary("user32", User32.class);

        user32 = USER32_INSTANCE;

        user32.EnumWindows((hWnd, arg) -> {
          int size = 1024 * 8;
          char[] buffer = new char[size];
          USER32_INSTANCE.GetWindowTextW(hWnd, buffer, size);

          char[] buffer2 = new char[size];
          PointerByReference pointer = new PointerByReference();
          User32DLL.GetWindowThreadProcessId(hWnd, pointer);
          Pointer process = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, false, pointer.getValue());
          Psapi.GetModuleBaseNameW(process, null, buffer2, size);

          String result = Native.toString(buffer).trim();
          String proc = Native.toString(buffer2).trim();

          // ... (non-JNA stuff)
        }

我从未接触过C / C ++,因为大学时我真的不知道如何在这里实际释放内存:(

我知道存在内存泄漏 - 我使用YourKit进行了一些分析并追踪到这个代码块的内存泄漏(具体来说,它似乎在GetWindowTextW调用和Native.toString()调用中泄漏)。有人可以给我一个如何正确释放正在使用的内存块的例子吗?

我看到Pointer有一个clear()方法,我应该使用它吗?但我不知道如何获得大小(clear需要一个长度参数)。我还看到Memory类型是Pointer的子类,但根据instanceof,我现在没有指针实际上就是这种情况的实例。

1 个答案:

答案 0 :(得分:2)

使用OpenProcess打开流程句柄后,您需要使用CloseHandle关闭流程句柄。请记住,OpenProcess返回Handle,而不是Pointer

Kernel32.INSTANCE.CloseHandle(process);

另请注意,JNA在net.java.dev.jna-platform软件包中提供了非常深入的Windows API映射(我认为?)