Как я могу вызвать сборщика мусора самостоятельно? - PullRequest
0 голосов
/ 11 июля 2019

В моем действии выполняется алгоритм, который может использовать большой объем памяти устройства, как только действие создано, но работает нормально, но когда я продолжаю выходить, нажимаю назад и затем нажимаю, чтобы снова войти в действие, не останавливая много временами кажется, что приложение накапливает память, что я видел в своем профиле и заставляло такое приложение просто сбить мое приложение менее чем за 20 попыток.
Тем не менее, комментируя этот код, я просто смог выйти и вернуться из упражнения так быстро, как только смогу, сколько бы раз я это не делал.

РЕДАКТИРОВАТЬ: Я просто стерла цикл for, проверила его и отлично работает, кажется, что способ, которым я много раз разбиваю большие строки для создания карты, накапливает память, есть способ справиться с этим?

Это мой алгоритм, он на ViewModel, если это имеет значение

 fun getAllChartPoint(id: Int){

                 getTotalPackages(id) { // ROOM CALL returns as integer

                      myCallRepository.getOrder(id){ // room call to get an object 'CALL'
                        val odr = SupportVersionHelper.getAdcRateConfigOrDefault(it.adcOdrX!!,it. adcOdrY!!)

                        myPackgerepository.getAllPackagesWithId(it){ // Another ROOM call, returns a list of objects, that contanis a big string that will be splitted

                            for (index in 0 until it.size) {

                                if (it[index].signal != null) {
                                    val splitedPoint = it[index].signal!!.split(" ")
                                    if (isMemoryLow(context)){
                                        return@getFhirPackagesForMonitoringWithId
                                    }
                                    splitedPoint.map { signal ->
                                        signal.toFloatOrNull()?.let { floatSignal ->
                                            map[currIndexMap.toFloat()] = floatSignal
                                            currIndexMap++
                                        }

                                    }
                                }

                            }

                        }

                      }



                 }

            } 

Все вызовы Room добавляются в CompositeSubscription (), которые очищаются методом onCleared () ViewModel

fun getNumberPackages(monitoringId: Long, onCompletion: (Int) -> Unit, onFail: (Throwable) -> Unit){
        val subscription = Single.fromCallable { fhirPackageDao?.numberOfFhirPackageForMonitoring(monitoringId) }
                ?.subscribeOn(Schedulers.io())
                ?.subscribe({
                    onCompletion(it ?: return@subscribe)
                }, {
                    onFail(it)
                    BleLogHelper.writeError("Error fetching totak of packages", it)
                })
        subscriptions.add(subscription)

    }

Есть что-то, что я могу сделать, чтобы уничтожить все экземпляры, когда viewModel очищена? Я пытался окружить этот код doAsync из anko lib, но он не работал вообще

1 Ответ

1 голос
/ 11 июля 2019

Невозможно напрямую вызвать сборщик мусора, но вы можете вызвать метод System.gc() для отправки уведомления сборщику мусора о том, что существует сборщик мусора, обратите внимание, что это не гарантируетэта коллекция будет выполнена.

В любом случае это считается плохой практикой и, вероятно, не решит вашу проблему.

Ваша проблема, скорее всего, одна из следующих:

  1. У вас есть утечка памяти, которая препятствует процессу GC, в большинстве случаев это вызвано сохранением ссылки на контекст / представлениепосле того, как действие уничтожено, что, в свою очередь, мешает его обработке GC, вы также можете попробовать LeakCanary .
  2. Вы начинаете много действий друг над другом, ужеответ на эту тему, которую вы можете прочитать здесь - Android-приложение из-за проблем с памятью .
...