java和C#内存释放释-调用C++的内存释放释放问题

    本文讨论java和C#调用C++写的动态库 的内存问题,前提是C++写的动态库没有内存泄漏问题,c++的内存问题不在本章讨论的范围之类。

    问题场景为:C++调用直接测试调用没内存泄漏,跑很长时间都可以,但是java和C#调用的时候就是运行一段时间后就内存涨起来了,也不能很好的降下去,直到内存崩溃。

   目前java调用C++无非使用JNI调用,C#可以使用com组件或者 dllimport 调用C++的动态库或者so。java和C#释放对象的机制都是垃圾回收机制,简单理解的是自动垃圾回收机制,虚拟机 一段时间内自动回收没有使用的内存,但是程序无法及时控制,也就是有延迟释放问题,当延迟释放累积到一定程度,那么释放不及时的问题将极为突出,特别是需要大量密集型运算的时候。

   目前进过测试有且只有以下几种方式可以快速释放C#或者java的内存占有量:

java:用完的对象置为null,然后 Runtime.getRuntime().gc()或者System.gc();

C#: 第一种方式:对象继承 Dispose 接口,调用的时候使用using 调用,(当然c++的对象一般没有这个接口,除非使用CLR技术封装的C++对象)

        第二种方式:Marshal.ReleaseComObject(Object), 这种方式适合COM对象的释放,

当然以上两种方式最后都可以显示调用GC.Collect(); 

当然以上是我工作中遇到的可以解决问题办法,最终总结总结为C#和java层调用释放内存的时候,最好是调用 obj=null,GC.Collect(); 

        但是这里有个比较重点的注意点,总结一下:GC不能频繁调用,比如粒度很细的操作,每次调用GC将显著降低应用程序性能,这种方式的使用场景只有一个:当做了大量操作后,然后调用本文的释放内存方法,不能直接在多层循环内去调用gc 这是不正确的利用gc,本文的建议是合理利用GC来提高程序的可用性。

展开阅读全文

没有更多推荐了,返回首页