2012-03-15 11 views
2

私はC++プログラムを呼び出して、JAVA関数(結果を得るためにいくつかのAPIを呼び出します)を呼び出します。 Javaが呼び出しているAPIで、大量のメモリーをサーバー要求に作成しています(1000000要求ごとに1GBのメモリー)。C++プログラムのメモリリークJNI環境

c/C++プログラムからメモリを解放できますか?またはJVMにメモリを解放するよう指示しますか?あなたがこれを手助けできるなら、大きな助けになるでしょう。事前に

おかげで...

おかげ Sambasiva。

+0

JNIを使​​って作業しているときのメモリリークのほとんどは、C++/JNI境界にあると聞いています。すべてのメモリがどのように所有され、管理されているかをよく理解していることを確認してください。 – wilx

+0

興味深い質問。たぶんあなたは無料でJavaコードで関数を書くことができ、C++から呼び出すことができます。あなたはこれを試しましたか? – jlledom

+0

私たちはサードパーティのJARファイルを使用して機能を実現しています。 jarは割り当てられたメモリを解放するオプションを提供していません。 – user1270846

答えて

0

はあなたのC++プログラム

にすべてのリソースを解放し、あなたのJavaクラスのコードの下にしようと明示的な方法を確認します。

/******************************************************************************/ 
/* File  : NativeCodeHandle.java          */ 
/* Description : Blog-posting or Educational purpose       */ 
/* Written  : 2010.07.11             */ 
/* Version  : -_+               */ 
/* Author  : a.k.a LaZy Developer          */ 
/* Contacts : [email protected]           */ 
/******************************************************************************/ 

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(); 
    } 

} 
+0

あなたの提案をありがとう。 – user1270846

+0

お寄せいただきありがとうございます。私はC++プログラムでJAVA関数を呼び出していますが、cとjavaプロセスで割り当てられたすべてのメンバーはクリーンアップされていますが(変数とJavaから返された戻り値)、問題はサードパーティによってメモリが消費されるメモリAPI。トレース(ダンプ)を取ると、サードパーティのライブラリ/ユーティリティは割り当てられたメモリを解放していないことがわかりました。私たちはJVMで取られたメモリを取り戻すためにjava/C++で何かできるのですか? – user1270846

0

サードパーティのJavaクラスを変更できない限り、何もできません。あなたは、C++からのリソースを解放するために強制する場合は、複数回

サードパーティのJavaクラスを呼び出す場合

はまた、多くのリスクがあります。