MATLAB Java参照問題
-
05-07-2019 - |
質問
Javaオブジェクトへの参照を含むMATLABクラスがあります
classdef MyClass
properties
j = myJavaClass
end
methods
...
end
end
そしてそれを使用した後(clear、scope exitを使用する、または明示的にmyClass = 0;を設定する)、JavaオブジェクトはまだRuntime.gcを呼び出した後も生きています。
ダンプでは、オブジェクトがまだjmap -histo pIDを使用して、MATLABプロセスのJVMヒープにあることがわかります。したがって、clear、clear JAVA、clearクラスの呼び出しにもかかわらず、MATLAB自体がまだオブジェクトを参照していると想定していますなど-何も役に立たない
アイデアはありますか
解決 2
提案された回避策のノービスは機能しているようです-デストラクタに行を追加します
function delete( obj )
...
jObject = 0;
end
MATLABのJVMヒープにオブジェクトが存在しないようにしました。
これは、参照されていないMCOSクラスのJAVAオブジェクトの参照を引き起こすMATLABのバグのように見えます。
他のヒント
MATLABの最新のオブジェクト指向プログラミング形式は、まだ両足で飛び込んだことはありませんが、いくつかのアイデアを試してみることができます...
「値クラス」を作成していると思います。 「ハンドルクラス」とは対照的に(これらの詳細については、こちら)。値クラスのコピーが作成されると、すべてのコンテンツがコピーされます。オブジェクトの誤ったコピーがどこかに浮いている場合、Javaオブジェクトへのハンドルがまだ存在しています。
代わりにハンドルクラスからクラスを構築する場合、クラスデストラクタ内のJavaオブジェクト(つまり、オーバーロードされたDELETEメソッド)を明示的に破棄できます。
いくつかのランダムなアイデア。役に立てば幸いです。
これで修正されるかどうかはわかりませんが、プロパティブロックではなく、コンストラクタで割り当てを試してください。また、使用しているMatlabの正確なバージョンを記載しておくと役立ちます。
OOPのonCleanupの側面を見てみてください。ローレンは約3か月前にブログを書いたと思います。
HTH。 ダン