android
android copied to clipboard
OutOfMemoryError - Nextcloud crashes every time "Media" tab is opened
⚠️ Before posting ⚠️
- [x] This is a bug, not a question or an enhancement.
- [x] I've searched for similar issues and didn't find a duplicate.
- [x] I've written a clear and descriptive title for this issue, not just "Bug" or "Crash".
- [x] I agree to follow Nextcloud's Code of Conduct.
Steps to reproduce
- Open Nextcloud on Android
- Switch to "Media" Tab, app is lagging, a few pictures are loaded (sometimes), but the view is still loading and freezes,
- after about 30 sekunds the app crashes with Callstack shown
https://github.com/user-attachments/assets/49c1e0e3-2780-4647-8674-c36b33047baf
Expected behaviour
App must not crash
Actual behaviour
App is crashing repeatedly, reproducibly, every time.
I have now observed at least two different exception call stacks.
Android version
15
Device brand and model
Samsung Galaxy S23+
Stock or custom OS?
Stock
Nextcloud android app version
3.31.1 - installed from F-Droid due to the Google Permissions affair
Nextcloud server version
30.0.10
Using a reverse proxy?
I don't know
Android logs (via windows with adb.exe and logcat)
Github error Body can not be longer than 65536 characters, logs here: https://pastebin.com/azQgx3Gu
Server error logs
Server is a hosted instance by Hetzner, so no access to logs (?)
Additional information
- Up until recently, the performance of media was "just" unusable, but app did not crash. I've now finished migrating my files to this server.
- Stats:
- ~122000 files in 1700 folders
- ~ 4.64TB
- "Memories" android app is still working
EDIT: Android logs added above.
Crash Info from within app (no touching)
Cause of error
Exception in thread "main" java.lang.OutOfMemoryError: Failed to allocate a 2064 byte allocation with 2076448 free bytes and 2027KB until OOM, target footprint 268435456, growth limit 268435456; giving up on allocation because <1% of heap free after GC.
at com.google.gson.stream.JsonReader.<init>(JsonReader.java:261)
at com.google.gson.Gson.newJsonReader(Gson.java:1078)
at com.google.gson.Gson.fromJson(Gson.java:1261)
at com.google.gson.Gson.fromJson(Gson.java:1171)
at com.google.gson.Gson.fromJson(Gson.java:1107)
at com.owncloud.android.datamodel.FileDataStorageManager.createFileInstance(FileDataStorageManager.java:1309)
at com.owncloud.android.datamodel.FileDataStorageManager.getGalleryItems(FileDataStorageManager.java:2541)
at com.owncloud.android.datamodel.FileDataStorageManager.getAllGalleryItems(FileDataStorageManager.java:2530)
at com.owncloud.android.ui.adapter.GalleryAdapter.showAllGalleryItems(GalleryAdapter.kt:159)
at com.owncloud.android.ui.fragment.GalleryFragment.showAllGalleryItems(GalleryFragment.java:401)
at com.owncloud.android.ui.fragment.GalleryFragment.handleSearchEvent(GalleryFragment.java:246)
at com.owncloud.android.ui.fragment.GalleryFragment.onActivityCreated(GalleryFragment.java:166)
at androidx.fragment.app.Fragment.performActivityCreated(Fragment.java:3161)
at androidx.fragment.app.FragmentStateManager.activityCreated(FragmentStateManager.java:639)
at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:289)
at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:2214)
at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:2109)
at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:2052)
at androidx.fragment.app.FragmentController.execPendingActions(FragmentController.java:496)
at androidx.fragment.app.FragmentActivity.onResume(FragmentActivity.java:311)
at com.owncloud.android.ui.activity.BaseActivity.onResume(BaseActivity.java:115)
at com.owncloud.android.ui.activity.FileActivity.onResume(FileActivity.java:264)
at com.owncloud.android.ui.activity.FileDisplayActivity.onResume(FileDisplayActivity.java:1226)
at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1722)
at android.app.Activity.performResume(Activity.java:9533)
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:5904)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:6007)
at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:274)
at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:250)
at android.app.servertransaction.TransactionExecutor.executeNonLifecycleItem(TransactionExecutor.java:183)
at android.app.servertransaction.TransactionExecutor.executeTransactionItems(TransactionExecutor.java:109)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:81)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2895)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loopOnce(Looper.java:257)
at android.os.Looper.loop(Looper.java:342)
at android.app.ActivityThread.main(ActivityThread.java:9634)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:619)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:929)
App information
- ID:
com.nextcloud.client - Version:
30310190 - Build flavor:
generic
Device information
- Brand:
samsung - Device:
dm2q - Model:
SM-S916B - Id:
AP3A.240905.015.A2 - Product:
dm2qxeea
Firmware
- SDK:
35 - Release:
15 - Incremental:
S916BXXS8DYDB
Different Callstack, I touched the app while frozen while recording the screen video attached above
Exception in thread "main" java.lang.OutOfMemoryError: Failed to allocate a 24 byte allocation with 2494624 free bytes and 2436KB until OOM, target footprint 268435456, growth limit 268435456; giving up on allocation because <1% of heap free after GC.
at java.lang.StringFactory.newStringFromChars(StringFactory.java:124)
at com.google.gson.stream.JsonReader.nextQuotedValue(JsonReader.java:1090)
at com.google.gson.stream.JsonReader.nextName(JsonReader.java:881)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:511)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:40)
at com.google.gson.internal.bind.ArrayTypeAdapter.read(ArrayTypeAdapter.java:76)
at com.google.gson.Gson.fromJson(Gson.java:1361)
at com.google.gson.Gson.fromJson(Gson.java:1262)
at com.google.gson.Gson.fromJson(Gson.java:1171)
at com.google.gson.Gson.fromJson(Gson.java:1107)
at com.owncloud.android.datamodel.FileDataStorageManager.createFileInstance(FileDataStorageManager.java:1297)
at com.owncloud.android.datamodel.FileDataStorageManager.getGalleryItems(FileDataStorageManager.java:2541)
at com.owncloud.android.datamodel.FileDataStorageManager.getAllGalleryItems(FileDataStorageManager.java:2530)
at com.owncloud.android.ui.adapter.GalleryAdapter.showAllGalleryItems(GalleryAdapter.kt:159)
at com.owncloud.android.ui.fragment.GalleryFragment.showAllGalleryItems(GalleryFragment.java:401)
at com.owncloud.android.ui.fragment.GalleryFragment.handleSearchEvent(GalleryFragment.java:246)
at com.owncloud.android.ui.fragment.GalleryFragment.onRefresh(GalleryFragment.java:217)
at com.owncloud.android.ui.activity.FileActivity.refreshList(FileActivity.java:796)
at com.owncloud.android.ui.activity.FileDisplayActivity.lambda$observeWorkerState$20(FileDisplayActivity.java:1747)
at com.owncloud.android.ui.activity.FileDisplayActivity.$r8$lambda$dTn088xs0ZIZxumGcv-5JkrUGOw(Unknown Source:0)
at com.owncloud.android.ui.activity.FileDisplayActivity$$ExternalSyntheticLambda20.onChanged(D8$$SyntheticClass:0)
at androidx.lifecycle.LiveData.considerNotify(LiveData.java:133)
at androidx.lifecycle.LiveData.dispatchingValue(LiveData.java:151)
at androidx.lifecycle.LiveData.setValue(LiveData.java:309)
at androidx.lifecycle.LiveData$1.run(LiveData.java:93)
at android.os.Handler.handleCallback(Handler.java:959)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loopOnce(Looper.java:257)
at android.os.Looper.loop(Looper.java:342)
at android.app.ActivityThread.main(ActivityThread.java:9634)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:619)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:929)
I am experiencing similar behavior. Very slow performance on media tab, sometimes crashing. Nearly unusable 'upload' function which needs > 30 seconds loading time and telling android to wait for the app. Files are marked as 'local file not found' even though they exist but just in 'another' media folder because they have been manually moved on the phone by me. If I press on the trash bin icon I need to tell Android to 'wait for the app' and don't kill it. I also can't open media folders with many media files (>140 GB) via file browser in the app. After telling android to 'wait for the app' it just don't update the UI for minutes.
App info: 3.31.2 Google Play Store
Device info: Huawei P20 Pro
Firmware Info Android 10 (EMUI 12.0.0)
I also can't open media folders with many media files (>140 GB) via file browser in the app
@Lesurglesum For what it's worth, I do not recommend doing that anywhere, on any operating system. Do you mean 140GB of files flat in one folder level? Or including subdirectories? I'm not sure about BIG video files (trying to thumbnail could be an issue), but having thousands of files in one directory has always caused issues for me, including Windows Explorer crashing at some point (GoPro Picture Timelapse was an example).
I guess you also have a lot of files in your trash bin? So same problem. Trying using nextcloud in your android browser (something I have not even tried up until now lol)
As for your other problems... I am having and had my fair share of errors but didn't wanna list all of them in this issue (offtopic). The "Media" (Photos) function of the android app is completely unusable for me anyway, from a usability perspective (there is no time picker scrollbar for once, so you scroll for eternity). So for media, I recommend you trying the "memories" app instead.
Still occurring In app version 3.31.4 (F-Droid), however I was able to open Media ONCE (and the view was scrolling and loading), but doing it a second time it crashed again with OOM, and yet another callstack.