Skip to content

Use a field for GC references #2435

Description

@jonpryor

Currently, the Java Callable Wrappers use an ArrayList and methods to help mirror the object graph from the Mono GC to the Android GC:

/* partial */ class Example {
    ArrayList<Object> managedReferences = new ArrayList<Object>();
    public void monodroidAddReference (Object o) {
        managedReferences.add (o);
    }
    public void monodroidClearReferences () {
        managedReferences.clear ();
    }
}

monodroidAddReference() and monodroidClearReferences() are called via JNI within osbridge.cc:

https://github.com/xamarin/xamarin-android/blob/c38c58e9c5634819845350e9e687186c0808a781/src/monodroid/jni/osbridge.cc#L581-L587

An idea occurred to me: what if instead of invoking monodroidAddReference()/etc., we instead used a field?

/* partial */ class Example {
    Object []managedReferences;
}

This would reduce Java-side memory allocations (no ArrayList<Object>), and would alter the number of JNI invocations needed, from num_xrefs JNIEnv::CallVoidMethod() invocations to num_xrefs calls to JNIEnv::SetObjectArrayElement() + 1 JNIEnv::SetObjectField(). (Presumably JNIEnv::SetObjectArrayElement() will be faster than JNIEnv::CallVoidMethod().)

https://github.com/xamarin/xamarin-android/blob/c38c58e9c5634819845350e9e687186c0808a781/src/monodroid/jni/osbridge.cc#L798-L806

Activity

  1. added this to the far future milestone on Nov 16, 2018
  2. added
    enhancementProposed change to current functionality.
    and removed on Dec 1, 2022
  3. dotnet-policy-service commented on May 8, 2026

    @dotnet-policy-service

    We suspect this issue is stale and no longer relevant. It will be closed if no further activity occurs within 14 more days. Any new comment (by anyone, not necessarily the author) will undo this process.

  4. dotnet-policy-service commented on May 22, 2026

    @dotnet-policy-service

    This issue will now be closed since it had been marked "possibly-stale" but received no further activity in the past 14 days. It is still possible to reopen or comment on the issue, but please note that the issue will be locked if it remains inactive for another 30 days.

  5. locked and limited conversation to collaborators on Jun 22, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Area: App RuntimeIssues in `libmonodroid.so`.Area: PerformanceIssues with performance.enhancementProposed change to current functionality.possibly-staleIssues that are potentially no longer relevant.

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions