繁体   English   中英

JNA内存泄漏-如何解决?

[英]JNA Memory Leak - How to fix?

        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需要一个length参数)。 我还看到有一个Memory类型可以将Pointer子类化,但是根据instanceof ,我现在拥有的所有Pointer实际上都不是该类型的实例。

使用OpenProcess打开处理的句柄后,需要使用CloseHandle关闭处理CloseHandle 请记住,OpenProcess返回的是Handle ,而不是Pointer

Kernel32.INSTANCE.CloseHandle(process);

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM