質問編集履歴
7
Perlについて調べたことを反映
title
CHANGED
File without changes
|
body
CHANGED
@@ -18,8 +18,8 @@
|
|
18
18
|
|C#(.NET Framework)|[×](https://blogs.msdn.microsoft.com/brada/2005/02/11/resource-management/)|[世代別GC](https://msdn.microsoft.com/ja-jp/library/ee787088(v=vs.110).aspx)|
|
19
19
|
|C#(Mono)|__不明__|__不明__|
|
20
20
|
|Erlang|__不明__|__インクリメンタルGC?__|
|
21
|
-
|Perl5|__○
|
21
|
+
|Perl5|[__○__](http://stackoverflow.com/questions/2972021/garbage-collection-in-perl)|[__×__](http://stackoverflow.com/questions/2972021/garbage-collection-in-perl)|
|
22
|
-
|Perl6(
|
22
|
+
|Perl6(MoarVM)|__不明__|[世代別GC](http://www.moarvm.org/features.html)|
|
23
23
|
|Python(CPython)|[○](http://docs.python.jp/3/extending/extending.html#reference-counts)|[世代別GC](http://docs.python.jp/3/library/gc.html#module-gc)|
|
24
24
|
|PHP|[○](http://php.net/manual/ja/features.gc.refcounting-basics.php)|[M&S](http://php.net/manual/ja/features.gc.collecting-cycles.php)|
|
25
25
|
|Ruby(MRI)|×|[世代別GC+インクリメンタルGC](https://www.ruby-lang.org/ja/news/2014/12/25/ruby-2-2-0-released/)|
|
@@ -37,6 +37,7 @@
|
|
37
37
|
※ その他、この言語はこれを使っているという情報があれば教えて下さい。
|
38
38
|
※ Java8にはインクリメンタルGCもあるようですが、非推奨になっています。
|
39
39
|
※ Rustの参照カウントは標準ライブラリとして提供されます。
|
40
|
+
※ MoarVMはPerl6のVM。RakudoもMoarVMを使っているはず。
|
40
41
|
|
41
42
|
間違い等があれば、ご指摘下さい。「無い」ことを証明するのは悪魔の証明になり得るため、しばらくして指摘が無ければ、不明部分は「×」にしていきたいと思います。世代数も調べていった方が良いかちょっと悩んでいます(世代別GCでは無い場合は1世代しかないという扱いをするとか)。
|
42
43
|
|
6
D追加、ついでに言語をネイティブ->VM->インタプリンタ順にした
title
CHANGED
File without changes
|
body
CHANGED
@@ -7,11 +7,17 @@
|
|
7
7
|
|---|:---:|:---:|
|
8
8
|
|C|×|×|
|
9
9
|
|C++(スマートポインタ)|[○](http://en.cppreference.com/w/cpp/memory/shared_ptr)|×|
|
10
|
+
|D|__不明__|[世代別GC](http://dlang.org/spec/garbage.html)|
|
11
|
+
|Go(gc)|__不明__|[__よくわからない、解説求む__](https://blog.golang.org/go15gc)|
|
12
|
+
|Go(gccgo)|__不明__|[__未実装?__](http://golang.jp/tag/gccgo)|
|
13
|
+
|Rust|[○](https://www.rust-lang.org/faq.html#is-rust-garbage-collected)|[×](https://www.rust-lang.org/faq.html#is-rust-garbage-collected)|
|
14
|
+
|Swift|[○](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/AutomaticReferenceCounting.html)|[__×__](https://www.quora.com/Why-doesnt-Apple-Swift-adopt-the-memory-management-method-of-garbage-collection-like-in-Java)|
|
15
|
+
|Haskell(GHC)|__不明__|__世代別GC?__|
|
10
16
|
|Java(Oracle)|__不明__|[世代別GC](https://docs.oracle.com/javase/jp/8/docs/technotes/guides/vm/gctuning/introduction.html)+[コンカレントGC](https://docs.oracle.com/javase/jp/8/docs/technotes/guides/vm/gctuning/cms.html)+[G1](https://docs.oracle.com/javase/jp/8/docs/technotes/guides/vm/gctuning/g1_gc.html)|
|
11
17
|
|Java(OpenJDK)|__不明__|__不明__|
|
12
18
|
|C#(.NET Framework)|[×](https://blogs.msdn.microsoft.com/brada/2005/02/11/resource-management/)|[世代別GC](https://msdn.microsoft.com/ja-jp/library/ee787088(v=vs.110).aspx)|
|
13
19
|
|C#(Mono)|__不明__|__不明__|
|
14
|
-
|
|
20
|
+
|Erlang|__不明__|__インクリメンタルGC?__|
|
15
21
|
|Perl5|__○?__|__不明__|
|
16
22
|
|Perl6(Rakudo)|__不明__|__不明__|
|
17
23
|
|Python(CPython)|[○](http://docs.python.jp/3/extending/extending.html#reference-counts)|[世代別GC](http://docs.python.jp/3/library/gc.html#module-gc)|
|
@@ -21,11 +27,6 @@
|
|
21
27
|
|JavaScript(SpiderMonkey)|__○?__|__M&S?__|
|
22
28
|
|JavaScript(JavaScriptCore)|__○?__|__M&S?__|
|
23
29
|
|JScript(Chakra)|__○?__|__M&S?__|
|
24
|
-
|Go(gc)|__不明__|[__よくわからない、解説求む__](https://blog.golang.org/go15gc)|
|
25
|
-
|Go(gccgo)|__不明__|[__未実装?__](http://golang.jp/tag/gccgo)|
|
26
|
-
|Rust|[○](https://www.rust-lang.org/faq.html#is-rust-garbage-collected)|[×](https://www.rust-lang.org/faq.html#is-rust-garbage-collected)|
|
27
|
-
|Erlang|__不明__|__インクリメンタルGC?__|
|
28
|
-
|Swift|[○](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/AutomaticReferenceCounting.html)|[__×__](https://www.quora.com/Why-doesnt-Apple-Swift-adopt-the-memory-management-method-of-garbage-collection-like-in-Java)|
|
29
30
|
|
30
31
|
※ __斜体__はよくわかっていない部分です。
|
31
32
|
※ 循環参照も確実に回収できる方式をGCとしています。よって、スマートポインタはGCではありません。
|
5
Swiftを追加
title
CHANGED
File without changes
|
body
CHANGED
@@ -25,7 +25,7 @@
|
|
25
25
|
|Go(gccgo)|__不明__|[__未実装?__](http://golang.jp/tag/gccgo)|
|
26
26
|
|Rust|[○](https://www.rust-lang.org/faq.html#is-rust-garbage-collected)|[×](https://www.rust-lang.org/faq.html#is-rust-garbage-collected)|
|
27
27
|
|Erlang|__不明__|__インクリメンタルGC?__|
|
28
|
-
|Swift|
|
28
|
+
|Swift|[○](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/AutomaticReferenceCounting.html)|[__×__](https://www.quora.com/Why-doesnt-Apple-Swift-adopt-the-memory-management-method-of-garbage-collection-like-in-Java)|
|
29
29
|
|
30
30
|
※ __斜体__はよくわかっていない部分です。
|
31
31
|
※ 循環参照も確実に回収できる方式をGCとしています。よって、スマートポインタはGCではありません。
|
4
Rustについて追加
title
CHANGED
File without changes
|
body
CHANGED
@@ -23,7 +23,7 @@
|
|
23
23
|
|JScript(Chakra)|__○?__|__M&S?__|
|
24
24
|
|Go(gc)|__不明__|[__よくわからない、解説求む__](https://blog.golang.org/go15gc)|
|
25
25
|
|Go(gccgo)|__不明__|[__未実装?__](http://golang.jp/tag/gccgo)|
|
26
|
-
|Rust|
|
26
|
+
|Rust|[○](https://www.rust-lang.org/faq.html#is-rust-garbage-collected)|[×](https://www.rust-lang.org/faq.html#is-rust-garbage-collected)|
|
27
27
|
|Erlang|__不明__|__インクリメンタルGC?__|
|
28
28
|
|Swift|__不明__|__不明__|
|
29
29
|
|
@@ -35,6 +35,7 @@
|
|
35
35
|
※ Mozillaに[JavaScriptにおけるメモリ管理のドキュメント](https://developer.mozilla.org/ja/docs/Web/JavaScript/Memory_Management)がありますが、概要だけではっきりしません。
|
36
36
|
※ その他、この言語はこれを使っているという情報があれば教えて下さい。
|
37
37
|
※ Java8にはインクリメンタルGCもあるようですが、非推奨になっています。
|
38
|
+
※ Rustの参照カウントは標準ライブラリとして提供されます。
|
38
39
|
|
39
40
|
間違い等があれば、ご指摘下さい。「無い」ことを証明するのは悪魔の証明になり得るため、しばらくして指摘が無ければ、不明部分は「×」にしていきたいと思います。世代数も調べていった方が良いかちょっと悩んでいます(世代別GCでは無い場合は1世代しかないという扱いをするとか)。
|
40
41
|
|
3
C#が参照カウントしていないのとJavaについてG1を追加
title
CHANGED
File without changes
|
body
CHANGED
@@ -7,9 +7,9 @@
|
|
7
7
|
|---|:---:|:---:|
|
8
8
|
|C|×|×|
|
9
9
|
|C++(スマートポインタ)|[○](http://en.cppreference.com/w/cpp/memory/shared_ptr)|×|
|
10
|
-
|Java(Oracle)|__不明__|[世代別GC+コンカレントGC](https://docs.oracle.com/javase/jp/8/docs/technotes/guides/vm/gctuning/
|
10
|
+
|Java(Oracle)|__不明__|[世代別GC](https://docs.oracle.com/javase/jp/8/docs/technotes/guides/vm/gctuning/introduction.html)+[コンカレントGC](https://docs.oracle.com/javase/jp/8/docs/technotes/guides/vm/gctuning/cms.html)+[G1](https://docs.oracle.com/javase/jp/8/docs/technotes/guides/vm/gctuning/g1_gc.html)|
|
11
11
|
|Java(OpenJDK)|__不明__|__不明__|
|
12
|
-
|C#(.NET Framework)|
|
12
|
+
|C#(.NET Framework)|[×](https://blogs.msdn.microsoft.com/brada/2005/02/11/resource-management/)|[世代別GC](https://msdn.microsoft.com/ja-jp/library/ee787088(v=vs.110).aspx)|
|
13
13
|
|C#(Mono)|__不明__|__不明__|
|
14
14
|
|Haskell(GHC)|__不明__|__世代別GC?__|
|
15
15
|
|Perl5|__○?__|__不明__|
|
@@ -34,6 +34,7 @@
|
|
34
34
|
※ JavaはJava仮想マシン、C#は.NET Framework/Mono依存の可能性があります。ScalaやKotlin、F#やVB.NETについても情報があれば教えて下さい。
|
35
35
|
※ Mozillaに[JavaScriptにおけるメモリ管理のドキュメント](https://developer.mozilla.org/ja/docs/Web/JavaScript/Memory_Management)がありますが、概要だけではっきりしません。
|
36
36
|
※ その他、この言語はこれを使っているという情報があれば教えて下さい。
|
37
|
+
※ Java8にはインクリメンタルGCもあるようですが、非推奨になっています。
|
37
38
|
|
38
39
|
間違い等があれば、ご指摘下さい。「無い」ことを証明するのは悪魔の証明になり得るため、しばらくして指摘が無ければ、不明部分は「×」にしていきたいと思います。世代数も調べていった方が良いかちょっと悩んでいます(世代別GCでは無い場合は1世代しかないという扱いをするとか)。
|
39
40
|
|
@@ -45,6 +46,7 @@
|
|
45
46
|
* 世代別GC: [世代別ガベージコレクション](https://ja.wikipedia.org/wiki/%E4%B8%96%E4%BB%A3%E5%88%A5%E3%82%AC%E3%83%99%E3%83%BC%E3%82%B8%E3%82%B3%E3%83%AC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3)。M&SとコピーGCを組み合わせ、オブジェクトを世代に分けることで効率よく回収を行う方式。
|
46
47
|
* コンカレントGC: STWせずに並列処理でできるだけマーク付けをすることで、STWを極力なくす方式。
|
47
48
|
* インクリメンタルGC: 少しずつ小まめにできるだけマーク付けをすることで、一回あたりのSTWを短くする方式。
|
49
|
+
* G1: ガベージファースト・コレクタ。ヒープをいくつかに分割して、余り使っていないヒープを収集、圧縮し、一気に解放する方式らしい。
|
48
50
|
* STW: Stop the World。時よ止まれ!止まった時の中で動けるのはGCだけ。
|
49
51
|
|
50
52
|
【その他】
|
2
個人ブログも大歓迎
title
CHANGED
File without changes
|
body
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
ある質問のある回答で、JavaやC#が[参照カウント](https://ja.wikipedia.org/wiki/%E5%8F%82%E7%85%A7%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88)を使用していると言うのがありました。しかし、私の記憶では、JavaやC#は参照カウントは使用していなかったと思います。色々調べましたが、公式または(個人ブログとかじゃない)信頼できる準公式な情報がうまく見つからず、わからない状態です。
|
2
2
|
|
3
|
-
そこで、参照カウントの有無やGCの種類をまとめたいと思っています。それぞれの言語について情報(公式なドキュメント、信頼できる企業・団体のサイト、多数の技術者によってメンテナンスされているWikiなど)を知っている方は教えていただけませんか?
|
3
|
+
そこで、参照カウントの有無やGCの種類をまとめたいと思っています。それぞれの言語について情報(公式なドキュメント、信頼できる企業・団体のサイト、多数の技術者によってメンテナンスされているWikiなど)を知っている方は教えていただけませんか? 公式のみだと情報が少なくなりそうなので、この際、個人ブログ等でもかまいません(ただし、参考資料扱いにさせていただきます)。
|
4
4
|
|
5
5
|
【言語/実装別GC一覧】
|
6
6
|
|言語|参照カウント|GC|
|
1
JavaScript関係でMozillaの資料を追加
title
CHANGED
File without changes
|
body
CHANGED
@@ -17,9 +17,10 @@
|
|
17
17
|
|Python(CPython)|[○](http://docs.python.jp/3/extending/extending.html#reference-counts)|[世代別GC](http://docs.python.jp/3/library/gc.html#module-gc)|
|
18
18
|
|PHP|[○](http://php.net/manual/ja/features.gc.refcounting-basics.php)|[M&S](http://php.net/manual/ja/features.gc.collecting-cycles.php)|
|
19
19
|
|Ruby(MRI)|×|[世代別GC+インクリメンタルGC](https://www.ruby-lang.org/ja/news/2014/12/25/ruby-2-2-0-released/)|
|
20
|
-
|JavaScript(V8)|__
|
20
|
+
|JavaScript(V8)|__○?__|__M&S?__|
|
21
|
-
|JavaScript(SpiderMonkey)|__
|
21
|
+
|JavaScript(SpiderMonkey)|__○?__|__M&S?__|
|
22
|
+
|JavaScript(JavaScriptCore)|__○?__|__M&S?__|
|
22
|
-
|JScript(Chakra)|__
|
23
|
+
|JScript(Chakra)|__○?__|__M&S?__|
|
23
24
|
|Go(gc)|__不明__|[__よくわからない、解説求む__](https://blog.golang.org/go15gc)|
|
24
25
|
|Go(gccgo)|__不明__|[__未実装?__](http://golang.jp/tag/gccgo)|
|
25
26
|
|Rust|__不明__|__不明__|
|
@@ -31,9 +32,10 @@
|
|
31
32
|
※ 各言語は最新バージョンが対象です。なお、Python2とPython3は同じのようです。PHPにGCが追加されたのは5.3からです。RubyはRubyはM&S→世代別GC→インクリメンタルGCと進化して行っています。
|
32
33
|
※ 実装は明記されていない限り各言語の公式なものとします。
|
33
34
|
※ JavaはJava仮想マシン、C#は.NET Framework/Mono依存の可能性があります。ScalaやKotlin、F#やVB.NETについても情報があれば教えて下さい。
|
35
|
+
※ Mozillaに[JavaScriptにおけるメモリ管理のドキュメント](https://developer.mozilla.org/ja/docs/Web/JavaScript/Memory_Management)がありますが、概要だけではっきりしません。
|
34
36
|
※ その他、この言語はこれを使っているという情報があれば教えて下さい。
|
35
37
|
|
36
|
-
間違い等があれば、ご指摘下さい。「無い」ことを証明するのは悪魔の証明になり得るため、しばらくして指摘が無ければ、不明部分は「×」にしていきたいと思います。
|
38
|
+
間違い等があれば、ご指摘下さい。「無い」ことを証明するのは悪魔の証明になり得るため、しばらくして指摘が無ければ、不明部分は「×」にしていきたいと思います。世代数も調べていった方が良いかちょっと悩んでいます(世代別GCでは無い場合は1世代しかないという扱いをするとか)。
|
37
39
|
|
38
40
|
【用語集】
|
39
41
|
* 参照カウント: オブジェクトへの参照数をカウントしていき、0になれば即座に削除される方式。実装が単純で高速だが、多数の小さなオブジェクトを生成・破棄する場合はオーバーヘッドが大きくなる。また、循環参照は回収できないという致命的な欠点があるため、これだけではGCとは言えない。
|