Skip to content

fix(init): Reduce allocations and bytecode instructions during Sentry.init#5135

Open
romtsn wants to merge 5 commits intomainfrom
rz/fix/init-allocations
Open

fix(init): Reduce allocations and bytecode instructions during Sentry.init#5135
romtsn wants to merge 5 commits intomainfrom
rz/fix/init-allocations

Conversation

@romtsn
Copy link
Member

@romtsn romtsn commented Mar 2, 2026

Reduces unnecessary allocations and bytecode instructions during Sentry.init to improve startup performance, particularly on Android.

Key changes:

  • Activate options earlier on Android: Calls options.activate() at the end of AndroidOptionsInitializer.loadDefaultAndMetadataOptions() so the executor service is available sooner — before integrations like AndroidConnectionStatusProvider try to use it
  • Use executor service in AssetsModulesLoader: Replaces new Thread(() -> getOrLoadModules()).start() with the shared executor service, avoiding an extra thread allocation during init
  • Move SpotlightIntegration loading into activate(): Moves the reflective class loading from the SentryOptions constructor into activate(), so it only runs when options are actually used
  • Remove redundant Objects.requireNonNull checks: Several internal constructors (MainEventProcessor, DuplicateEventDetectionEventProcessor, SentryExceptionFactory, SentryThreadFactory, UncaughtExceptionHandlerIntegration) used Objects.requireNonNull on parameters that are always non-null internal calls. Removing these saves bytecode and allocations on every init
  • Remove unused MainEventProcessor internal constructor: The 3-arg constructor was dead code

@github-actions
Copy link
Contributor

github-actions bot commented Mar 2, 2026

Semver Impact of This PR

🟢 Patch (bug fixes)

📋 Changelog Preview

This is how your changes will appear in the changelog.
Entries from this PR are highlighted with a left border (blockquote style).


New Features ✨

  • (otel) Create sentry-opentelemetry-otlp module for combining OpenTelemetry SDK OTLP export with Sentry SDK by adinauer in #5100
  • (screenshot) Add screenshot masking using view hierarchy by romtsn in #5077

Bug Fixes 🐛

  • (init) Reduce allocations and bytecode instructions during Sentry.init by romtsn in #5135
  • (transport) Handle HTTP 413 with actionable log and use send_error for HTTP errors by adinauer in #5115
  • Trim DSN string before URI parsing by adinauer in #5113
  • Safe unregister SystemEventsBroadcastReceiver by kollesnica1337 in #5106

Internal Changes 🔧

Deps

  • Bump getsentry/craft from 2.21.7 to 2.23.1 by dependabot in #5129
  • Update Native SDK to v0.13.1 by github-actions in #5104
  • Bump actions/upload-artifact from 6 to 7 by dependabot in #5130
  • Bump actions/download-artifact from 7 to 8 by dependabot in #5132
  • Bump gradle/actions from 5.0.1 to 5.0.2 by dependabot in #5131
  • Bump github/codeql-action from 4.32.2 to 4.32.4 by dependabot in #5109
  • Bump getsentry/craft from 2.21.2 to 2.21.7 by dependabot in #5110

🤖 This preview updates automatically when you update the PR.

@romtsn romtsn marked this pull request as ready for review March 2, 2026 13:50
Copy link

@cursor cursor bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

@github-actions
Copy link
Contributor

github-actions bot commented Mar 2, 2026

Performance metrics 🚀

  Plain With Sentry Diff
Startup time 315.31 ms 338.60 ms 23.29 ms
Size 1.58 MiB 2.29 MiB 723.46 KiB

Baseline results on branch: main

Startup times

Revision Plain With Sentry Diff
e59e22a 329.74 ms 383.31 ms 53.57 ms
fc5ccaf 270.49 ms 363.90 ms 93.41 ms
d15471f 361.89 ms 378.07 ms 16.18 ms
d15471f 322.58 ms 396.08 ms 73.50 ms
abfcc92 304.04 ms 370.33 ms 66.29 ms
91bb874 310.68 ms 359.24 ms 48.56 ms
ab8a72d 316.24 ms 356.38 ms 40.14 ms
d15471f 286.65 ms 314.68 ms 28.03 ms
6727e14 337.22 ms 373.94 ms 36.71 ms
f064536 329.00 ms 395.62 ms 66.62 ms

App size

Revision Plain With Sentry Diff
e59e22a 1.58 MiB 2.20 MiB 635.34 KiB
fc5ccaf 1.58 MiB 2.13 MiB 557.54 KiB
d15471f 1.58 MiB 2.13 MiB 559.54 KiB
d15471f 1.58 MiB 2.13 MiB 559.54 KiB
abfcc92 1.58 MiB 2.13 MiB 557.31 KiB
91bb874 1.58 MiB 2.13 MiB 559.07 KiB
ab8a72d 1.58 MiB 2.12 MiB 551.55 KiB
d15471f 1.58 MiB 2.13 MiB 559.54 KiB
6727e14 1.58 MiB 2.28 MiB 718.64 KiB
f064536 1.58 MiB 2.20 MiB 633.90 KiB

Previous results on branch: rz/fix/init-allocations

Startup times

Revision Plain With Sentry Diff
f17b109 354.11 ms 427.76 ms 73.64 ms

App size

Revision Plain With Sentry Diff
f17b109 1.58 MiB 2.29 MiB 723.30 KiB

Copy link
Member

@adinauer adinauer left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM


readDefaultOptionValues(options, finalContext, buildInfoProvider);
AppState.getInstance().registerLifecycleObserver(options);
options.activate();
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

l this still as a small potential of leaking a thread if we never end up using the options, e.g. due to lower priority and SDK already being initialized. We could invoke InitUtil.shouldInit here to check in case this becomes a problem.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can't really do that since sentry-android-core does not depend on sentry :( I guess will keep it like this, probably it's a rare case

romtsn and others added 5 commits March 3, 2026 00:35
Use AtomicBoolean to ensure activate() only loads SpotlightIntegration
once, so users can remove it in their configuration callback without
it being re-added by the second activate() call from Sentry.init().

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@romtsn romtsn force-pushed the rz/fix/init-allocations branch from 54ef748 to 53c1348 Compare March 2, 2026 23:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants