用jacob的时候注意内存的释放out of memory out of heap

我在用jacob调用com组件的时候,我在程序中会反复的调用某个方法数百万次,遇到了内存不停的增长,com组件以及释放了内存,原来内存的泄露在jacob上。

我用的是 JACOB Version 1.7

 

Dispatch dis = new Dispatch("TsetCOM.TestWriter.1");

调用dis.safeRelease();会释放部分内存,但内存会继续增长

在调用完com组件后调用 ComThread.Release()可以释放掉调用com控件时占用的内存

--------------------------------------------------------------------------------------

    在JACOB1.7的版本中,所有的jacob包装的com 对象都继承自com.jacob.com.JacobObject.这些对象有一

些专门的代码来把它们自己注册在com.jacob.com.ROT对象中(ROT 就是一个运行时的对象表).这个表包含

了一个线程创建的 JacobObjects 对象的信息。因此,当我们调用ComThread.Release()的时候,ROT会检查

是否这个线程创建了一些对象,并且这些对象是由调用它们的 native release 方法来释放的。
这个生命周期管理的方法与这个线程的生命周期有关而与GC无关。JacobObject对象仍然有finalizers,但它

们一般不会执行native release方法,直到它们被调用时才执行本地的native release 方法。这个本地的

native release 方法可以被调用多次而不必担心会出现异常。
    如果我们处理我们自己的对象的时候,选择去调用这个release方法也是允许的。如果我们自动调用的话

,在线程被释放的时候,release的方法会被调用,但不会有任何操作。
    需要注意的是在任何线程不再需要的时候,可以退出的时候,最好主动的调用ComThread.Release() 。

否则,它们就等待自动回收,我们就没有办法知道何时这些对象释放,可能会是任意一个不确定的时间来释放它们。 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值