javascript 如何减少V8扫气频率

ogsagwnx  于 2023-02-02  发布在  Java
关注(0)|答案(1)|浏览(149)

这是我的测试代码

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?

56lgkhnf

56lgkhnf1#

(V8开发人员单击此处。)
有没有办法把新对象分配给老一代,以减少扫描范围gc?
不。对象在年轻代中分配。* 有时 * V8会自动决定某些分配应该被“pretured”(例如,直接分配到旧代中),因为根据应用程序过去的行为,这些对象被估计为长期存在,但您无法手动控制这一点。这似乎不会发生在这个微基准中,但由于它是一个微基准,它也 * 不应该 * 是启发式的目标场景。
总之:别担心。

相关问题