用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() 。
否则,它们就等待自动回收,我们就没有办法知道何时这些对象释放,可能会是任意一个不确定的时间来释放它们。
?
?
?
?