Skip to content

perf: Let HostnameCache worker thread idle out (JAVA-653)#5817

Draft
runningcode wants to merge 2 commits into
mainfrom
no/perf/hostname-cache-idle-thread
Draft

perf: Let HostnameCache worker thread idle out (JAVA-653)#5817
runningcode wants to merge 2 commits into
mainfrom
no/perf/hostname-cache-idle-thread

Conversation

@runningcode

@runningcode runningcode commented Jul 22, 2026

Copy link
Copy Markdown
Contributor

📜 Description

HostnameCache created its worker with Executors.newSingleThreadExecutor, whose thread stays alive for the entire process lifetime — even though the cache only refreshes once every 5 hours (and the hostname lookup runs for at most 1 second). It now uses a ThreadPoolExecutor (core = max = 1) with a 30s keep-alive and allowCoreThreadTimeOut(true), so the worker thread self-terminates when idle and is recreated on the next refresh.

The cache keeps its own dedicated executor rather than sharing the SDK-wide one on purpose: updateCache() blocks on future.get(1s), and running that on a shared executor could spuriously time out when the executor is busy with other work.

💡 Motivation and Context

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

On the JVM, any app that sends events with attachServerName enabled (the default off Android) kept this thread alive 24/7 for what is effectively one DNS lookup every 5 hours.

💚 How did you test it?

New HostnameCacheTest asserting the executor is configured to time out its core thread, plus the existing MainEventProcessorTest hostname coverage.

📝 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), performance collector (#5816), 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
HostnameCache used Executors.newSingleThreadExecutor, whose worker
thread stays alive for the life of the process even though the cache
refreshes at most once every 5 hours. Use a ThreadPoolExecutor with a
keep-alive and allowCoreThreadTimeOut(true) so the thread terminates
when idle and is recreated on the next refresh. Keeping a dedicated
executor (rather than sharing one) preserves the blocking
future.get(1s) timeout behavior.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@runningcode
runningcode force-pushed the no/perf/hostname-cache-idle-thread branch from b0b4168 to b03da86 Compare July 22, 2026 15:53
@github-actions

Copy link
Copy Markdown
Contributor

Performance metrics 🚀

  Plain With Sentry Diff
Startup time 313.40 ms 375.26 ms 61.86 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