这是我的测试代码
function Obj ()
{
}
function genObj ()
{
return new Obj()
}
globalThis.objPool = new Array( 1_000_000 )
function test ()
{
globalThis.objPool.length = 0
for ( var i = 0; i < 1_000_000; i++ )
{
globalThis.objPool.push( genObj() )
}
}
test()
这是d8轨迹gc结果
d8 --trace-gc test.js
[35164:000001B1DE2EBBA0] 120 ms: Scavenge 5.0 (5.4) -> 1.0 (2.6) MB, 5.74 / 0.00 ms (average mu = 1.000, current mu = 1.000) allocation failure;
[35164:000001B1DE2EBBA0] 134 ms: Scavenge 2.2 (3.3) -> 1.8 (3.7) MB, 12.10 / 0.00 ms (average mu = 1.000, current mu = 1.000) allocation failure;
[35164:000001B1DE2EBBA0] 155 ms: Scavenge 2.6 (4.1) -> 2.6 (6.6) MB, 18.12 / 0.00 ms (average mu = 1.000, current mu = 1.000) allocation failure;
[35164:000001B1DE2EBBA0] 189 ms: Scavenge 5.7 (8.3) -> 5.2 (7.9) MB, 28.67 / 0.00 ms (average mu = 1.000, current mu = 1.000) allocation failure;
[35164:000001B1DE2EBBA0] 231 ms: Scavenge 6.9 (9.3) -> 6.8 (15.1) MB, 36.22 / 0.00 ms (average mu = 1.000, current mu = 1.000) allocation failure;
[35164:000001B1DE2EBBA0] 296 ms: Scavenge 12.6 (17.3) -> 12.9 (17.3) MB, 55.07 / 0.00 ms (average mu = 1.000, current mu = 1.000) allocation failure;
[35164:000001B1DE2EBBA0] 356 ms: Scavenge 12.9 (17.3) -> 12.6 (29.3) MB, 58.69 / 0.00 ms (average mu = 1.000, current mu = 1.000) allocation failure;
[35164:000001B1DE2EBBA0] 426 ms: Mark-Compact 17.7 (32.6) -> 14.1 (31.2) MB, 14.08 / 0.01 ms (+ 13.4 ms in 30 steps since start of marking, biggest step 0.8 ms, walltime since start of marking 61 ms) (average mu = 1.000, current mu = 1.000) finalize incremental marking via stack guard; GC in old space requested
在测试代码中触发了多个GC,这影响了性能。
似乎Obj已经分配了年轻一代,所以我想把它们分配给老一代。有没有办法把新对象分配给老一代,以减少scavenge gc?
1条答案
按热度按时间56lgkhnf1#
(V8开发人员单击此处。)
有没有办法把新对象分配给老一代,以减少扫描范围gc?
不。对象在年轻代中分配。* 有时 * V8会自动决定某些分配应该被“pretured”(例如,直接分配到旧代中),因为根据应用程序过去的行为,这些对象被估计为长期存在,但您无法手动控制这一点。这似乎不会发生在这个微基准中,但由于它是一个微基准,它也 * 不应该 * 是启发式的目标场景。
总之:别担心。