这是我在Ubuntu / JVM 1.7.0_75下的考试
1。 线程将每秒调用50000次以下函数:
void LoggerImp :: jniLog(){ for(int i = 0; i< 100; i ++) {}}
当然,这里没有任何问题。
2。 我在其中添加了一些jni代码:
void LoggerImp :: jniLog(){ for(int i = 0; i< 100; i ++) { jclass tcls = env-> FindClass(“com / morefun / bi / sdk / UserInfo”); }}
O.K。我没有发布本地引用,因此发生了内存泄漏。
3。 然后我将本地参考发布代码添加为:
void LoggerImp :: jniLog(){ for(int i = 0; i< 100; i ++) { jclass tcls = env-> FindClass(“com / morefun / bi / sdk / UserInfo”); env-> DeleteLocalRef(tcls); }}
那里似乎没有内存泄漏...
4。 我让它更循环:
void LoggerImp :: jniLog(){ for(int i = 0; i< 1000; i ++) { jclass tcls = env-> FindClass(“com / morefun / bi / sdk / UserInfo”); env-> DeleteLocalRef(tcls); }}
发生了可怕的事情,还有内存泄漏...... 这次,内存泄漏不在JVM内部,JVM堆看起来是O.K.在GC期间。
程序只在C ++中使用一个JVM环境,代码永远不会返回JAVA。 它应该是一个稳定的服务器线程,保持内存清洁非常重要。
这让我发疯了。 任何人都对这个问题的想法将非常感激,:))