Issue #15939 has been updated by byroot (Jean Boussier).


> Static symbol (immediate value) does not reach any objects

Yeah, I learned more about static symbols since I wrote this patch, I wouldn't include that part anymore. I'd still maintain the dynamic part though.

> Could you give us your usage?

Sure. The usage is to rebuild the graph of objects "offline" as to visualise opportunities for retained memory reduction.

So in this context, it can happen that some strings appear as "dangling", i.e. not referenced anymore, but they still appear in the dump. Or at least appearing as having less backreference than they actually have. Sometime it's because they are backing a dynamic symbol.

Here's the tool I use: https://github.com/csfrancis/harb

----------------------------------------
Feature #15939: Dump symbols reference to their fstr in ObjectSpace.dump()
https://bugs.ruby-lang.org/issues/15939#change-79413

* Author: byroot (Jean Boussier)
* Status: Assigned
* Priority: Normal
* Assignee: ko1 (Koichi Sasada)
* Target version: 
----------------------------------------
Patch: https://github.com/ruby/ruby/pull/2240

Symbols wether they are dynamic or static do hold a reference onto their respective fstring, so it's important to dump these references so that it's possible to see that a String isn't garbage collected because it has an associated Symbol.

Dumping a static Symbol (before):


```
>> puts ObjectSpace.dump(:foobar)
{"type":"SYMBOL", "value":"foobar"}
```

after:
```
>> puts ObjectSpace.dump(:foobar)
{"address":"0x7a210c", "type":"SYMBOL", "value":"foobar", "references":["0x7f8dd482c7d8"], "dynamic": false}
```

Dumping a dynamic Symbol (before):

```
>> puts ObjectSpace.dump("foobar".to_sym)
{"address":"0x7fcdf7042eb0", "type":"SYMBOL", "class":"0x7fcdf70c8628", "frozen":true, "bytesize":6, "value":"foobar", "memsize":40, "flags":{"wb_protected":true}}
```

After: 

```
>> puts ObjectSpace.dump("foobar".to_sym)
{"address":"0x7fcdf7042eb0", "type":"SYMBOL", "class":"0x7fcdf70c8628", "frozen":true, "bytesize":6, "value":"foobar", "dynamic":true, "references":["0x7fcdf7042ed8"], "memsize":40, "flags":{"wb_protected":true}}
```

Limitations:

`ObjectSpace.dump_all` rely on `rb_objspace_reachable_objects_from` to list an object's references.
Because of this static symbol "references" are not followed, and as such are invisible in `ObjectSpace.dump_all`.

I'd like to correct it but it's quite more complicated because `rb_objspace_reachable_objects_from` is used by the GC, so I'd need to duplicate that function for `objspace_dump` usage.

So I wouldn't mind some opinion on that before attempting it.



-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>