The problem is that when we use SQL native client to work with JVM, The JNI method fails to be used to create the JVM. The error is vague and the memory error occurs. The problem is solved by a foreigner! The original SQL native client will occupy the memory occupied by the original JVM, And the JVM will not be able to occupy the memory. The solution is also simple:
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 callthis right before it creates a JVM.
Void unreserveaddressspaceforjvm (){
If (lpreserved! = NULL ){
Virtualfree (lpreserved, 0, mem_release );
}
}
You just need to execute reserveaddressspaceforjvm when the program is started. unreserveaddressspaceforjvm is called when you think you need not reserve space