jest icon indicating copy to clipboard operation
jest copied to clipboard

chore: replace `vm.Script` with `vm.compileFunction`

Open rthreei opened this issue 2 years ago • 18 comments

Summary

Memory leak is alleviated with vm.compileFunction.

Related to https://github.com/facebook/jest/issues/11956

Inspired by earlier work done earlier https://github.com/facebook/jest/pull/10586

Test plan

Change is covered by existing tests. Below is a before and after of heap usage against a trivial reproduction.

Before (against main branch):

% yarn jest --runInBand --logHeapUsage reproduce
 PASS  reproduce/a19.test.js (49 MB heap size)
 PASS  reproduce/a156.test.js (49 MB heap size)
 PASS  reproduce/a58.test.js (56 MB heap size)
 PASS  reproduce/a39.test.js (55 MB heap size)
 PASS  reproduce/a89.test.js (62 MB heap size)
 PASS  reproduce/a173.test.js (62 MB heap size)
 PASS  reproduce/a190.test.js (69 MB heap size)
 PASS  reproduce/a4.test.js (50 MB heap size)
 PASS  reproduce/a50.test.js (57 MB heap size)
 PASS  reproduce/a169.test.js (58 MB heap size)
 PASS  reproduce/a55.test.js (60 MB heap size)
 PASS  reproduce/a131.test.js (66 MB heap size)
 PASS  reproduce/a179.test.js (73 MB heap size)
 PASS  reproduce/a105.test.js (71 MB heap size)
 PASS  reproduce/a159.test.js (77 MB heap size)
 PASS  reproduce/a111.test.js (77 MB heap size)
 PASS  reproduce/a168.test.js (84 MB heap size)
 PASS  reproduce/a14.test.js (83 MB heap size)
 PASS  reproduce/a41.test.js (90 MB heap size)
 PASS  reproduce/a44.test.js (89 MB heap size)
 PASS  reproduce/a162.test.js (96 MB heap size)
 PASS  reproduce/a98.test.js (95 MB heap size)
 PASS  reproduce/a.test.js (102 MB heap size)
 PASS  reproduce/a16.test.js (101 MB heap size)
 PASS  reproduce/a46.test.js (108 MB heap size)
 PASS  reproduce/a75.test.js (107 MB heap size)
 PASS  reproduce/a91.test.js (95 MB heap size)
 PASS  reproduce/a7.test.js (102 MB heap size)
 PASS  reproduce/a76.test.js (101 MB heap size)
 PASS  reproduce/a49.test.js (108 MB heap size)
 PASS  reproduce/a141.test.js (109 MB heap size)
 PASS  reproduce/a67.test.js (115 MB heap size)
 PASS  reproduce/a135.test.js (115 MB heap size)
 PASS  reproduce/a17.test.js (122 MB heap size)
 PASS  reproduce/a116.test.js (121 MB heap size)
 PASS  reproduce/a129.test.js (128 MB heap size)
 PASS  reproduce/a107.test.js (127 MB heap size)
 PASS  reproduce/a117.test.js (134 MB heap size)
 PASS  reproduce/a30.test.js (133 MB heap size)
 PASS  reproduce/a177.test.js (140 MB heap size)
 PASS  reproduce/a92.test.js (140 MB heap size)
 PASS  reproduce/a32.test.js (146 MB heap size)
 PASS  reproduce/a166.test.js (146 MB heap size)
 PASS  reproduce/a83.test.js (153 MB heap size)
 PASS  reproduce/a10.test.js (152 MB heap size)
 PASS  reproduce/a45.test.js (158 MB heap size)
 PASS  reproduce/a9.test.js (158 MB heap size)
 PASS  reproduce/a61.test.js (165 MB heap size)
 PASS  reproduce/a79.test.js (164 MB heap size)
 PASS  reproduce/a24.test.js (171 MB heap size)
 PASS  reproduce/a165.test.js (170 MB heap size)
 PASS  reproduce/a64.test.js (177 MB heap size)
 PASS  reproduce/a29.test.js (176 MB heap size)
 PASS  reproduce/a80.test.js (183 MB heap size)
 PASS  reproduce/a181.test.js (183 MB heap size)
 PASS  reproduce/a167.test.js (190 MB heap size)
 PASS  reproduce/a123.test.js (189 MB heap size)
 PASS  reproduce/a149.test.js (196 MB heap size)
 PASS  reproduce/a182.test.js (195 MB heap size)
 PASS  reproduce/a62.test.js (202 MB heap size)
 PASS  reproduce/a26.test.js (202 MB heap size)
 PASS  reproduce/a136.test.js (208 MB heap size)
 PASS  reproduce/a97.test.js (208 MB heap size)
 PASS  reproduce/a134.test.js (214 MB heap size)
 PASS  reproduce/a25.test.js (214 MB heap size)
 PASS  reproduce/a84.test.js (220 MB heap size)
 PASS  reproduce/a171.test.js (220 MB heap size)
 PASS  reproduce/a161.test.js (226 MB heap size)
 PASS  reproduce/a178.test.js (226 MB heap size)
 PASS  reproduce/a31.test.js (233 MB heap size)
 PASS  reproduce/a128.test.js (232 MB heap size)
 PASS  reproduce/a121.test.js (238 MB heap size)
 PASS  reproduce/a42.test.js (238 MB heap size)
 PASS  reproduce/a20.test.js (245 MB heap size)
 PASS  reproduce/a115.test.js (244 MB heap size)
 PASS  reproduce/a183.test.js (251 MB heap size)
 PASS  reproduce/a59.test.js (250 MB heap size)
 PASS  reproduce/a158.test.js (257 MB heap size)
 PASS  reproduce/a82.test.js (256 MB heap size)
 PASS  reproduce/a5.test.js (263 MB heap size)
 PASS  reproduce/a148.test.js (263 MB heap size)
 PASS  reproduce/a150.test.js (269 MB heap size)
 PASS  reproduce/a140.test.js (269 MB heap size)
 PASS  reproduce/a23.test.js (275 MB heap size)
 PASS  reproduce/a104.test.js (275 MB heap size)
 PASS  reproduce/a48.test.js (282 MB heap size)
 PASS  reproduce/a93.test.js (281 MB heap size)
 PASS  reproduce/a86.test.js (288 MB heap size)
 PASS  reproduce/a127.test.js (287 MB heap size)
 PASS  reproduce/a1.test.js (294 MB heap size)
 PASS  reproduce/a68.test.js (293 MB heap size)
 PASS  reproduce/a78.test.js (300 MB heap size)
 PASS  reproduce/a56.test.js (299 MB heap size)
 PASS  reproduce/a34.test.js (306 MB heap size)
 PASS  reproduce/a189.test.js (306 MB heap size)
 PASS  reproduce/a139.test.js (312 MB heap size)
 PASS  reproduce/a193.test.js (198 MB heap size)
 PASS  reproduce/a151.test.js (205 MB heap size)
 PASS  reproduce/a40.test.js (212 MB heap size)
 PASS  reproduce/a77.test.js (210 MB heap size)
 PASS  reproduce/a96.test.js (212 MB heap size)
 PASS  reproduce/a36.test.js (219 MB heap size)
 PASS  reproduce/a118.test.js (218 MB heap size)
 PASS  reproduce/a108.test.js (225 MB heap size)
 PASS  reproduce/a37.test.js (225 MB heap size)
 PASS  reproduce/a196.test.js (232 MB heap size)
 PASS  reproduce/a184.test.js (231 MB heap size)
 PASS  reproduce/a147.test.js (238 MB heap size)
 PASS  reproduce/a164.test.js (238 MB heap size)
 PASS  reproduce/a174.test.js (244 MB heap size)
 PASS  reproduce/a188.test.js (244 MB heap size)
 PASS  reproduce/a198.test.js (250 MB heap size)
 PASS  reproduce/a22.test.js (250 MB heap size)
 PASS  reproduce/a133.test.js (257 MB heap size)
 PASS  reproduce/a132.test.js (257 MB heap size)
 PASS  reproduce/a200.test.js (264 MB heap size)
 PASS  reproduce/a176.test.js (264 MB heap size)
 PASS  reproduce/a187.test.js (271 MB heap size)
 PASS  reproduce/a72.test.js (270 MB heap size)
 PASS  reproduce/a145.test.js (276 MB heap size)
 PASS  reproduce/a126.test.js (276 MB heap size)
 PASS  reproduce/a87.test.js (282 MB heap size)
 PASS  reproduce/a47.test.js (282 MB heap size)
 PASS  reproduce/a185.test.js (289 MB heap size)
 PASS  reproduce/a3.test.js (288 MB heap size)
 PASS  reproduce/a53.test.js (295 MB heap size)
 PASS  reproduce/a199.test.js (294 MB heap size)
 PASS  reproduce/a43.test.js (301 MB heap size)
 PASS  reproduce/a142.test.js (300 MB heap size)
 PASS  reproduce/a88.test.js (307 MB heap size)
 PASS  reproduce/a120.test.js (306 MB heap size)
 PASS  reproduce/a21.test.js (313 MB heap size)
 PASS  reproduce/a180.test.js (312 MB heap size)
 PASS  reproduce/a74.test.js (319 MB heap size)
 PASS  reproduce/a90.test.js (319 MB heap size)
 PASS  reproduce/a52.test.js (325 MB heap size)
 PASS  reproduce/a143.test.js (325 MB heap size)
 PASS  reproduce/a153.test.js (331 MB heap size)
 PASS  reproduce/a66.test.js (331 MB heap size)
 PASS  reproduce/a114.test.js (338 MB heap size)
 PASS  reproduce/a192.test.js (337 MB heap size)
 PASS  reproduce/a197.test.js (344 MB heap size)
 PASS  reproduce/a163.test.js (343 MB heap size)
 PASS  reproduce/a155.test.js (350 MB heap size)
 PASS  reproduce/a54.test.js (349 MB heap size)
 PASS  reproduce/a137.test.js (356 MB heap size)
 PASS  reproduce/a154.test.js (355 MB heap size)
 PASS  reproduce/a18.test.js (362 MB heap size)
 PASS  reproduce/a186.test.js (362 MB heap size)
 PASS  reproduce/a109.test.js (368 MB heap size)
 PASS  reproduce/a119.test.js (368 MB heap size)
 PASS  reproduce/a73.test.js (374 MB heap size)
 PASS  reproduce/a63.test.js (374 MB heap size)
 PASS  reproduce/a172.test.js (380 MB heap size)
 PASS  reproduce/a11.test.js (380 MB heap size)
 PASS  reproduce/a57.test.js (386 MB heap size)
 PASS  reproduce/a2.test.js (386 MB heap size)
 PASS  reproduce/a85.test.js (392 MB heap size)
 PASS  reproduce/a194.test.js (392 MB heap size)
 PASS  reproduce/a71.test.js (398 MB heap size)
 PASS  reproduce/a170.test.js (398 MB heap size)
 PASS  reproduce/a102.test.js (405 MB heap size)
 PASS  reproduce/a12.test.js (404 MB heap size)
 PASS  reproduce/a60.test.js (411 MB heap size)
 PASS  reproduce/a103.test.js (410 MB heap size)
 PASS  reproduce/a70.test.js (417 MB heap size)
 PASS  reproduce/a125.test.js (416 MB heap size)
 PASS  reproduce/a6.test.js (306 MB heap size)
 PASS  reproduce/a152.test.js (313 MB heap size)
 PASS  reproduce/a106.test.js (320 MB heap size)
 PASS  reproduce/a65.test.js (318 MB heap size)
 PASS  reproduce/a38.test.js (324 MB heap size)
 PASS  reproduce/a28.test.js (324 MB heap size)
 PASS  reproduce/a81.test.js (331 MB heap size)
 PASS  reproduce/a138.test.js (331 MB heap size)
 PASS  reproduce/a191.test.js (337 MB heap size)
 PASS  reproduce/a99.test.js (337 MB heap size)
 PASS  reproduce/a33.test.js (344 MB heap size)
 PASS  reproduce/a122.test.js (344 MB heap size)
 PASS  reproduce/a15.test.js (350 MB heap size)
 PASS  reproduce/a101.test.js (349 MB heap size)
 PASS  reproduce/a8.test.js (356 MB heap size)
 PASS  reproduce/a27.test.js (356 MB heap size)
 PASS  reproduce/a144.test.js (362 MB heap size)
 PASS  reproduce/a110.test.js (362 MB heap size)
 PASS  reproduce/a100.test.js (368 MB heap size)
 PASS  reproduce/a124.test.js (368 MB heap size)
 PASS  reproduce/a95.test.js (374 MB heap size)
 PASS  reproduce/a160.test.js (374 MB heap size)
 PASS  reproduce/a13.test.js (381 MB heap size)
 PASS  reproduce/a112.test.js (380 MB heap size)
 PASS  reproduce/a195.test.js (387 MB heap size)
 PASS  reproduce/a94.test.js (386 MB heap size)
 PASS  reproduce/a113.test.js (393 MB heap size)
 PASS  reproduce/a157.test.js (392 MB heap size)
 PASS  reproduce/a69.test.js (399 MB heap size)
 PASS  reproduce/a130.test.js (398 MB heap size)
 PASS  reproduce/a175.test.js (405 MB heap size)
 PASS  reproduce/a51.test.js (405 MB heap size)
 PASS  reproduce/a35.test.js (411 MB heap size)
 PASS  reproduce/a146.test.js (411 MB heap size)

Test Suites: 201 passed, 201 total
Tests:       201 passed, 201 total
Snapshots:   0 total
Time:        19.276 s

After (against this branch):

% yarn jest --runInBand --logHeapUsage reproduce
 PASS  reproduce/a19.test.js (49 MB heap size)
 PASS  reproduce/a168.test.js (55 MB heap size)
 PASS  reproduce/a179.test.js (53 MB heap size)
 PASS  reproduce/a169.test.js (58 MB heap size)
 PASS  reproduce/a190.test.js (58 MB heap size)
 PASS  reproduce/a41.test.js (63 MB heap size)
 PASS  reproduce/a156.test.js (63 MB heap size)
 PASS  reproduce/a14.test.js (40 MB heap size)
 PASS  reproduce/a111.test.js (46 MB heap size)
 PASS  reproduce/a135.test.js (52 MB heap size)
 PASS  reproduce/a150.test.js (50 MB heap size)
 PASS  reproduce/a147.test.js (55 MB heap size)
 PASS  reproduce/a107.test.js (55 MB heap size)
 PASS  reproduce/a140.test.js (61 MB heap size)
 PASS  reproduce/a127.test.js (61 MB heap size)
 PASS  reproduce/a37.test.js (67 MB heap size)
 PASS  reproduce/a46.test.js (66 MB heap size)
 PASS  reproduce/a91.test.js (72 MB heap size)
 PASS  reproduce/a44.test.js (72 MB heap size)
 PASS  reproduce/a118.test.js (77 MB heap size)
 PASS  reproduce/a9.test.js (82 MB heap size)
 PASS  reproduce/a79.test.js (82 MB heap size)
 PASS  reproduce/a80.test.js (87 MB heap size)
 PASS  reproduce/a177.test.js (88 MB heap size)
 PASS  reproduce/a59.test.js (93 MB heap size)
 PASS  reproduce/a162.test.js (92 MB heap size)
 PASS  reproduce/a68.test.js (98 MB heap size)
 PASS  reproduce/a75.test.js (98 MB heap size)
 PASS  reproduce/a139.test.js (103 MB heap size)
 PASS  reproduce/a165.test.js (108 MB heap size)
 PASS  reproduce/a29.test.js (108 MB heap size)
 PASS  reproduce/a42.test.js (113 MB heap size)
 PASS  reproduce/a96.test.js (114 MB heap size)
 PASS  reproduce/a184.test.js (119 MB heap size)
 PASS  reproduce/a171.test.js (119 MB heap size)
 PASS  reproduce/a199.test.js (125 MB heap size)
 PASS  reproduce/a98.test.js (125 MB heap size)
 PASS  reproduce/a31.test.js (130 MB heap size)
 PASS  reproduce/a16.test.js (130 MB heap size)
 PASS  reproduce/a39.test.js (135 MB heap size)
 PASS  reproduce/a131.test.js (43 MB heap size)
 PASS  reproduce/a121.test.js (48 MB heap size)
 PASS  reproduce/a153.test.js (54 MB heap size)
 PASS  reproduce/a76.test.js (52 MB heap size)
 PASS  reproduce/a183.test.js (57 MB heap size)
 PASS  reproduce/a23.test.js (58 MB heap size)
 PASS  reproduce/a104.test.js (64 MB heap size)
 PASS  reproduce/a67.test.js (63 MB heap size)
 PASS  reproduce/a163.test.js (68 MB heap size)
 PASS  reproduce/a26.test.js (68 MB heap size)
 PASS  reproduce/a18.test.js (74 MB heap size)
 PASS  reproduce/a196.test.js (79 MB heap size)
 PASS  reproduce/a172.test.js (78 MB heap size)
 PASS  reproduce/a124.test.js (84 MB heap size)
 PASS  reproduce/a2.test.js (84 MB heap size)
 PASS  reproduce/a95.test.js (89 MB heap size)
 PASS  reproduce/a112.test.js (90 MB heap size)
 PASS  reproduce/a94.test.js (95 MB heap size)
 PASS  reproduce/a12.test.js (96 MB heap size)
 PASS  reproduce/a174.test.js (101 MB heap size)
 PASS  reproduce/a.test.js (101 MB heap size)
 PASS  reproduce/a64.test.js (106 MB heap size)
 PASS  reproduce/a117.test.js (106 MB heap size)
 PASS  reproduce/a128.test.js (111 MB heap size)
 PASS  reproduce/a181.test.js (117 MB heap size)
 PASS  reproduce/a115.test.js (116 MB heap size)
 PASS  reproduce/a5.test.js (122 MB heap size)
 PASS  reproduce/a32.test.js (122 MB heap size)
 PASS  reproduce/a22.test.js (127 MB heap size)
 PASS  reproduce/a133.test.js (128 MB heap size)
 PASS  reproduce/a132.test.js (133 MB heap size)
 PASS  reproduce/a182.test.js (133 MB heap size)
 PASS  reproduce/a58.test.js (138 MB heap size)
 PASS  reproduce/a159.test.js (42 MB heap size)
 PASS  reproduce/a197.test.js (48 MB heap size)
 PASS  reproduce/a86.test.js (53 MB heap size)
 PASS  reproduce/a62.test.js (52 MB heap size)
 PASS  reproduce/a72.test.js (57 MB heap size)
 PASS  reproduce/a36.test.js (58 MB heap size)
 PASS  reproduce/a137.test.js (63 MB heap size)
 PASS  reproduce/a136.test.js (62 MB heap size)
 PASS  reproduce/a126.test.js (68 MB heap size)
 PASS  reproduce/a45.test.js (68 MB heap size)
 PASS  reproduce/a109.test.js (73 MB heap size)
 PASS  reproduce/a110.test.js (78 MB heap size)
 PASS  reproduce/a78.test.js (78 MB heap size)
 PASS  reproduce/a185.test.js (83 MB heap size)
 PASS  reproduce/a125.test.js (84 MB heap size)
 PASS  reproduce/a69.test.js (89 MB heap size)
 PASS  reproduce/a130.test.js (90 MB heap size)
 PASS  reproduce/a120.test.js (95 MB heap size)
 PASS  reproduce/a106.test.js (95 MB heap size)
 PASS  reproduce/a65.test.js (101 MB heap size)
 PASS  reproduce/a81.test.js (101 MB heap size)
 PASS  reproduce/a180.test.js (107 MB heap size)
 PASS  reproduce/a74.test.js (107 MB heap size)
 PASS  reproduce/a191.test.js (112 MB heap size)
 PASS  reproduce/a7.test.js (112 MB heap size)
 PASS  reproduce/a188.test.js (117 MB heap size)
 PASS  reproduce/a20.test.js (117 MB heap size)
 PASS  reproduce/a198.test.js (123 MB heap size)
 PASS  reproduce/a143.test.js (128 MB heap size)
 PASS  reproduce/a66.test.js (127 MB heap size)
 PASS  reproduce/a148.test.js (133 MB heap size)
 PASS  reproduce/a151.test.js (133 MB heap size)
 PASS  reproduce/a50.test.js (138 MB heap size)
 PASS  reproduce/a4.test.js (41 MB heap size)
 PASS  reproduce/a15.test.js (47 MB heap size)
 PASS  reproduce/a176.test.js (52 MB heap size)
 PASS  reproduce/a83.test.js (50 MB heap size)
 PASS  reproduce/a8.test.js (55 MB heap size)
 PASS  reproduce/a155.test.js (57 MB heap size)
 PASS  reproduce/a108.test.js (62 MB heap size)
 PASS  reproduce/a1.test.js (61 MB heap size)
 PASS  reproduce/a144.test.js (66 MB heap size)
 PASS  reproduce/a87.test.js (71 MB heap size)
 PASS  reproduce/a11.test.js (71 MB heap size)
 PASS  reproduce/a35.test.js (76 MB heap size)
 PASS  reproduce/a170.test.js (77 MB heap size)
 PASS  reproduce/a13.test.js (82 MB heap size)
 PASS  reproduce/a102.test.js (82 MB heap size)
 PASS  reproduce/a195.test.js (88 MB heap size)
 PASS  reproduce/a161.test.js (87 MB heap size)
 PASS  reproduce/a157.test.js (93 MB heap size)
 PASS  reproduce/a34.test.js (93 MB heap size)
 PASS  reproduce/a6.test.js (98 MB heap size)
 PASS  reproduce/a53.test.js (103 MB heap size)
 PASS  reproduce/a152.test.js (103 MB heap size)
 PASS  reproduce/a21.test.js (108 MB heap size)
 PASS  reproduce/a17.test.js (107 MB heap size)
 PASS  reproduce/a28.test.js (113 MB heap size)
 PASS  reproduce/a129.test.js (113 MB heap size)
 PASS  reproduce/a175.test.js (118 MB heap size)
 PASS  reproduce/a90.test.js (124 MB heap size)
 PASS  reproduce/a52.test.js (123 MB heap size)
 PASS  reproduce/a99.test.js (128 MB heap size)
 PASS  reproduce/a30.test.js (128 MB heap size)
 PASS  reproduce/a89.test.js (133 MB heap size)
 PASS  reproduce/a105.test.js (42 MB heap size)
 PASS  reproduce/a193.test.js (47 MB heap size)
 PASS  reproduce/a158.test.js (53 MB heap size)
 PASS  reproduce/a123.test.js (51 MB heap size)
 PASS  reproduce/a114.test.js (57 MB heap size)
 PASS  reproduce/a77.test.js (57 MB heap size)
 PASS  reproduce/a200.test.js (63 MB heap size)
 PASS  reproduce/a166.test.js (61 MB heap size)
 PASS  reproduce/a192.test.js (67 MB heap size)
 PASS  reproduce/a149.test.js (67 MB heap size)
 PASS  reproduce/a10.test.js (72 MB heap size)
 PASS  reproduce/a145.test.js (78 MB heap size)
 PASS  reproduce/a54.test.js (77 MB heap size)
 PASS  reproduce/a27.test.js (83 MB heap size)
 PASS  reproduce/a154.test.js (83 MB heap size)
 PASS  reproduce/a119.test.js (88 MB heap size)
 PASS  reproduce/a186.test.js (89 MB heap size)
 PASS  reproduce/a63.test.js (94 MB heap size)
 PASS  reproduce/a97.test.js (94 MB heap size)
 PASS  reproduce/a100.test.js (99 MB heap size)
 PASS  reproduce/a25.test.js (99 MB heap size)
 PASS  reproduce/a146.test.js (104 MB heap size)
 PASS  reproduce/a71.test.js (110 MB heap size)
 PASS  reproduce/a103.test.js (109 MB heap size)
 PASS  reproduce/a113.test.js (115 MB heap size)
 PASS  reproduce/a24.test.js (114 MB heap size)
 PASS  reproduce/a3.test.js (119 MB heap size)
 PASS  reproduce/a178.test.js (119 MB heap size)
 PASS  reproduce/a189.test.js (125 MB heap size)
 PASS  reproduce/a142.test.js (130 MB heap size)
 PASS  reproduce/a164.test.js (129 MB heap size)
 PASS  reproduce/a138.test.js (135 MB heap size)
 PASS  reproduce/a49.test.js (134 MB heap size)
 PASS  reproduce/a82.test.js (140 MB heap size)
 PASS  reproduce/a141.test.js (139 MB heap size)
 PASS  reproduce/a51.test.js (145 MB heap size)
 PASS  reproduce/a122.test.js (150 MB heap size)
 PASS  reproduce/a187.test.js (150 MB heap size)
 PASS  reproduce/a173.test.js (155 MB heap size)
 PASS  reproduce/a55.test.js (41 MB heap size)
 PASS  reproduce/a57.test.js (47 MB heap size)
 PASS  reproduce/a160.test.js (52 MB heap size)
 PASS  reproduce/a84.test.js (50 MB heap size)
 PASS  reproduce/a60.test.js (56 MB heap size)
 PASS  reproduce/a70.test.js (57 MB heap size)
 PASS  reproduce/a43.test.js (62 MB heap size)
 PASS  reproduce/a116.test.js (61 MB heap size)
 PASS  reproduce/a38.test.js (66 MB heap size)
 PASS  reproduce/a92.test.js (66 MB heap size)
 PASS  reproduce/a40.test.js (72 MB heap size)
 PASS  reproduce/a33.test.js (77 MB heap size)
 PASS  reproduce/a48.test.js (77 MB heap size)
 PASS  reproduce/a101.test.js (82 MB heap size)
 PASS  reproduce/a93.test.js (82 MB heap size)
 PASS  reproduce/a73.test.js (87 MB heap size)
 PASS  reproduce/a134.test.js (87 MB heap size)
 PASS  reproduce/a47.test.js (93 MB heap size)
 PASS  reproduce/a85.test.js (98 MB heap size)
 PASS  reproduce/a194.test.js (97 MB heap size)
 PASS  reproduce/a61.test.js (102 MB heap size)
 PASS  reproduce/a56.test.js (103 MB heap size)
 PASS  reproduce/a88.test.js (108 MB heap size)
 PASS  reproduce/a167.test.js (108 MB heap size)

Test Suites: 201 passed, 201 total
Tests:       201 passed, 201 total
Snapshots:   0 total
Time:        15.093 s, estimated 18 s

rthreei avatar Dec 31 '21 16:12 rthreei

Hi @rthreei!

Thank you for your pull request and welcome to our community.

Action Required

In order to merge any pull request (code, docs, etc.), we require contributors to sign our Contributor License Agreement, and we don't seem to have one on file for you.

Process

In order for us to review and merge your suggested changes, please sign at https://code.facebook.com/cla. If you are contributing on behalf of someone else (eg your employer), the individual CLA may not be sufficient and your employer may need to sign the corporate CLA.

Once the CLA is signed, our tooling will perform checks and validations. Afterwards, the pull request will be tagged with CLA signed. The tagging process may take up to 1 hour after signing. Please give it that time before contacting us about it.

If you have received this in error or have any questions, please contact us at [email protected]. Thanks!

facebook-github-bot avatar Dec 31 '21 16:12 facebook-github-bot

Codecov Report

Merging #12205 (790a026) into main (0f99ff5) will increase coverage by 0.02%. The diff coverage is 66.66%.

Impacted file tree graph

@@            Coverage Diff             @@
##             main   #12205      +/-   ##
==========================================
+ Coverage   67.51%   67.54%   +0.02%     
==========================================
  Files         328      328              
  Lines       17246    17228      -18     
  Branches     5071     5067       -4     
==========================================
- Hits        11644    11637       -7     
+ Misses       5569     5556      -13     
- Partials       33       35       +2     
Impacted Files Coverage Δ
packages/jest-runtime/src/index.ts 56.37% <66.66%> (-0.10%) :arrow_down:
...provider-v8/cjs-native-without-sourcemap/module.js 75.00% <0.00%> (-4.17%) :arrow_down:
packages/expect/src/utils.ts 96.53% <0.00%> (+0.49%) :arrow_up:
...e-provider-v8/cjs-with-babel-transformer/module.ts 96.15% <0.00%> (+15.38%) :arrow_up:

Continue to review full report at Codecov.

Legend - Click here to learn more Δ = absolute <relative> (impact), ø = not affected, ? = missing data Powered by Codecov. Last update 0f99ff5...790a026. Read the comment docs.

codecov-commenter avatar Dec 31 '21 18:12 codecov-commenter

Thank you for signing our Contributor License Agreement. We can now accept your code for this (and any) Meta Open Source project. Thanks!

facebook-github-bot avatar Dec 31 '21 19:12 facebook-github-bot

What needs to happen to get this over the finish line?

vanstinator avatar Feb 24 '22 15:02 vanstinator

What needs to happen to get this over the finish line?

I guess @SimenB has some doubts about this?

Smrtnyk avatar Feb 26 '22 11:02 Smrtnyk

Main reason is that this will make it much worse for node 12 and 14, and it's really a bug in node

SimenB avatar Feb 26 '22 11:02 SimenB

Can we make it an opt-in change with a cli flag? I'm happy to do the work and update the tests. With node 14 going EOL this fall more people are going to be looking to move to 16 (including us at Plex). A cli flag would make the move much less painful. When node fixes their bug we can remove the option from jest again when it makes sense

vanstinator avatar Feb 26 '22 12:02 vanstinator

I don't think we should add a config flag - if we do this we should just detect the version of node inline so people don't have to change anything.

Maybe you could change this to use semver and detect broken versions (>= 16.11.0 I guess?), and if not broken use current code? Sorta similar to https://github.com/facebook/jest/blob/7826a8f15be07b2634add73a50decf73086e5948/packages/test-utils/src/ConditionalTest.ts#L37

SimenB avatar Feb 26 '22 12:02 SimenB

Sure, that approach works too. I'll open a fresh PR based on this one when I'm ready. Thanks for the quick brainstorm!

vanstinator avatar Feb 26 '22 12:02 vanstinator

Is there anything I can do to get this PR moving along again? We generally try to avoid falling too far behind even minor versions

phawxby avatar Apr 14 '22 12:04 phawxby

@phawxby nothing new since the last activity, feel free to fix: https://github.com/facebook/jest/pull/12205#discussion_r815307518

SimenB avatar Apr 17 '22 08:04 SimenB

@phawxby nothing new since the last activity, feel free to fix: #12205 (comment)

As you noted in the thread above, the importModuleDynamically issue could be a different bug. Would a way to handle this be to accept this PR but with importModuleDynamically implemented with the memory leak as it's not a regression in performance, for many will be a significant improvement. The importModuleDynamically memory leak issue can then be tackled separately?

phawxby avatar Apr 19 '22 12:04 phawxby

@phawxby nothing new since the last activity, feel free to fix: #12205 (comment)

As you noted in the thread above, the importModuleDynamically issue could be a different bug. Would a way to handle this be to accept this PR but with importModuleDynamically implemented with the memory leak as it's not a regression in performance, for many will be a significant improvement. The importModuleDynamically memory leak issue can then be tackled separately?

importModuleDynamically being implemented voids the improvement, so that doesn't help. Unless you're seeing that it does help?

rthreei avatar Apr 19 '22 12:04 rthreei

@phawxby nothing new since the last activity, feel free to fix: #12205 (comment)

As you noted in the thread above, the importModuleDynamically issue could be a different bug. Would a way to handle this be to accept this PR but with importModuleDynamically implemented with the memory leak as it's not a regression in performance, for many will be a significant improvement. The importModuleDynamically memory leak issue can then be tackled separately?

importModuleDynamically being implemented voids the improvement, so that doesn't help. Unless you're seeing that it does help?

Ah, I misunderstood your comment as the issue only occurs when importing esm from cjs, not in all scenarios. I'm going to have a dig around this afternoon and see if I can find anything but I'm not holding out much hope.

phawxby avatar Apr 19 '22 12:04 phawxby

A bit more digging and I've found this, which suggests this isn't going to be especially easy to fix. https://github.com/nodejs/node/issues/25424#issuecomment-770216256

Which then ties in with this. https://bugs.chromium.org/p/v8/issues/detail?id=12198

phawxby avatar Apr 19 '22 15:04 phawxby

Instead of using a patch, one thing that can be done is to extend the default jest-runtime and override _execModule. It can be passed as runtime in configuration (renamed from moduleLoader in Jest 28).

https://github.com/facebook/jest/blob/f43871e37f8bf6dbe292ad2e52f4781868c4731b/packages/jest-runner/src/runTest.ts#L117-L121

While _execModule is private (by convention), it's not literally private at runtime (i.e. using #), so overriding should be fine.

const {default: JestRuntime} = require('jest-runtime');

module.exports = class CompileFunctionRuntime extends JestRuntime {
  _execModule() {
    // do something
  }
};

This module could then be published as a workaround. Somewhat brittle as _execModule isn't public API, but less brittle than applying a patch 🙂

SimenB avatar Apr 27 '22 11:04 SimenB

@a88zach has published https://github.com/reside-eng/jest-runtime which does what @SimenB suggested in the last comment. This unblocked us from upgrading to Node > 16.10.

See https://github.com/facebook/jest/issues/11956#issuecomment-1148857787.

blimmer avatar Jun 08 '22 18:06 blimmer

Hey to understand does this issue manifest without any gc() calls?

benjamingr avatar Jul 28 '22 11:07 benjamingr

Same as @blimmer, I can confirm that https://github.com/reside-eng/jest-runtime (which is basically this PR as a workaround, using @SimenB's suggestion in this comment) significantly alleviates the memory leaking problems.

I have a medium-sized TypeScript project transformed with @swc/jest containing around 500 test cases that used to take up a massive 5.2 GB of RAM to run from start to finish, but now takes "only" 2.6 GB, effectively halving the RAM usage of Jest.

bvobart avatar Feb 17 '23 10:02 bvobart

Same as @blimmer, I can confirm that https://github.com/reside-eng/jest-runtime (which is basically this PR as a workaround, using @SimenB's suggestion in this comment) significantly alleviates the memory leaking problems.

I have a medium-sized TypeScript project transformed with @swc/jest containing around 500 test cases that used to take up a massive 5.2 GB of RAM to run from start to finish, but now takes "only" 2.6 GB, effectively halving the RAM usage of Jest.

I've just tried the fixed runtime as well. Tests ended with 1.8GB of ram instead of 6GB.

fknop avatar Mar 11 '23 22:03 fknop

Hi @rthreei , Using side/jest-runtime we are seeing improvement in performance and memory usage. It is still 30% slower than node 16.10. Any clue if anything can be done. Without side/jest-runtime there is degradation for 100%

sunilsurana avatar Sep 01 '23 15:09 sunilsurana

In NodeJS v18.17.1 the heap increases from 118Mb to 5815MB and total runtime runInBand + logHeapUsage is 187sec using @side/jest-runtime the heap decreased to 5467 MB and total runtime runInBand + logHeapUsage is 165sec

:/

Havunen avatar Oct 05 '23 05:10 Havunen

Node landed a fix for vm.Script a few hours ago. Hopefully it'll be backported all the way to Node 18.

SimenB avatar Oct 05 '23 06:10 SimenB

NodeJs v20.8.0 running:

    "test": "cross-env NODE_OPTIONS=--max-old-space-size=8192 node --experimental-vm-modules ./node_modules/jest/bin/jest.js --config=jest.config.js --no-watchman --runInBand --logHeapUsage --ci",
  transform: {
    '\\.ts$': '@swc/jest',
    '\\.vue$': '<rootDir>/node_modules/vue2-swc-jest',
  },
  runtime: '@side/jest-runtime',

Bumps heap size from 125Mb to 5601 MB heap size (execution time 166 sec )

Removing runtime: '@side/jest-runtime', -setting:

Bumps heap size to 5778 MB ( execution time 178sec )

removing the runInBand and logHeapUsage with runtime: '@side/jest-runtime', 44sec without runtime: '@side/jest-runtime', 44.613sec

However not having --runInBand the memory usage is even more expensive and in dev ops cheap machines the computer is starwing... image

Havunen avatar Oct 05 '23 08:10 Havunen

I'm starting to feel that there is some other memory leak issue as well, it feels like Jest keeps the test data in memory until the whole run is finished

Havunen avatar Oct 05 '23 08:10 Havunen

@Havunen this fix (https://github.com/nodejs/node/pull/49950#event-10556827669) isn't in node 20.8.0. next week 20.9.0 should get released. maybe this fixes some of the memory problems

ximex avatar Oct 05 '23 09:10 ximex

@ximex is the fix available in any nightly / preview release? I would like to test if it solves this issue

Havunen avatar Oct 05 '23 09:10 Havunen

I'm not the expert for this. but i think so if you try the todays nightly version

ximex avatar Oct 05 '23 10:10 ximex

https://github.com/jestjs/jest/issues/11956#issuecomment-1741000133

SimenB avatar Oct 05 '23 10:10 SimenB

https://github.com/jestjs/jest/issues/11956#issuecomment-1741000133

I tried it but it does not seem to change anything? runtimeSupportsVmModules is true so it always sets the callback anyway?

Havunen avatar Oct 05 '23 10:10 Havunen