Форум программистов, компьютерный форум, киберфорум
Java
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 15.03.2016
Сообщений: 135

Большой расход памяти при обработки Runnable тасков

21.09.2018, 10:36. Показов 933. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Есть такой класс:

Кликните здесь для просмотра всего текста
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
@Component
public class TestClass extends Verify {
 
    private final ThreadPoolTaskExecutor processExecutor;
    private final BlockingQueue<KPIData> kpiData;
 
    @Autowired
    public TestClass(
            final DbAddresser dbAddresser,
            final MyDao myDao,
            final ThreadPoolTaskExecutor processExecutor) {
        super(VerificationType.KPI, dbAddresser, myDao);
        this.processExecutor = processExecutor;
        kpiData = new ArrayBlockingQueue<>(20);
    }
 
    @Override
    public void verification() throws Exception {
        startedVerification();
        verifyIndicator.setTitle("tasks");
        final Thread consumerKPI = new Thread(() -> {
            ProcessIdGenerator.generate();
            LOG.debug("Consumer thread started....");
            try {
                KPIData kpiData;
                while (!(kpiData = this.kpiData.take()).isLastElement()) {
                    final InconsistsKPICallable callable = new InconsistsKPICallable(((KPIDataImpl) kpiData).getRes());
                    execDispatcher.put(processExecutor.submit(callable));
                    verifyIndicator.incMaxStep();
                }
            } catch (Exception e) {
                LOG.error("Consumer thread error: ", e);
            }
            LOG.debug("Consumer thread finished....");
        });
        consumerKPI.start();
 
        try {
 
            smbpDbAddresser.getKpiAll(kpiData, 5000);
 
            final Pair<Long, Long> minMaxEntities = dbAddresser::getMinMaxEntities;
            if (minMaxEntities != null) {
                long currentEntityId = minMaxEntities.getLeft();
 
                while (currentEntityId <= minMaxEntities.getRight()) {
                    if (stopped) {
                        break;
                    }
 
                    long fromEntityId = currentEntityId;
                    long toEntityId = currentEntityId + 4999;
 
                    incMaxStep();
 
                    InconsistsKPIneedUpdateCallable callable = new InconsistsKPIneedUpdateCallable(fromEntityId, toEntityId);
                    execDispatcher.put(processExecutor.submit(callable));
                    currentEntityId = toEntityId + 1;
                }
            }
        } finally {
            consumerKPI.join();
            waitFinished();
            finishedVerification();
        }
    }
 
    public class InconsistsKPICallable implements Runnable {
        private final List<Pair<Long, String>> kpiList;
 
        InconsistsKPICallable(final List<Pair<Long, String>> kpiList) {
            this.kpiList = kpiList;
        }
 
        @Override
        public void run() {
            try {
                // do hard work with kpiList
            } catch (Exception ex) {
            } finally {
                LOG.debug("InconsistsSmbpKPICallable finished!");
            }
            incCurStep();
        }
    }
 
    public class InconsistsKPIneedUpdateCallable implements Runnable {
        private final Long fromEntityId;
        private final Long toEntityId;
 
        InconsistsKPIneedUpdateCallable(final long fromEntityId, final long toEntityId) {
            this.fromEntityId = fromEntityId;
            this.toEntityId = toEntityId;
        }
 
        @Override
        public void run() {
            try {
                // do hard work with fromEntityId and toEntityId
            } catch (Exception ex) {
            } finally {
                LOG.debug("InconsistsKPIneedUpdateCallable finished for fromEntityId {} toEntityId {}", fromEntityId, toEntityId);
            }
            incCurStep();
        }
    }
}


Вся проблема в том, что вот тут:

Java
1
2
3
4
5
while (!(kpiData = this.kpiData.take()).isLastElement()) {
                    final InconsistsKPICallable callable = new InconsistsKPICallable(((KPIDataImpl) kpiData).getRes());
                    execDispatcher.put(processExecutor.submit(callable));
                    verifyIndicator.incMaxStep();
                }
мы очень быстро создаем таски, тем самым забивая всю память. Все из-за того, что Runnable таск обрабатываются не так быстро, в отличие от того, как мы их создаем. Я пробовал указать для ThreadPoolTaskExecutor размер очереди, но тут также упираюсь в то, что мы ее быстро забиваем и получаем исключение: org.springframework.core.task.TaskReject edException. Подскажите, как можно реорганизовать данный код, чтобы сократить потребление памяти, и не откидывать таски с исключением? Я пробовал искать способы, чтобы если очередь заполнена, вызывающий поток, который добавляет таск просто ждал, а не падал с исключением, но адекватных решений не нашел.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.09.2018, 10:36
Ответы с готовыми решениями:

Большой расход памяти
Пишу приложение, которое берёт слово из файла и отправляет его через форму на сайт. И всё работает как надо, вот только потребляемая память...

Огромный расход памяти при загрузке TImage
Доброго времени суток. В общем, сабж. Необходимо сделать что-то вроде каталога с изображениями. Создаю динамически при нажатии кнопки. ...

Расход памяти диска при установке XE7
Всем привет. Скажите пожалуйста куда идёт расход памяти до установки было свободно 71Гб после установки 22Гб? Не ужели сам проект...

5
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
21.09.2018, 10:52
Neo-X2006, блокирующая очередь не то? если она заполнена, то поставщики ждут, если пуста то потребители ждут.
0
0 / 0 / 0
Регистрация: 15.03.2016
Сообщений: 135
21.09.2018, 11:08  [ТС]
Цитата Сообщение от Welemir1 Посмотреть сообщение
блокирующая очередь не то?
блокирующая очередь где? ThreadPoolTaskExecutor имеет только метод setQueueCapacity. Ему нельзя задать очередь
0
 Аватар для snajper_ro
116 / 101 / 52
Регистрация: 14.09.2011
Сообщений: 696
Записей в блоге: 1
21.09.2018, 11:09
ищите узкие места, тут надо смотреть лично вам и разлаживать на мелкие состовляющие(части), ведь у любового сервера есть предел по нагрузке
0
0 / 0 / 0
Регистрация: 15.03.2016
Сообщений: 135
21.09.2018, 11:13  [ТС]
Цитата Сообщение от snajper_ro Посмотреть сообщение
ищите узкие места
так уже нашел. Снял heap dump, там 94% завалено тасками, которые мы пихали разгребая очередь
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,779
21.09.2018, 11:33
Цитата Сообщение от Welemir1 Посмотреть сообщение
блокирующая очередь не то? если она заполнена, то поставщики ждут, если пуста то потребители ждут.
Как это поможет, если у него потребители не справляются с нагрузкой, будет вместо переполнения очереди переполнение ждущих поставщиков.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.09.2018, 11:33
Помогаю со студенческими работами здесь

HttpWebRequest, расход памяти непомерно больших объемов и , как следствие, утечка памяти
Добрый вечер. Мне была поставлена такая задача. Написать приложение, которая загружает из списка ссылки с сайта и ищет там определенную...

Непонятный расход памяти (ничего не запущено, кроме антивируса, а расходуется 900 МБ памяти)
Объясните, почему у меня ничего не запущено, кроме антивируса, а расходуется 900 МБ памяти?

Модем Huawei Е3276 большой расход трафика
Добрый день! Модем Huawei E3276 режим LTE 4G оператор Мегафон система Windows10 При загрузке файлов из интернета часто бывает такая...

Ремонт ПММ ARISTON LL.40 EU.C/HA, Большой расход соли и известковый налет и ржавчина.
ПММ ARISTON LL.40 EU.C/HA 64489890000 0001 - 805268444 Делал эту ПММ меясяца три назад - удалял обломок стекла из под крыльчатки...

Подсчет тасков при реляции HasMany()
Есть таблица Тасков и Проектов связал их реляцией в модели чтоб вывести список Проектов и количества Тасков к ним. модель ...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru