teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

ちょっと文言修正

2020/02/09 03:54

投稿

raccy
raccy

スコア21768

answer CHANGED
@@ -86,4 +86,4 @@
86
86
 
87
87
  上のRubyの例ではGCで回収された後にアクセスしようとするとエラーになりますが、回収前ならアクセス可能です。
88
88
 
89
- Java同等の機能を見つけようとしたのですが、普通のAPIにはないようです。"java.bsae/jdk.internal"にあるものも一通り見てみましたが、なさそうでした。もしどうしてもしたいなら、C等でnative実装するしかないと思います。(オブジェクトのID取得に使われる`System#identityHashCode(Object)`も直接native実装で、内部APIを使っているわけではなかったです。ただ、これはHashCode用にカスタマイズされていると思われるため、単純にメモリ番地を取ってきているとかではないかも知れません。)場合によっては、JVMのコードを書き換える必要もあるかも知れませんが、幸い、OpenJDKならオープンソースで、誰でも自由に閲覧して改変して(ライセンスに従って)配付できますので、IDでオブジェクト再利用が可能なオリジナルOpenJDKを作ってくれることを楽しみに待っています(私は作りませんし、使いませんが)。
89
+ Java同等の機能を見つけようとしたのですが、普通のAPIにはないようです。"java.bsae/jdk.internal"(内部用のAPI、通常は隠しなっていて、ドキュメントもない)にあるものも一通り見てみましたが、なさそうでした。もしどうしてもしたいなら、C等でnative実装するしかないと思います。(オブジェクトのID取得に使われる`System#identityHashCode(Object)`も直接native実装で、内部APIを使っているわけではなかったです。ただ、これはHashCode用にカスタマイズされていると思われるため、単純にメモリ番地を取ってきているとかではないかも知れません。)場合によっては、JVMのコードを書き換える必要もあるかも知れませんが、幸い、OpenJDKならオープンソースで、誰でも自由に閲覧して改変して(ライセンスに従って)配付できますので、IDでオブジェクト再利用が可能なオリジナルOpenJDKを作ってくれることを楽しみに待っています(私は作りませんし、使いませんが)。

1

過去形

2020/02/09 03:54

投稿

raccy
raccy

スコア21768

answer CHANGED
@@ -1,4 +1,4 @@
1
- ファイナライザでthisを別の所に参照させた場合、何処にも参照されていな状態でも、GC回収のタイミングで参照が作られせて、再利用できるようにすることはできるようです。(ただし、`finalize()`はJava 9からdeprecatedですので、使用しない方が良いです。)
1
+ ファイナライザでthisを別の所に参照させた場合、何処にも参照されて**いなかった**状態でも、GC回収のタイミングで参照が作られせて、再利用できるようにすることはできるようです。(ただし、`finalize()`はJava 9からdeprecatedですので、使用しない方が良いです。)
2
2
 
3
3
  ```Java
4
4
  public class prog {