JNA 何时创建 FromNativeContext? (成吨的垃圾)
When does JNA create FromNativeContext? (Tons of garbage)
JNA 何时创建 FromNativeContext 以及如何防止创建这些对象?我用我的应用程序在几秒钟内创造了数百万美元。我正在使用这个直接映射 class:
public final class Kernel32Direct {
public static native boolean WriteProcessMemory(Pointer process, long address, Memory memory, int size, int written);
public static native boolean ReadProcessMemory(Pointer process, long address, Memory memory, int size, int written);
public static native Pointer OpenProcess(int desired, boolean inherit, int pid);
public static native WinNT.HANDLE CreateToolhelp32Snapshot(WinDef.DWORD var1, WinDef.DWORD var2);
public static native boolean Process32Next(WinNT.HANDLE var1, Tlhelp32.PROCESSENTRY32 var2);
public static native boolean CloseHandle(WinNT.HANDLE var1);
static {
Native.register(NativeLibrary.getInstance("Kernel32", W32APIOptions.UNICODE_OPTIONS));
}
}
当 JNA 必须将原始值转换为 Java 对象时,会创建一个 FromNativeContext
对象。
避免使用非原始类型。当您使用派生自 NativeMapped
的类型(即 HANDLE
,即 PointerType
和 DWORD
,即 IntegerType
)时,您会招致从 Java 对象转换为原始整数或指针的额外开销。
使用 int
而不是 DWORD
,并使用 Pointer
而不是 HANDLE
。
您可能还会对 boolean
参数(在 W32APIOptions.DEFAULT_OPTIONS
中定义)进行一些类型转换。只需使用 int
代替布尔值输入,或者省略类型映射器(JNA 应该能够将 "int" return 值转换为 Java 布尔值而无需显式类型映射器)。
您还应该使用 Pointer
作为参数类型而不是 Memory
,但这主要与样式有关。
JNA 何时创建 FromNativeContext 以及如何防止创建这些对象?我用我的应用程序在几秒钟内创造了数百万美元。我正在使用这个直接映射 class:
public final class Kernel32Direct {
public static native boolean WriteProcessMemory(Pointer process, long address, Memory memory, int size, int written);
public static native boolean ReadProcessMemory(Pointer process, long address, Memory memory, int size, int written);
public static native Pointer OpenProcess(int desired, boolean inherit, int pid);
public static native WinNT.HANDLE CreateToolhelp32Snapshot(WinDef.DWORD var1, WinDef.DWORD var2);
public static native boolean Process32Next(WinNT.HANDLE var1, Tlhelp32.PROCESSENTRY32 var2);
public static native boolean CloseHandle(WinNT.HANDLE var1);
static {
Native.register(NativeLibrary.getInstance("Kernel32", W32APIOptions.UNICODE_OPTIONS));
}
}
当 JNA 必须将原始值转换为 Java 对象时,会创建一个 FromNativeContext
对象。
避免使用非原始类型。当您使用派生自 NativeMapped
的类型(即 HANDLE
,即 PointerType
和 DWORD
,即 IntegerType
)时,您会招致从 Java 对象转换为原始整数或指针的额外开销。
使用 int
而不是 DWORD
,并使用 Pointer
而不是 HANDLE
。
您可能还会对 boolean
参数(在 W32APIOptions.DEFAULT_OPTIONS
中定义)进行一些类型转换。只需使用 int
代替布尔值输入,或者省略类型映射器(JNA 应该能够将 "int" return 值转换为 Java 布尔值而无需显式类型映射器)。
您还应该使用 Pointer
作为参数类型而不是 Memory
,但这主要与样式有关。