jest
jest copied to clipboard
chore: replace `vm.Script` with `vm.compileFunction`
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
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!
Codecov Report
Merging #12205 (790a026) into main (0f99ff5) will increase coverage by
0.02%
. The diff coverage is66.66%
.
@@ 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.
Thank you for signing our Contributor License Agreement. We can now accept your code for this (and any) Meta Open Source project. Thanks!
What needs to happen to get this over the finish line?
What needs to happen to get this over the finish line?
I guess @SimenB has some doubts about this?
Main reason is that this will make it much worse for node 12 and 14, and it's really a bug in node
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
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
Sure, that approach works too. I'll open a fresh PR based on this one when I'm ready. Thanks for the quick brainstorm!
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 nothing new since the last activity, feel free to fix: https://github.com/facebook/jest/pull/12205#discussion_r815307518
@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 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 withimportModuleDynamically
implemented with the memory leak as it's not a regression in performance, for many will be a significant improvement. TheimportModuleDynamically
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?
@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 withimportModuleDynamically
implemented with the memory leak as it's not a regression in performance, for many will be a significant improvement. TheimportModuleDynamically
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.
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
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 🙂
@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.
Hey to understand does this issue manifest without any gc()
calls?
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.
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.
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%
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
:/
Node landed a fix for vm.Script
a few hours ago. Hopefully it'll be backported all the way to Node 18.
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...
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 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 is the fix available in any nightly / preview release? I would like to test if it solves this issue
I'm not the expert for this. but i think so if you try the todays nightly version
https://github.com/jestjs/jest/issues/11956#issuecomment-1741000133
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?