

JavaScriptのガベージコレクション（以下GC）について質問です。

以下の二例で前者だけ変数objがGCされる理由がわかりません。どちらも監視対象への参照は切っており、global.gc()の実行されるタイミングも同じ同期処理内なので変化はないように思えます。なにが原因で異なる結果が生じているのでしょうか。

[code]

    // GCされる例
    hoge();
    
    function hoge(){
        let obj = {}
        const fr = new FinalizationRegistry(function(value){
            console.log(value);
        });
        fr.register(obj, 'object');
        obj = null;
        global.gc();
    }
    
[/code]

[code]

    // GCされない例
    hoge();
    global.gc();
    
    function hoge(){
        let obj = {}
        const fr = new FinalizationRegistry(function(value){
            console.log(value);
        });
        fr.register(obj, 'object');
        obj = null;
    }
    
[/code]


CC BY-SA 4.0
2021-10-01T07:06:12.097
82791
2021-10-01T12:47:08.677
19069
question
javascript node.js
ガベージコレクションについて


おそらく`object`が出力されるかどうかで、GCされるされないを判断しているのだと思いますが、`fr`が`hoge()`のローカル変数なので、コールバック関数の設定が`hoge()`の外に伝播していないだけでしょう．  
`fr`をグローバルスコープにしたら、`object`と出力されました．

[code]

    const fr = new FinalizationRegistry(function(value){
        console.log(value);
    });
    
    function hoge(){
        let obj = {}
        fr.register(obj, 'object');
        obj = null;
    }
    
    hoge();
    global.gc();
    
[/code]


CC BY-SA 4.0
2021-10-01T08:53:32.510
82794
2021-10-01T08:53:32.510
36544
82791
answer


[FinalizationRegistry: Notes on cleanup
callbacks](https://developer.mozilla.org/en-
US/docs/Web/JavaScript/Reference/Global_Objects/FinalizationRegistry#notes_on_cleanup_callbacks)

> There are also situations where even implementations that normally call
> cleanup callbacks are **unlikely to call them** :
>
>   * When the JavaScript program shuts down entirely (for instance, closing a
> tab in a browser).
>   * When the FinalizationRegistry instance itself is **no longer reachable
> by JavaScript code**.
>

**test.js**

[code]

    function hoge(){
        let obj = {}
        const fr = new FinalizationRegistry(function(value){
            console.log(value);
        });
        fr.register(obj, 'object');
        obj = null;
    
        return fr; // return FinalizationRegistry instance
    }
    
    const _ = hoge();
    global.gc();
    
    // 実行結果
    object
    
[/code]


CC BY-SA 4.0
2021-10-01T12:38:47.187
82803
2021-10-01T12:47:08.677
2021-10-01T12:47:08.677
47127
47127
82791
answer