2016-05-08 2 views
1

私は自分の3Dエンジンを書いています。 OBJファイルからロードしたオブジェクトを配列リストの中に残します。問題は、リストからオブジェクトを削除したときにガベージコレクションが取得されない場合です。それはまだコードのどこかで参照されているかもしれませんが、検索する首の痛みです。そこでオブジェクトをロックする方法があるのだろうかと疑問に思っていました。オブジェクトを削除しようとすると、何かがアクセスしようとするたびにエラーがスローされます。

高いポリメッシュは、メモリ内で数百メガバイトを要する可能性があります。

ありがとうございました。 (私はかなり巨大なので、コードを投稿したくない)ガベージコレクションのためにオブジェクトを意図的に放棄する方法。 (Java)

答えて

-1

コンテナがある場合は、オブジェクトを追加してオブジェクトを削除して、そのオブジェクトへの参照がなくなりました。

リファレンスを本当に心配している場合、またはコピーを作成した場合は暗黙的に= nullです。

「エラーが発生しました」は、まだ参照が残っている場合はnullポインターになります。 (ただし、実際には削除する必要がある場合は除外してください)

+0

オブジェクトは実際にはコンテナにはありません。作成されると、ArrayListの内部に保存されます。私はオブジェクトに参照を持っているメッシュへの参照を持っていることに気付きました。参照ループのために収集されない可能性があります。 –

+0

@JackLe一般的に使用されている読書可能なモダンなJVMには、参照ループを処理できるガベージコレクタがあります。 – hexafraction

+0

@JackLeガベージコレクションは、定義によってサイクルを処理します。 Javaは初めからそうしてきました。 – EJP

0

オブジェクトがまだ参照されているときにオブジェクトをメモリから削除することはできません。

オブジェクトがそのように構成されている場合は、内部状態を削除または最小化することが最も可能です。たとえば、コレクションのclear()に電話をかけると、コレクションからすべての要素が削除されるため、コレクションのサイズが大幅に小さくなります。あなたの場合は、そのようなことをする無効化メソッドを追加することができると思います(おそらく奇妙なデザインですが、オブジェクトがまだ使用されている場所と理由はわかります)。

1

これは、追加レベルの逆参照で解決できます。むしろコレクションであなたのBigObjectを格納するのではなく、オブジェクトの「封筒」を格納し、実際のオブジェクトへの参照のみをドロップするrelease()操作を追加します。

interface MyInterface { 
    void usefulOperation(); 
} 
class VeryBigObject implements MyInterface { 
    public void usefulOperation() { 
     ... 
    } 
} 
class BigObjectEnvelope implements MyInterface { 
    private MyInterface inner = new VeryBigObject(); 
    public void usefulOperation() { 
     inner.usefulOperation(); 
    } 
    public void release() { 
     inner = null; 
    } 
} 

BigObjectEnvelopeオブジェクトのコレクションを作成し、それらを使用しますMyInterfaceインターフェイスを使用します。オブジェクトを終了したら、release()を呼び出します。他の場所でBigObjectEnvelopeの参照がある場合でも、usefulOperation()を呼び出すと例外がスローされます。

+0

非常に興味深い考えです。これは、墓石技術を手動で実装するようなものです。やってみます –

関連する問題