Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.94
MonStar
19 / 19 / 3
Регистрация: 10.04.2011
Сообщений: 225
#1

Оптимизация приложения. Слишком часто вызывается GC - Программирование Android

16.07.2013, 15:30. Просмотров 2113. Ответов 28
Метки нет (Все метки)

Требуются некоторые разъяснения по работе GC и некоторая помощь в оптимизации.

Есть два проблемных места, в обоих очень часто создаются модели JSON.

Дело в том что постоянно через WebSocket идет непрерывный поток примерно 10Кб\с. Для каждого сообщения создается JSON, парсится, обрабатывается и когда приходит следующее сообщение старый JSON теряет ссылку и подбирается GC (мне кажется что всё происходит именно так).

В результате на момент работы GC приложение приостанавливается и появляются задержки.
Меня интересует, правда ли что GC_CONCURRENT полностью блокирует приложение на время своей работы (хотя он должен работать синхронно с приложением). По логам видно, что утечек памяти нет, но вызовы GC очень частые, иногда чаще чем раз в 10 секунд.

07-16 14:21:38.403: D/dalvikvm(16883): GC_CONCURRENT freed 1427K, 23% free 13244K/17112K, paused 105ms+7ms, total 168ms
07-16 14:21:43.578: D/dalvikvm(16883): GC_CONCURRENT freed 1807K, 22% free 13483K/17112K, paused 10ms+24ms, total 162ms
07-16 14:21:51.842: D/dalvikvm(16883): GC_CONCURRENT freed 1890K, 21% free 13539K/17112K, paused 59ms+19ms, total 156ms
07-16 14:22:02.282: D/dalvikvm(16883): GC_CONCURRENT freed 1941K, 21% free 13551K/17112K, paused 19ms+16ms, total 138ms
07-16 14:22:06.276: D/dalvikvm(16883): GC_CONCURRENT freed 2001K, 22% free 13500K/17112K, paused 6ms+4ms, total 91ms
07-16 14:22:17.287: D/dalvikvm(16883): GC_CONCURRENT freed 1878K, 21% free 13561K/17112K, paused 12ms+6ms, total 97ms
07-16 14:22:28.138: D/dalvikvm(16883): GC_CONCURRENT freed 1936K, 21% free 13562K/17112K, paused 6ms+20ms, total 104ms
07-16 14:22:35.194: D/dalvikvm(16883): GC_CONCURRENT freed 1926K, 21% free 13557K/17112K, paused 3ms+11ms, total 64ms
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.07.2013, 15:30     Оптимизация приложения. Слишком часто вызывается GC
Посмотрите здесь:
Не вызывается onDestroy при принудительно остановке приложения Android
Android Ищу сотоварища для разработки не слишком сложного приложения
Оптимизация приложения Android
Оптимизация приложения Android
Android C# оптимизация приложения под разные экраны(не GUI)
Почему вызывается onDismiss Android
Не вызывается событие onConfigurationChanged Android
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
17.07.2013, 01:22     Оптимизация приложения. Слишком часто вызывается GC #21
Цитата Сообщение от MonStar Посмотреть сообщение
Сомневаюсь, что поможет лишняя сотня классов
а зачем сотня классов? достаточно одного JSONObject'a.
Цитата Сообщение от MonStar Посмотреть сообщение
Java
1
new TickerInstrumentModel(jsonArray.getJSONObject(i));
покажите класс TickerInstrumentModel, не понятно что он делает с JSONObject'ом.
MonStar
19 / 19 / 3
Регистрация: 10.04.2011
Сообщений: 225
17.07.2013, 01:26  [ТС]     Оптимизация приложения. Слишком часто вызывается GC #22
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class TickerInstrumentModel extends JSONObjectWrapper {
 
    private static final String PRICE = "price";
 
    public TickerInstrumentModel(JSONObject object) {
        super(object);
    }
 
    public TickerInstrumentModel(Parcel source) {
        super(source);
    }
 
    public TickerInstrumentModel(String json) {
        super(json);
    }
 
    public double getPrice() {
        return getDouble(PRICE);
    }
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public class JSONObjectWrapper implements Parcelable {
    private static final String TAG = JSONObjectWrapper.class.getSimpleName();
    private JSONObject jo;
 
    public JSONObjectWrapper() {
        jo = new JSONObject();
    }
 
    public JSONObjectWrapper(JSONObject object) {
        jo = object;
    }
 
    public JSONObjectWrapper(String json) {
        try {
            jo = new JSONObject(json);
        } catch (JSONException e) {
            Log.e(TAG, "JSON Not Valid (constructor object)", e);
        }
    }
 
    protected double getDouble(String name) {
        try {
            if (isNull(name)) {
                return 0;
            }
            return jo.getDouble(name);
        } catch (JSONException e) {
            Log.e(TAG, "JSON not contain " + name, e);
        }
        return 0;
    }
 
    private boolean isNull(String name) {
        return jo.isNull(name);
    }
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
17.07.2013, 01:34     Оптимизация приложения. Слишком часто вызывается GC #23
теперь понятнее, а то я думал может у вас в конструкторе TickerInstrumentModel вытаскивается сотня полей.
на будущее: по парсингом имеется ввиду получение конечных данный, например выполнение метода getPrice.
MonStar
19 / 19 / 3
Регистрация: 10.04.2011
Сообщений: 225
17.07.2013, 01:35  [ТС]     Оптимизация приложения. Слишком часто вызывается GC #24
Цитата Сообщение от V0v1k Посмотреть сообщение
теперь понятнее, а то я думал может у вас в конструкторе TickerInstrumentModel вытаскивается сотня полей.
на будущее: по парсингом имеется ввиду получение конечных данный, например выполнение метода getPrice.
За совет на будущее спасибо. А поля конечно вытаскиваются, одно, уже когда складываются в Map. Их там всего 3
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
17.07.2013, 01:36     Оптимизация приложения. Слишком часто вызывается GC #25
единственно что приходит на мой сонный ум, так это создание веб сервиса который будет принимать этот поток данных и по запросу отдавать клиенту последние данные.
MonStar
19 / 19 / 3
Регистрация: 10.04.2011
Сообщений: 225
17.07.2013, 01:39  [ТС]     Оптимизация приложения. Слишком часто вызывается GC #26
Цитата Сообщение от V0v1k Посмотреть сообщение
единственно что приходит на мой сонный ум, так это создание веб сервиса который будет принимать этот поток данных и по запросу отдавать клиенту последние данные.
Думаю это слишком сложно для такой задачи. Приложение по сути делается по макету с iOS, и там с этим на сколько я знаю никаких проблем. Все JSON объекты создаются и выбрасываются в любых количествах без ущерба
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
17.07.2013, 01:39     Оптимизация приложения. Слишком часто вызывается GC #27
а то, что отсылает эти данные нельзя переделать чтобы оно само так складывало и по запросу давало все последние данные?
MonStar
19 / 19 / 3
Регистрация: 10.04.2011
Сообщений: 225
17.07.2013, 01:44  [ТС]     Оптимизация приложения. Слишком часто вызывается GC #28
Цитата Сообщение от V0v1k Посмотреть сообщение
а то, что отсылает эти данные нельзя переделать чтобы оно само так складывало и по запросу давало все последние данные?
К сожалению нет, всё что со стороны сервера вне моей компетенции. Вполне может быть, что они как раз отправляются в момент обновления на сервере, но наверняка этого не могу знать.
В любом случае спасибо за терпение ) если будут идеи всегда рад. Уже третьи сутки не могу справиться с этим. Попробую искать в других местах.


И можно пару вопросов по тонкостям работы Java или Android.
1. GC_СONCURRENT останавливает всё приложение полностью или я ошибаюсь? Просто пишут что сборщик выполняется синхронно
2. Если я создам объект таким образом
Java
1
2
Object o1 = new Object(1);
o1 = new Object(2);
То я правильно понимаю, что ссылка на new Object(1) теряется, и он убирается сборщиком?

А то за время раскопок и поисков я уже ни в чем не уверен. Всю голову сломал
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.07.2013, 01:51     Оптимизация приложения. Слишком часто вызывается GC
Еще ссылки по теме:
OnCreate вызывается дважды Android
Android Подскажите - не вызывается метод в потоке
Android Не вызывается клавиатура внутри PopupWindow
Когда вызывается конструктор дописанного view? Android
Android После засыпания вызывается onCreate и onRestoreInstanceState

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
17.07.2013, 01:51     Оптимизация приложения. Слишком часто вызывается GC #29
Цитата Сообщение от MonStar Посмотреть сообщение
К сожалению нет, всё что со стороны сервера вне моей компетенции. Вполне может быть, что они как раз отправляются в момент обновления на сервере, но наверняка этого не могу знать.
В любом случае спасибо за терпение ) если будут идеи всегда рад. Уже третьи сутки не могу справиться с этим. Попробую искать в других местах.
ну, по правильному, сервер должен давать вам по запросу все нужные данные, а не слать постоянно черти что.

Цитата Сообщение от MonStar Посмотреть сообщение
1. GC_СONCURRENT останавливает всё приложение полностью или я ошибаюсь? Просто пишут что сборщик выполняется синхронно
не знаю, никогда не было с ним проблем, вот и не исследовал этот вопрос.
Цитата Сообщение от MonStar Посмотреть сообщение
То я правильно понимаю, что ссылка на new Object(1) теряется, и он убирается сборщиком?
да, правильно, но убирается не сразу же.
Yandex
Объявления
17.07.2013, 01:51     Оптимизация приложения. Слишком часто вызывается GC
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru