Add handling of OutOfMemoryException to runtime metrics polyfill#8609
Conversation
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 347590c5f5
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| if (e.Exception is OutOfMemoryException) | ||
| { | ||
| // We have a special path for OOM because we can't allocate | ||
| // Doing anything here is liable to throw exceptions | ||
| return; |
There was a problem hiding this comment.
Count OOM exceptions instead of dropping them
On .NET 6-8, this polyfill is the source of the OpenTelemetry dotnet.exceptions runtime metric, but this fast path returns before recording anything for OutOfMemoryException. The existing runtime metrics writer handles the same low-memory case by incrementing a preallocated counter (RuntimeMetricsWriter.FirstChanceException), so after this change OOM throws become invisible only for the polyfilled System.Runtime meter even though the instrument is documented here as counting exceptions thrown in managed code. Please keep an allocation-safe count/tag for OOMs rather than skipping them.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
But what are we supposed to do with that count eh? eh AI? What do you say to that? Also, you wrote this yourself, so don't give me any of that sass
BenchmarksBenchmark execution time: 2026-05-12 14:39:04 Comparing candidate commit d054d9b in PR branch Some scenarios are present only in baseline or only in candidate runs. If you didn't create or remove some scenarios in your branch, this maybe a sign of crashed benchmarks 💥💥💥 Scenarios present only in baseline:
Found 3 performance improvements and 4 performance regressions! Performance is the same for 49 metrics, 16 unstable metrics, 85 known flaky benchmarks, 41 flaky benchmarks without significant changes.
|
Execution-Time Benchmarks Report ⏱️Execution-time results for samples comparing This PR (8609) and master.
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Metric | Master (Mean ± 95% CI) | Current (Mean ± 95% CI) | Change | Status |
|---|---|---|---|---|
| .NET Framework 4.8 - Baseline | ||||
| duration | 196.85 ± (196.57 - 197.53) ms | 209.01 ± (208.56 - 209.42) ms | +6.2% | ❌⬆️ |
| .NET Framework 4.8 - Bailout | ||||
| duration | 198.71 ± (198.52 - 199.19) ms | 212.60 ± (212.34 - 213.04) ms | +7.0% | ❌⬆️ |
Full Metrics Comparison
FakeDbCommand
| Metric | Master (Mean ± 95% CI) | Current (Mean ± 95% CI) | Change | Status |
|---|---|---|---|---|
| .NET Framework 4.8 - Baseline | ||||
| duration | 72.43 ± (72.51 - 72.83) ms | 72.69 ± (72.72 - 73.09) ms | +0.4% | ✅⬆️ |
| .NET Framework 4.8 - Bailout | ||||
| duration | 79.27 ± (79.27 - 79.89) ms | 79.34 ± (79.33 - 79.96) ms | +0.1% | ✅⬆️ |
| .NET Framework 4.8 - CallTarget+Inlining+NGEN | ||||
| duration | 1095.78 ± (1094.83 - 1101.18) ms | 1099.36 ± (1097.32 - 1104.91) ms | +0.3% | ✅⬆️ |
| .NET Core 3.1 - Baseline | ||||
| process.internal_duration_ms | 22.64 ± (22.58 - 22.70) ms | 22.66 ± (22.62 - 22.70) ms | +0.1% | ✅⬆️ |
| process.time_to_main_ms | 85.61 ± (85.27 - 85.95) ms | 84.95 ± (84.77 - 85.12) ms | -0.8% | ✅ |
| runtime.dotnet.exceptions.count | 0 ± (0 - 0) | 0 ± (0 - 0) | +0.0% | ✅ |
| runtime.dotnet.mem.committed | 10.92 ± (10.92 - 10.92) MB | 10.93 ± (10.92 - 10.93) MB | +0.1% | ✅⬆️ |
| runtime.dotnet.threads.count | 12 ± (12 - 12) | 12 ± (12 - 12) | +0.0% | ✅ |
| .NET Core 3.1 - Bailout | ||||
| process.internal_duration_ms | 22.71 ± (22.65 - 22.77) ms | 22.64 ± (22.60 - 22.68) ms | -0.3% | ✅ |
| process.time_to_main_ms | 88.65 ± (88.29 - 89.00) ms | 88.30 ± (87.99 - 88.60) ms | -0.4% | ✅ |
| runtime.dotnet.exceptions.count | 0 ± (0 - 0) | 0 ± (0 - 0) | +0.0% | ✅ |
| runtime.dotnet.mem.committed | 10.96 ± (10.96 - 10.96) MB | 10.96 ± (10.95 - 10.96) MB | -0.0% | ✅ |
| runtime.dotnet.threads.count | 13 ± (13 - 13) | 13 ± (13 - 13) | +0.0% | ✅ |
| .NET Core 3.1 - CallTarget+Inlining+NGEN | ||||
| process.internal_duration_ms | 212.39 ± (211.53 - 213.24) ms | 213.45 ± (212.63 - 214.26) ms | +0.5% | ✅⬆️ |
| process.time_to_main_ms | 536.46 ± (535.01 - 537.91) ms | 537.12 ± (535.78 - 538.46) ms | +0.1% | ✅⬆️ |
| runtime.dotnet.exceptions.count | 0 ± (0 - 0) | 0 ± (0 - 0) | +0.0% | ✅ |
| runtime.dotnet.mem.committed | 48.33 ± (48.29 - 48.36) MB | 48.29 ± (48.26 - 48.32) MB | -0.1% | ✅ |
| runtime.dotnet.threads.count | 28 ± (28 - 28) | 28 ± (28 - 28) | -0.0% | ✅ |
| .NET 6 - Baseline | ||||
| process.internal_duration_ms | 21.10 ± (21.05 - 21.14) ms | 21.20 ± (21.15 - 21.24) ms | +0.5% | ✅⬆️ |
| process.time_to_main_ms | 73.43 ± (73.22 - 73.63) ms | 73.93 ± (73.70 - 74.16) ms | +0.7% | ✅⬆️ |
| runtime.dotnet.exceptions.count | 0 ± (0 - 0) | 0 ± (0 - 0) | +0.0% | ✅ |
| runtime.dotnet.mem.committed | 10.60 ± (10.60 - 10.61) MB | 10.63 ± (10.63 - 10.64) MB | +0.3% | ✅⬆️ |
| runtime.dotnet.threads.count | 10 ± (10 - 10) | 10 ± (10 - 10) | +0.0% | ✅ |
| .NET 6 - Bailout | ||||
| process.internal_duration_ms | 21.34 ± (21.28 - 21.40) ms | 21.06 ± (21.01 - 21.11) ms | -1.3% | ✅ |
| process.time_to_main_ms | 76.66 ± (76.43 - 76.90) ms | 74.63 ± (74.45 - 74.81) ms | -2.6% | ✅ |
| runtime.dotnet.exceptions.count | 0 ± (0 - 0) | 0 ± (0 - 0) | +0.0% | ✅ |
| runtime.dotnet.mem.committed | 10.73 ± (10.73 - 10.74) MB | 10.75 ± (10.74 - 10.75) MB | +0.1% | ✅⬆️ |
| runtime.dotnet.threads.count | 11 ± (11 - 11) | 11 ± (11 - 11) | +0.0% | ✅ |
| .NET 6 - CallTarget+Inlining+NGEN | ||||
| process.internal_duration_ms | 377.45 ± (375.36 - 379.54) ms | 378.59 ± (376.66 - 380.53) ms | +0.3% | ✅⬆️ |
| process.time_to_main_ms | 535.20 ± (533.89 - 536.51) ms | 541.36 ± (540.17 - 542.55) ms | +1.2% | ✅⬆️ |
| runtime.dotnet.exceptions.count | 0 ± (0 - 0) | 0 ± (0 - 0) | +0.0% | ✅ |
| runtime.dotnet.mem.committed | 49.87 ± (49.85 - 49.89) MB | 49.86 ± (49.83 - 49.88) MB | -0.0% | ✅ |
| runtime.dotnet.threads.count | 28 ± (28 - 28) | 28 ± (28 - 28) | -0.2% | ✅ |
| .NET 8 - Baseline | ||||
| process.internal_duration_ms | 19.64 ± (19.60 - 19.69) ms | 19.92 ± (19.87 - 19.98) ms | +1.4% | ✅⬆️ |
| process.time_to_main_ms | 73.28 ± (73.08 - 73.48) ms | 75.65 ± (75.38 - 75.91) ms | +3.2% | ✅⬆️ |
| runtime.dotnet.exceptions.count | 0 ± (0 - 0) | 0 ± (0 - 0) | +0.0% | ✅ |
| runtime.dotnet.mem.committed | 7.66 ± (7.66 - 7.67) MB | 7.66 ± (7.66 - 7.67) MB | -0.0% | ✅ |
| runtime.dotnet.threads.count | 10 ± (10 - 10) | 10 ± (10 - 10) | +0.0% | ✅ |
| .NET 8 - Bailout | ||||
| process.internal_duration_ms | 19.43 ± (19.39 - 19.47) ms | 19.69 ± (19.65 - 19.73) ms | +1.3% | ✅⬆️ |
| process.time_to_main_ms | 73.61 ± (73.45 - 73.77) ms | 75.62 ± (75.45 - 75.80) ms | +2.7% | ✅⬆️ |
| runtime.dotnet.exceptions.count | 0 ± (0 - 0) | 0 ± (0 - 0) | +0.0% | ✅ |
| runtime.dotnet.mem.committed | 7.70 ± (7.70 - 7.71) MB | 7.71 ± (7.70 - 7.71) MB | +0.0% | ✅⬆️ |
| runtime.dotnet.threads.count | 11 ± (11 - 11) | 11 ± (11 - 11) | +0.0% | ✅ |
| .NET 8 - CallTarget+Inlining+NGEN | ||||
| process.internal_duration_ms | 293.71 ± (291.46 - 295.97) ms | 294.60 ± (292.13 - 297.06) ms | +0.3% | ✅⬆️ |
| process.time_to_main_ms | 500.67 ± (499.29 - 502.04) ms | 501.89 ± (500.56 - 503.23) ms | +0.2% | ✅⬆️ |
| runtime.dotnet.exceptions.count | 0 ± (0 - 0) | 0 ± (0 - 0) | +0.0% | ✅ |
| runtime.dotnet.mem.committed | 36.88 ± (36.85 - 36.92) MB | 36.90 ± (36.87 - 36.93) MB | +0.0% | ✅⬆️ |
| runtime.dotnet.threads.count | 27 ± (27 - 27) | 27 ± (27 - 27) | -0.1% | ✅ |
HttpMessageHandler
| Metric | Master (Mean ± 95% CI) | Current (Mean ± 95% CI) | Change | Status |
|---|---|---|---|---|
| .NET Framework 4.8 - Baseline | ||||
| duration | 196.85 ± (196.57 - 197.53) ms | 209.01 ± (208.56 - 209.42) ms | +6.2% | ❌⬆️ |
| .NET Framework 4.8 - Bailout | ||||
| duration | 198.71 ± (198.52 - 199.19) ms | 212.60 ± (212.34 - 213.04) ms | +7.0% | ❌⬆️ |
| .NET Framework 4.8 - CallTarget+Inlining+NGEN | ||||
| duration | 1170.01 ± (1170.25 - 1175.93) ms | 1230.62 ± (1230.07 - 1237.44) ms | +5.2% | ✅⬆️ |
| .NET Core 3.1 - Baseline | ||||
| process.internal_duration_ms | 187.39 ± (187.06 - 187.71) ms | 201.50 ± (201.05 - 201.94) ms | +7.5% | ✅⬆️ |
| process.time_to_main_ms | 81.76 ± (81.59 - 81.93) ms | 88.85 ± (88.56 - 89.14) ms | +8.7% | ✅⬆️ |
| runtime.dotnet.exceptions.count | 3 ± (3 - 3) | 3 ± (3 - 3) | +0.0% | ✅ |
| runtime.dotnet.mem.committed | 16.04 ± (16.02 - 16.07) MB | 15.94 ± (15.92 - 15.97) MB | -0.6% | ✅ |
| runtime.dotnet.threads.count | 20 ± (19 - 20) | 20 ± (20 - 20) | +1.2% | ✅⬆️ |
| .NET Core 3.1 - Bailout | ||||
| process.internal_duration_ms | 186.88 ± (186.56 - 187.20) ms | 201.76 ± (201.36 - 202.16) ms | +8.0% | ✅⬆️ |
| process.time_to_main_ms | 83.25 ± (83.11 - 83.38) ms | 90.64 ± (90.50 - 90.79) ms | +8.9% | ✅⬆️ |
| runtime.dotnet.exceptions.count | 3 ± (3 - 3) | 3 ± (3 - 3) | +0.0% | ✅ |
| runtime.dotnet.mem.committed | 16.13 ± (16.10 - 16.16) MB | 15.96 ± (15.94 - 15.98) MB | -1.1% | ✅ |
| runtime.dotnet.threads.count | 21 ± (20 - 21) | 21 ± (21 - 21) | +1.4% | ✅⬆️ |
| .NET Core 3.1 - CallTarget+Inlining+NGEN | ||||
| process.internal_duration_ms | 377.71 ± (376.63 - 378.79) ms | 397.45 ± (396.18 - 398.72) ms | +5.2% | ✅⬆️ |
| process.time_to_main_ms | 519.59 ± (518.46 - 520.72) ms | 554.37 ± (553.25 - 555.49) ms | +6.7% | ✅⬆️ |
| runtime.dotnet.exceptions.count | 3 ± (3 - 3) | 3 ± (3 - 3) | +0.0% | ✅ |
| runtime.dotnet.mem.committed | 57.06 ± (57.00 - 57.12) MB | 59.05 ± (58.98 - 59.12) MB | +3.5% | ✅⬆️ |
| runtime.dotnet.threads.count | 30 ± (30 - 30) | 30 ± (30 - 30) | +1.4% | ✅⬆️ |
| .NET 6 - Baseline | ||||
| process.internal_duration_ms | 191.86 ± (191.52 - 192.20) ms | 206.56 ± (206.09 - 207.02) ms | +7.7% | ✅⬆️ |
| process.time_to_main_ms | 70.81 ± (70.66 - 70.96) ms | 77.11 ± (76.85 - 77.37) ms | +8.9% | ✅⬆️ |
| runtime.dotnet.exceptions.count | 4 ± (4 - 4) | 4 ± (4 - 4) | +0.0% | ✅ |
| runtime.dotnet.mem.committed | 16.22 ± (16.12 - 16.32) MB | 16.27 ± (16.24 - 16.29) MB | +0.3% | ✅⬆️ |
| runtime.dotnet.threads.count | 19 ± (19 - 19) | 20 ± (19 - 20) | +4.0% | ✅⬆️ |
| .NET 6 - Bailout | ||||
| process.internal_duration_ms | 190.81 ± (190.61 - 191.01) ms | 207.16 ± (206.68 - 207.64) ms | +8.6% | ✅⬆️ |
| process.time_to_main_ms | 72.05 ± (71.95 - 72.14) ms | 78.10 ± (77.87 - 78.33) ms | +8.4% | ✅⬆️ |
| runtime.dotnet.exceptions.count | 4 ± (4 - 4) | 4 ± (4 - 4) | +0.0% | ✅ |
| runtime.dotnet.mem.committed | 16.32 ± (16.24 - 16.40) MB | 16.26 ± (16.23 - 16.29) MB | -0.4% | ✅ |
| runtime.dotnet.threads.count | 20 ± (20 - 20) | 20 ± (20 - 20) | +2.9% | ✅⬆️ |
| .NET 6 - CallTarget+Inlining+NGEN | ||||
| process.internal_duration_ms | 590.35 ± (587.13 - 593.56) ms | 596.13 ± (593.60 - 598.67) ms | +1.0% | ✅⬆️ |
| process.time_to_main_ms | 519.73 ± (518.91 - 520.55) ms | 555.13 ± (554.03 - 556.23) ms | +6.8% | ✅⬆️ |
| runtime.dotnet.exceptions.count | 4 ± (4 - 4) | 4 ± (4 - 4) | +0.0% | ✅ |
| runtime.dotnet.mem.committed | 61.18 ± (61.08 - 61.27) MB | 61.54 ± (61.45 - 61.64) MB | +0.6% | ✅⬆️ |
| runtime.dotnet.threads.count | 31 ± (31 - 31) | 31 ± (31 - 31) | +0.2% | ✅⬆️ |
| .NET 8 - Baseline | ||||
| process.internal_duration_ms | 188.75 ± (188.44 - 189.06) ms | 205.40 ± (204.90 - 205.91) ms | +8.8% | ✅⬆️ |
| process.time_to_main_ms | 70.23 ± (70.05 - 70.41) ms | 76.82 ± (76.59 - 77.06) ms | +9.4% | ✅⬆️ |
| runtime.dotnet.exceptions.count | 4 ± (4 - 4) | 4 ± (4 - 4) | +0.0% | ✅ |
| runtime.dotnet.mem.committed | 11.77 ± (11.74 - 11.81) MB | 11.60 ± (11.58 - 11.62) MB | -1.5% | ✅ |
| runtime.dotnet.threads.count | 18 ± (18 - 18) | 19 ± (19 - 19) | +3.4% | ✅⬆️ |
| .NET 8 - Bailout | ||||
| process.internal_duration_ms | 188.43 ± (188.21 - 188.64) ms | 204.88 ± (204.49 - 205.27) ms | +8.7% | ✅⬆️ |
| process.time_to_main_ms | 71.32 ± (71.22 - 71.41) ms | 77.41 ± (77.25 - 77.58) ms | +8.5% | ✅⬆️ |
| runtime.dotnet.exceptions.count | 4 ± (4 - 4) | 4 ± (4 - 4) | +0.0% | ✅ |
| runtime.dotnet.mem.committed | 11.80 ± (11.76 - 11.84) MB | 11.69 ± (11.66 - 11.71) MB | -1.0% | ✅ |
| runtime.dotnet.threads.count | 19 ± (19 - 19) | 20 ± (20 - 20) | +3.4% | ✅⬆️ |
| .NET 8 - CallTarget+Inlining+NGEN | ||||
| process.internal_duration_ms | 510.64 ± (507.91 - 513.38) ms | 515.22 ± (511.46 - 518.97) ms | +0.9% | ✅⬆️ |
| process.time_to_main_ms | 478.34 ± (477.61 - 479.07) ms | 511.30 ± (510.45 - 512.16) ms | +6.9% | ✅⬆️ |
| runtime.dotnet.exceptions.count | 4 ± (4 - 4) | 4 ± (4 - 4) | +0.0% | ✅ |
| runtime.dotnet.mem.committed | 50.55 ± (50.52 - 50.59) MB | 50.68 ± (50.62 - 50.74) MB | +0.3% | ✅⬆️ |
| runtime.dotnet.threads.count | 29 ± (29 - 29) | 30 ± (30 - 30) | +2.1% | ✅⬆️ |
Comparison explanation
Execution-time benchmarks measure the whole time it takes to execute a program, and are intended to measure the one-off costs. Cases where the execution time results for the PR are worse than latest master results are highlighted in **red**. The following thresholds were used for comparing the execution times:
- Welch test with statistical test for significance of 5%
- Only results indicating a difference greater than 5% and 5 ms are considered.
Note that these results are based on a single point-in-time result for each branch. For full results, see the dashboard.
Graphs show the p99 interval based on the mean and StdDev of the test run, as well as the mean value of the run (shown as a diamond below the graph).
Duration charts
FakeDbCommand (.NET Framework 4.8)
gantt
title Execution time (ms) FakeDbCommand (.NET Framework 4.8)
dateFormat x
axisFormat %Q
todayMarker off
section Baseline
This PR (8609) - mean (73ms) : 70, 76
master - mean (73ms) : 70, 75
section Bailout
This PR (8609) - mean (80ms) : 75, 85
master - mean (80ms) : 75, 84
section CallTarget+Inlining+NGEN
This PR (8609) - mean (1,101ms) : 1048, 1154
master - mean (1,098ms) : 1053, 1143
FakeDbCommand (.NET Core 3.1)
gantt
title Execution time (ms) FakeDbCommand (.NET Core 3.1)
dateFormat x
axisFormat %Q
todayMarker off
section Baseline
This PR (8609) - mean (115ms) : 112, 118
master - mean (115ms) : 109, 122
section Bailout
This PR (8609) - mean (118ms) : 112, 125
master - mean (119ms) : 112, 125
section CallTarget+Inlining+NGEN
This PR (8609) - mean (788ms) : 757, 819
master - mean (787ms) : 762, 813
FakeDbCommand (.NET 6)
gantt
title Execution time (ms) FakeDbCommand (.NET 6)
dateFormat x
axisFormat %Q
todayMarker off
section Baseline
This PR (8609) - mean (102ms) : 99, 105
master - mean (101ms) : 97, 105
section Bailout
This PR (8609) - mean (102ms) : 100, 105
master - mean (105ms) : 100, 109
section CallTarget+Inlining+NGEN
This PR (8609) - mean (951ms) : 912, 990
master - mean (942ms) : 911, 973
FakeDbCommand (.NET 8)
gantt
title Execution time (ms) FakeDbCommand (.NET 8)
dateFormat x
axisFormat %Q
todayMarker off
section Baseline
This PR (8609) - mean (104ms) : 99, 108
master - mean (101ms) : 96, 105
section Bailout
This PR (8609) - mean (103ms) : 100, 106
master - mean (101ms) : 98, 104
section CallTarget+Inlining+NGEN
This PR (8609) - mean (827ms) : 788, 866
master - mean (828ms) : 779, 877
HttpMessageHandler (.NET Framework 4.8)
gantt
title Execution time (ms) HttpMessageHandler (.NET Framework 4.8)
dateFormat x
axisFormat %Q
todayMarker off
section Baseline
This PR (8609) - mean (209ms) : 204, 214
master - mean (197ms) : 192, 202
section Bailout
This PR (8609) - mean (213ms) : crit, 209, 216
master - mean (199ms) : 196, 202
section CallTarget+Inlining+NGEN
This PR (8609) - mean (1,234ms) : 1178, 1289
master - mean (1,173ms) : 1133, 1214
HttpMessageHandler (.NET Core 3.1)
gantt
title Execution time (ms) HttpMessageHandler (.NET Core 3.1)
dateFormat x
axisFormat %Q
todayMarker off
section Baseline
This PR (8609) - mean (300ms) : 294, 307
master - mean (278ms) : 274, 281
section Bailout
This PR (8609) - mean (302ms) : crit, 296, 308
master - mean (279ms) : 275, 283
section CallTarget+Inlining+NGEN
This PR (8609) - mean (995ms) : crit, 970, 1021
master - mean (940ms) : 923, 957
HttpMessageHandler (.NET 6)
gantt
title Execution time (ms) HttpMessageHandler (.NET 6)
dateFormat x
axisFormat %Q
todayMarker off
section Baseline
This PR (8609) - mean (293ms) : 285, 300
master - mean (271ms) : 267, 275
section Bailout
This PR (8609) - mean (294ms) : crit, 288, 300
master - mean (271ms) : 269, 273
section CallTarget+Inlining+NGEN
This PR (8609) - mean (1,182ms) : 1126, 1237
master - mean (1,138ms) : 1085, 1190
HttpMessageHandler (.NET 8)
gantt
title Execution time (ms) HttpMessageHandler (.NET 8)
dateFormat x
axisFormat %Q
todayMarker off
section Baseline
This PR (8609) - mean (294ms) : 285, 302
master - mean (269ms) : 264, 274
section Bailout
This PR (8609) - mean (293ms) : crit, 287, 299
master - mean (269ms) : 266, 272
section CallTarget+Inlining+NGEN
This PR (8609) - mean (1,060ms) : 1005, 1115
master - mean (1,021ms) : 979, 1064
347590c to
439fa78
Compare
Summary of changes
Adds explicit handling of
OutOfMemoryExceptionto runtime metrics polyfill added in #8457Reason for change
Doing anything when you have an
OutOfMemoryExceptionis liable to cause allocation, and trigger a full-on crash. We have guards for this today inRuntimeMetricsWriter, so we should probably do something similar with our pollyfill too.Implementation details
OutOfMemoryException_handlingFirstChanceExceptionTest coverage
Not easy to test in practice, and relatively self explanatory so meh