java - JNA 内存泄漏 - 如何修复?

标签 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,我现在拥有的指针实际上都不是那个。

最佳答案

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

Kernel32.INSTANCE.CloseHandle(process);

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

关于java - JNA 内存泄漏 - 如何修复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47493437/

相关文章:

java - 将图像解压缩到 blobstore

c - 结构的内存大小不同?

objective-c - 使用@autoreleasepool 减少峰值内存使用

iphone - 应用程序是否有可能并且有必要实现零内存泄漏?

iphone - 两个 Objective-C 内存管理问题 : Is Leak Detection Always Right? 和为什么 autorelease 工作但不释放?

java - java和kotlin参数有效可见性冲突

java - 在 JSP 页面内调试?

C++ - 释放在 main 中分配但在单独的类中指向的内存

android - android函数内部泄漏 'setTextColor'

java - sdkman 如何以非交互式方式安装最新的 Java 版本?