bumptech / glide

An image loading and caching library for Android focused on smooth scrolling
https://bumptech.github.io/glide/
Other
34.56k stars 6.11k forks source link

Fatal Exception: java.lang.IllegalStateException: Cannot recycle a resource while it is still acquired #4507

Open ayyaztalat opened 3 years ago

ayyaztalat commented 3 years ago

I am currently using Glide version : 4.11.0 implementation 'com.github.bumptech.glide:glide:4.11.0' annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'

Cannot recycle a resource while it is still acquired com.bumptech.glide.load.engine.EngineResource.recycle (EngineResource.java:68) com.bumptech.glide.load.engine.ResourceRecycler$ResourceRecyclerCallback.handleMessage (ResourceRecycler.java:37) android.os.Handler.dispatchMessage (Handler.java:103) android.os.Looper.loop (Looper.java:227) android.app.ActivityThread.main (ActivityThread.java:7822) java.lang.reflect.Method.invoke (Method.java) com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:492) com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1026)

mkocus commented 2 years ago

We've got exactly the same issue. It seems that the glide crashes randomly on production - this issue cannot be replicated locally.

Full stack log:

Fatal Exception: java.lang.IllegalStateException: Cannot recycle a resource while it is still acquired
       at com.bumptech.glide.load.engine.EngineResource.recycle(EngineResource.java:68)
       at com.bumptech.glide.load.engine.ResourceRecycler$ResourceRecyclerCallback.handleMessage(ResourceRecycler.java:37)
       at android.os.Handler.dispatchMessage(Handler.java:102)
       at android.os.Looper.loop(Looper.java:193)
       at android.app.ActivityThread.main(ActivityThread.java:6680)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

Environment:

Do you have any ideas how to debug this issue?

ayyaztalat commented 2 years ago

For my case i have invalidate my current bitmap clear glide cache and then reassigned bitmap thus it solved the problem but the main problem it arrose. It slowed down the loading of receyclerview images

On Tue, Nov 2, 2021, 2:44 PM mkocus @.***> wrote:

We've got exactly the same issue. It seems that the glide crashes randomly on production - this issue cannot be replicated locally.

Full stack log:

Fatal Exception: java.lang.IllegalStateException: Cannot recycle a resource while it is still acquired at com.bumptech.glide.load.engine.EngineResource.recycle(EngineResource.java:68) at com.bumptech.glide.load.engine.ResourceRecycler$ResourceRecyclerCallback.handleMessage(ResourceRecycler.java:37) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:193) at android.app.ActivityThread.main(ActivityThread.java:6680) at java.lang.reflect.Method.invoke(Method.java) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

Environment:

  • Android 9
  • Glide 4.12.0

Do you have any ideas how to debug this issue?

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub https://github.com/bumptech/glide/issues/4507#issuecomment-957273856, or unsubscribe https://github.com/notifications/unsubscribe-auth/AHXVZCUHA6A5IGWTDHFYW63UJ6XJTANCNFSM4YB6LR3A . Triage notifications on the go with GitHub Mobile for iOS https://apps.apple.com/app/apple-store/id1477376905?ct=notification-email&mt=8&pt=524675 or Android https://play.google.com/store/apps/details?id=com.github.android&referrer=utm_campaign%3Dnotification-email%26utm_medium%3Demail%26utm_source%3Dgithub.

mkocus commented 2 years ago

Well, we are using glide a lot and cannot locate where precisely this crash happen :/ The steps that you are proposing are totally destructive - clearing glide cache all the time basically kills the performance and is a no-go for us.

ayyaztalat commented 2 years ago

I didn't say clear cache from everyone just from the glide which is used inside the receyclerview However if you can solve the actual problem.it is inside the cache it doesn't let to update the cache which changes in iteration behavior which causes the crash as what i observe

On Tue, Nov 2, 2021, 2:59 PM mkocus @.***> wrote:

Well, we are using glide a lot and cannot locate where precisely this crash happen :/ The steps that you are proposing are totally destructive - clearing glide cache all the time basically kills the performance and is a no-go for us.

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub https://github.com/bumptech/glide/issues/4507#issuecomment-957284961, or unsubscribe https://github.com/notifications/unsubscribe-auth/AHXVZCUTMYTKEXVZ6K76AKDUJ6ZBVANCNFSM4YB6LR3A . Triage notifications on the go with GitHub Mobile for iOS https://apps.apple.com/app/apple-store/id1477376905?ct=notification-email&mt=8&pt=524675 or Android https://play.google.com/store/apps/details?id=com.github.android&referrer=utm_campaign%3Dnotification-email%26utm_medium%3Demail%26utm_source%3Dgithub.

mkocus commented 2 years ago

Of course, but this is what I have in mind - we just don't want to clear glide cache.

ayyaztalat commented 2 years ago

Cool, thanks!

On Tue, Nov 2, 2021, 3:05 PM mkocus @.***> wrote:

Of course, but this is what I have in mind - we just don't want to clear glide cache.

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub https://github.com/bumptech/glide/issues/4507#issuecomment-957289392, or unsubscribe https://github.com/notifications/unsubscribe-auth/AHXVZCQ36CWM4FPEFKV5UF3UJ6ZXHANCNFSM4YB6LR3A . Triage notifications on the go with GitHub Mobile for iOS https://apps.apple.com/app/apple-store/id1477376905?ct=notification-email&mt=8&pt=524675 or Android https://play.google.com/store/apps/details?id=com.github.android&referrer=utm_campaign%3Dnotification-email%26utm_medium%3Demail%26utm_source%3Dgithub.

mkocus commented 2 years ago

We still didn't managed to fix this issue. Do you have a knowledge when the glide tries to recycle resource? The stacktrace only shows that this is an async code which receives message to recycle resource - but who sent it and why?

TWiStErRob commented 10 months ago

I think with a modification shown in https://github.com/bumptech/glide/pull/5310, it would be possible to diagnose this further. But I think that PR is not production ready to be merged to Glide.

If you want to investigate this further, one thing I could recommend is hacking the Glide Engine to use this recycler in the PR to be able to see where the recycle is being called from, which might reveal further leads to fix this. To do this, one would need the following setup:

// put this in a LibraryGlideModule:
val engine = Glide::class.java.getDeclaredField("engine").apply { isAccessible = true }.get(glide) as Engine
val modifiedRecycler = InstanceOfResourceRecyclerFromPR()
Engine::class.java.getDeclaredField("resourceRecycler").apply { isAccessible = true }.set(engine, modifiedRecycler)
// If there's ProGuard/R8 add keep rules for the accessed fields.

Note: if we have a repro, things would change a lot, but from what I see in these two issues, there's inconclusive evidence. Out of curiosity how many crashes of this are there in the wild?

cc @lyjSmile @hpdx @ayyaztalat @mkocus

EzequielAdrianM commented 7 months ago

Galaxy A20 Android 11 The crash doesn't point to any specific line of code in the application.

Fatal Exception: java.lang.IllegalStateException: Cannot recycle a resource while it is still acquired
       at com.bumptech.glide.load.engine.EngineResource.recycle(EngineResource.java:68)
       at com.bumptech.glide.load.engine.ResourceRecycler$ResourceRecyclerCallback.handleMessage(ResourceRecycler.java:37)
       at android.os.Handler.dispatchMessage(Handler.java:102)
       at android.os.Looper.loop(Looper.java:246)
       at android.app.ActivityThread.main(ActivityThread.java:8645)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)