Skip to content

perf: Collect performance data on shared timer executor (JAVA-653)#5816

Draft
runningcode wants to merge 2 commits into
mainfrom
no/perf/perf-collector-shared-executor
Draft

perf: Collect performance data on shared timer executor (JAVA-653)#5816
runningcode wants to merge 2 commits into
mainfrom
no/perf/perf-collector-shared-executor

Conversation

@runningcode

@runningcode runningcode commented Jul 22, 2026

Copy link
Copy Markdown
Contributor

📜 Description

DefaultCompositePerformanceCollector created a java.util.Timer (a dedicated thread) whenever performance collection started, and cancelled it when the last transaction finished — so every burst of transactions created and destroyed a thread. The periodic 100ms collection now runs on the shared timer executor (SentryOptions#getTimerExecutorService):

  • Each collection run reschedules itself after TRANSACTION_COLLECTION_INTERVAL_MILLIS, reproducing Timer's fixed-delay behavior.
  • A generation counter (guarded by the existing lock) makes sure an in-flight run doesn't reschedule itself after close() — including when the run itself stops a timed-out transaction and thereby closes the collector.
  • close() cancels the pending tick via Future#cancel(false), matching the previous Timer#cancel() semantics.

💡 Motivation and Context

Part of reducing the number of threads created by the SDK: JAVA-653.

Apps with tracing enabled paid for a thread creation/destruction cycle per transaction burst, plus a live extra thread while transactions ran. The shared timer executor's single worker is reused across all timeouts and self-terminates when idle.

💚 How did you test it?

Existing unit tests, adapted from Timer-mock verifications to the executor/future model (DefaultCompositePerformanceCollectorTest), plus SentryTracerTest and AndroidOptionsInitializerTest.

📝 Checklist

  • I added GH Issue ID & Linear ID
  • I added tests to verify the changes.
  • No new PII added or SDK only sends newly added PII if sendDefaultPII is enabled.
  • I updated the docs if needed.
  • I updated the wizard if needed.
  • Review from the native team if needed.
  • No breaking change or entry added to the changelog.
  • No breaking change for hybrid SDKs or communicated to hybrid SDKs.

🔮 Next steps

Related PRs in this effort: RateLimiter (#5814), LifecycleWatcher (#5819), HostnameCache (#5817), batch processors (#5818).

🤖 Generated with Claude Code

@linear-code

linear-code Bot commented Jul 22, 2026

Copy link
Copy Markdown

JAVA-653

@sentry

sentry Bot commented Jul 22, 2026

Copy link
Copy Markdown

📲 Install Builds

Android

🔗 App Name App ID Version Configuration
SDK Size io.sentry.tests.size 8.50.0 (1) release

⚙️ sentry-android Build Distribution Settings

runningcode and others added 2 commits July 22, 2026 17:53
DefaultCompositePerformanceCollector created a java.util.Timer thread
for every burst of transactions and destroyed it when the last one
finished. Schedule the periodic collection on the shared timer executor
instead: each run reschedules itself, and a generation counter prevents
an in-flight run from rescheduling after the collection was stopped.
This removes both the extra thread and the per-transaction thread
churn.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@runningcode
runningcode force-pushed the no/perf/perf-collector-shared-executor branch from a2a9803 to 4a2f00f Compare July 22, 2026 15:53
@github-actions

Copy link
Copy Markdown
Contributor

Performance metrics 🚀

  Plain With Sentry Diff
Startup time 357.18 ms 490.18 ms 133.00 ms
Size 0 B 0 B 0 B

Baseline results on branch: main

Startup times

Revision Plain With Sentry Diff
eb95ded 317.51 ms 369.08 ms 51.57 ms
2124a46 319.19 ms 415.04 ms 95.85 ms
c3ee041 310.64 ms 361.90 ms 51.26 ms
dcc6bbf 382.58 ms 462.13 ms 79.54 ms
7a19fee 315.46 ms 368.62 ms 53.16 ms
9054d65 330.94 ms 403.24 ms 72.30 ms
d500866 326.13 ms 378.70 ms 52.58 ms
ad8da22 365.86 ms 427.00 ms 61.14 ms
ed33deb 337.52 ms 484.06 ms 146.54 ms
d15471f 310.26 ms 377.04 ms 66.78 ms

App size

Revision Plain With Sentry Diff
eb95ded 0 B 0 B 0 B
2124a46 1.58 MiB 2.12 MiB 551.51 KiB
c3ee041 0 B 0 B 0 B
dcc6bbf 1.58 MiB 2.12 MiB 553.10 KiB
7a19fee 0 B 0 B 0 B
9054d65 1.58 MiB 2.29 MiB 723.38 KiB
d500866 0 B 0 B 0 B
ad8da22 1.58 MiB 2.29 MiB 719.83 KiB
ed33deb 1.58 MiB 2.13 MiB 559.52 KiB
d15471f 1.58 MiB 2.13 MiB 559.54 KiB

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.

1 participant