C ++程序JNI环境中的内存泄漏

时间:2012-03-15 06:26:22

标签: c++

我有c ++程序,它反过来调用JAVA函数(调用一些API来获取结果)。 java调用的API为服务器请求创建大量内存(每1000000个请求1 GB内存)。

我们可以从c / c ++程序中释放内存吗?或指示JVM释放内存?如果你可以提供帮助,那将是很有帮助的。

提前致谢...

由于 Sambasiva。

2 个答案:

答案 0 :(得分:0)

制作显式方法,释放C ++程序中的所有资源

并尝试使用java类中的代码。

/******************************************************************************/
/*  File        : NativeCodeHandle.java                                       */
/*  Description : Blog-posting or Educational purpose                         */
/*  Written     : 2010.07.11                                                  */
/*  Version     : -_+                                                         */
/*  Author      : a.k.a LaZy Developer                                        */
/*  Contacts    : chriskr7@gmail.com                                          */
/******************************************************************************/

class someNativeClass{
  public native void allocateSomeMemory();
  public native void freeSomeMemory();
  static
  {
    System.loadLibrary("someSoDLLFile");
  }
}

public class NativeCodeHandle {

  boolean isCleaned = false;

  someNativeClass nativeObject = new someNativeClass();

  public synchronized void allocate(){
    nativeObject.allocateSomeMemory();
  }

  public synchronized void cleanup(){
    if(isCleaned) return;
    // free native code - maybe JNI free() wrapper method    
    nativeObject.freeSomeMemory();
    // maybe close DB connection
  }

  public void finalize(){
    cleanup();
    try {
      super.finalize();
    } catch (Throwable e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }    
  }
 /**
   * @param args
   */
  public static void main(String[] args) {
    // TODO Auto-generated method stub
    NativeCodeHandle test = new NativeCodeHandle();
    test.allocate();
    // Explicit clean up!!! :P
    test.cleanup();
  }

}

答案 1 :(得分:0)

除非您可以修改第三方java类,否则无法做任何事情。

如果多次调用第三方java类,也存在很多风险

如果您强制从c ++中释放资源。