Android: `HttpClient$FutureShim` JNI references are never released after requests complete, leading to a reference-table overflow abort
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 4/5
- Temps estimé
- 1-2 jours
- Accessibilité débutants
- 48/100
Piste de recherche
Start in lib/http/HttpClient_Android.cpp and trace SendRequestAsync, dispatchCallback, CallbackForCancel, and CancelAllRequests, checking how JNI local and global references are released on completion and cancellation. Reproduce the reported reference growth with the heap dump steps in the issue, then verify completed, cancelled, and failed requests release their references.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
Summary
On Android, completed com.microsoft.applications.events.HttpClient$FutureShim objects (the FutureTask created by createTask) build up as JNI GC roots and are never released. Over a long session this approaches ART's 51,200-entry JNI reference limit and the process aborts with JNI ERROR (app bug): global reference table overflow in HttpClient_Android::SendRequestAsync.
Environment
- SDK: maesdk
3.10.40.1(a Teams-specific build based on this repo) - Device: Samsung SM-A146B, Android 15 (API 35)
Repro
- Run an app that sends 1DS telemetry over the default Android
HttpClient. - Force a GC, capture a heap dump, and count
HttpClient$FutureShiminstances. - Generate normal activity and let queued uploads finish.
- Force a GC and capture a second heap dump. Leave the app idle for 3 minutes and capture a third.
Expected: after completion, cancellation or failure, FutureShim instances become collectable and the count falls back toward baseline.
Actual: the count only goes up across heap dumps taken after a forced GC: 2,194 → 2,587 → 2,607.
- Every inspected instance is already complete:
FutureTask.state == 2, andcallable,runnerandwaitersare all null. - Representative instances are held directly by
ROOT_JNI_LOCALroots. - Crash evidence from the field shows about 50,257
FutureShimreferences at the time of the reference-table overflow abort.
Suspected cause (lib/http/HttpClient_Android.cpp)
SendRequestAsync:result = env->PopLocalFrame(result)hands back a new local reference in the caller's frame, and nothing ever callsDeleteLocalRefon it. These calls run on native threads that are attached and never detached, so local references are never freed automatically. That matches theROOT_JNI_LOCALroots we see.- The global reference:
m_java_request = env->NewGlobalRef(result)is released only in~HttpRequest(). Any path that removes the request fromm_requestswithout destroying theHttpRequestwould keep the global reference alive. Those paths aredispatchCallback→GetAndRemoveRequest,CallbackForCancelandCancelAllRequests. - Minor:
CallbackForCancelleaks the local reference returned byGetObjectClass.
Suggested fix
- Call
DeleteLocalRef(result)afterexecuteTaskand on the cancel path. - Release
m_java_requestwithDeleteGlobalRefas soon as the request reaches a final state (success, cancel, retry replacement, or error/early return), rather than relying on theHttpRequestdestructor. - Optionally wrap request sends in
PushLocalFrame/PopLocalFrameon persistently attached threads.
Workaround
None on the app side. The leaked references are owned by the SDK, and an app cannot safely release them.
- Langage dominant
- C
- Étoiles
- 104
- Forks
- 67
- Merge moyen
- 2 j 12 h
- PR mergées (30 j)
- 8
Préparer son environnement
Ce projet ne fournit ni conteneur de développement, ni Dockerfile, ni guide de contribution : l'installation est à votre charge. Commencez par son README, et consultez notre guide de la première contribution pour les étapes générales.
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de microsoft/cpp_client_telemetry
-
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
microsoft/cpp_client_telemetry#1550 ·
-
C API enhancement
Difficulté 2/5 1-3 heures Accessibilité débutants 62/100
-
OneDS C++ SDK retries already-ingested iOS events, causing duplicate telemetry recordsPeut-être pris @bmehta001 l’a pris il y a 24 jours. Ouvertebug
Difficulté 5/5 Plus d'une semaine Accessibilité débutants 35/100
microsoft/cpp_client_telemetry#1542 · 3 commentaires · 1 personne assignée ·
-
Difficulté 5/5 Plus d'une semaine Accessibilité débutants 35/100
microsoft/cpp_client_telemetry#1504 ·
-
Dropping of telemetry eventsOuvertebug
Difficulté 4/5 3-5 jours Accessibilité débutants 25/100
microsoft/cpp_client_telemetry#1413 · 2 commentaires ·
Toutes les issues de microsoft/cpp_client_telemetry
Issues similaires
-
bug
Difficulté 2/5 1-3 heures Accessibilité débutants 85/100
-
build help wanted new feature
Difficulté 2/5 1-3 heures Accessibilité débutants 85/100
AOMediaCodec/SVT-AV1#2516 · 2 commentaires ·
-
Windows ARM memory-leakOuvertebug docs performance
Difficulté 1/5 Moins d'une heure Accessibilité débutants 85/100
Les mainteneurs répondent en général sous 3 jours
-
enhancement
Difficulté 2/5 1-3 heures Accessibilité débutants 70/100
toniebox-reverse-engineering/teddycloud#561 ·
Les mainteneurs répondent en général sous 1 jour
-
bug goto-symex
Difficulté 2/5 1-3 heures Accessibilité débutants 83/100
Les mainteneurs répondent en général sous 1 jour