为什么我使用DeleteLocalRef(jclass),但仍然在C ++中出现内存泄漏

时间:2015-03-25 11:52:17

标签: memory-leaks jvm java-native-interface

这是我在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。 它应该是一个稳定的服务器线程,保持内存清洁非常重要。

这让我发疯了。 任何人都对这个问题的想法将非常感激,:))

0 个答案:

没有答案