问题是当我们用SQL Native Client与JVM一起工作时,用JNI方法创建JVM始终失败,错误很模糊,说是内存错误,经一老外出手,问题解决!原来SQL Native Client会占用原本属于JVM占用的内存,导致JVM无法占用内存.解决方法也很简单:
static LPVOID lpReserved = NULL;
// Reserves a contiguous block of virtual address space large enough for a JVM.
// This is used to prevent DLLs from basing in large blocks of address space needed for a JVM.
void ReserveAddressSpaceForJVM() {
if(lpReserved == NULL) {
lpReserved = VirtualAlloc(NULL, 500 * 1024 * 1024, MEM_RESERVE, PAGE_NOACCESS);
}
}
// Free the reserved address space.
// The CJDwsDataServices.Initialize() method calls this right before it creates a JVM.
void UnReserveAddressSpaceForJVM() {
if(lpReserved != NULL) {
VirtualFree(lpReserved, 0, MEM_RELEASE);
}
}
在程序刚启动时执行ReserveAddressSpaceForJVM即可.UnReserveAddressSpaceForJVM是当你觉得需要不保留空间时调用的