I thought this question would have been asked before, but I couldn’t find it here…
I’ve used SWIG to create a JNI wrapper around a C++ class. All works great except that Java never seems to call the class’s finalize(), so, in turn, my class’s destructor never gets called. The class’s destructor does some final file I/O, so unfortunately, this isn’t just a minor memory leak.
Searching through Google, there doesn’t seem to be a way to force Java to GC and destroy an object. True?
I know I could manipulate my SWIG file and create a java function that would call the C++ destructor, but this class is used by end users in several different platforms/languages, so the addition of a Java-only will create an inconsistency that our tech writers aren’t going to like.
You can’t force GC with System.gc().
Also it is not guaranteed that there will ever be a GC run for example if your app runs only for a short time and then your finalizer won’t run at all (the JVM does not run it when exiting). You should create a close() or destroy() or whatever function for your class and when you finished using an instance of this class call it, preferably from a finally block, like.