Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Поиск утечек в NetBeans, чтение больших файлов / 11 сообщений из 11, страница 1 из 1
17.05.2016, 12:42
    #39237293
JDS
JDS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск утечек в NetBeans, чтение больших файлов
Загрузчик xml в БД на базе sax-парсера.
Маленькие файлы (неск. сот метров) грузятся без проблем, но они могут достигать и 2Гб.
И когда начинаешь грузить большой файл, то чем дальше, тем ощутимее, что чтение идет медленнее, при этом судя по картинке,
растет и число используемой памяти, хотя казалось бы после executeBatch и clearBatch, все что прочиталось должно бы ведь сброситься, а тут такие дела (не видно ощутимого освобождения памяти):

При этом все что можно стараюсь закрывать в блоках финализации или try с ресурсами, но ощущение, что где-то утекает.

Как бы быстро понять/отловить что именно? ) (например, может я не чищу, что-то, что должен бы чистить, т.е. увидеть, экземпляры каких классов копятся в памяти или еще как-то понять почему расход увеличивается, или может сакс-парсер читает файл как бы не "окном", а постепенно весь загружается в память?:))

И еще, можно ли как-то в профилировщике понять не по методам, а в разрезе операторов метода, что именно тормозит.
(т.е. есть метод, который жрет много времени, хочется понять что именно в нем тяжелое, можно самому внутри метода позасекать время, но это ж как-то неудобно и не всегда может быть корректно имхо)
...
Рейтинг: 0 / 0
17.05.2016, 12:47
    #39237301
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск утечек в NetBeans, чтение больших файлов
JDSКак бы быстро понять/отловить что именно? ) (например, может я не чищу, что-то, что должен бы чистить, т.е. увидеть, экземпляры каких классов копятся в памяти или еще как-то понять почему расход увеличивается, или может сакс-парсер читает файл как бы не "окном", а постепенно весь загружается в память?:))
1) Прогнать тест под memory profiler.
2) Сравнить "до" и "после".
3) Найти то что осталось, а не должно было.
4) Найти GC roots для того что не собралось.

Можешь выложить дамп, я посмотрю.

JDSИ еще, можно ли как-то в профилировщике понять не по методам, а в разрезе операторов метода, что именно тормозит.

В jVisualVM нельзя. В некоторых более крутых - можно. У Шипилева в блоге недавно было.

JDS(т.е. есть метод, который жрет много времени, хочется понять что именно в нем тяжелое, можно самому внутри метода позасекать время, но это ж как-то неудобно и не всегда может быть корректно имхо)
Разбить на методы для начала?
...
Рейтинг: 0 / 0
17.05.2016, 13:10
    #39237336
JDS
JDS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск утечек в NetBeans, чтение больших файлов
Blazkowicz, спасибо, вроде бы нашел. Правда не научным методом.
Все параметры для стейтментов собираю по мере чтения в хэштаблице.
И есть одно поле, которое может достигать неск. мегабайт данных типа clob.
Соответственно в хэштаблицу пихаю его в String, но делаю это видимо некорректно:
пока сакс парсер читает значение этого поля, много раз генерится событие
Код: java
1.
public void characters(char ch[], int start, int length) throws SAXException


Ну и я каждый раз для этого поля достаю из таблицы уже сохраненную строку и тупо прицепляю к ней то, что еще прочитал:
Код: java
1.
2.
3.
private final Map<Integer, Object> val = new HashMap<>();
....
val.put(fieldIndex, val.get(fieldIndex) + fieldValue);


Когда закаментил эту конкантенацию, то все зашуршало оч. быстро и с памятью проблем не стало.
Помимо нюансов возможных утечек такого способа, есть ощущение, что надо тем же стрингбилдером собрать до конца это большое поле, а потом уже один раз засунуть в массив параметров (как и делаю с другими полями):
Код: java
1.
val.put(fieldIndex, fieldValue);
...
Рейтинг: 0 / 0
17.05.2016, 13:16
    #39237345
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск утечек в NetBeans, чтение больших файлов
JDS,

Нужно не собирать строку воедино, а писать в OutputStream, который бы напрямую был связан с БД.
...
Рейтинг: 0 / 0
17.05.2016, 13:46
    #39237381
JDS
JDS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск утечек в NetBeans, чтение больших файлов
BlazkowiczНужно не собирать строку воедино, а писать в OutputStream, который бы напрямую был связан с БД.
Это как? Есть примеры такой загрузки?
Я ж через jdbc, берешь его стейтмент, туда инсерт, прописываешь параметры, addBatch + executeBacth.
...
Рейтинг: 0 / 0
17.05.2016, 14:31
    #39237427
JDS
JDS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск утечек в NetBeans, чтение больших файлов
Пока поправил на стрингбилдер и все полетело с какой-то даже пугающей скоростью и с памятью нормуль вроде )
...
Рейтинг: 0 / 0
17.05.2016, 14:34
    #39237441
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск утечек в NetBeans, чтение больших файлов
JDS,

https://docs.oracle.com/cd/B19306_01/java.102/b14355/jstreams.htm#i1021820
Но как подружить это с батчами, надо подумать.
...
Рейтинг: 0 / 0
17.05.2016, 14:48
    #39237455
JDS
JDS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск утечек в NetBeans, чтение больших файлов
BlazkowiczНо как подружить это с батчами, надо подумать.
Не ну там как понял, пример чтения в поток по сути из курсора?
В обратном направлении было бы круто наверно, но пока не представляю реально ли )
А пока добился, гигабайтный файл залезает в базу за 5минут, что меня более чем устраивает и даже радует )
...
Рейтинг: 0 / 0
17.05.2016, 15:45
    #39237521
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск утечек в NetBeans, чтение больших файлов
Blazkowicz https://docs.oracle.com/cd/B19306_01/java.102/b14355/jstreams.htm#i1021820
Но как подружить это с батчами, надо подумать.
А чего дружить. Оно само должно прозрачно работать.
...
Рейтинг: 0 / 0
17.05.2016, 16:12
    #39237562
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск утечек в NetBeans, чтение больших файлов
JDSПока поправил на стрингбилдер и все полетело с какой-то даже пугающей скоростью и с памятью нормуль вроде )
Если скорость пугает - надо срочно поставить sleep(..) чтоб было не так быстро.
Ато знаешь как бывает... электроны в кристаллической решетке сталкиваются
и шумят.... И нафих оно.
...
Рейтинг: 0 / 0
18.05.2016, 15:24
    #39238356
JDS
JDS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск утечек в NetBeans, чтение больших файлов
Еще засада.
Столкнулся с тем, что при массовой загрузке падаю на нехватке временного пространства в БД:
Единственное подозрение падает на загружаемые blob-ы.
Делаю так:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
 ...                   oracle.sql.BLOB buff = oracle.sql.BLOB.createTemporary(dbСonn, true, oracle.sql.BLOB.DURATION_SESSION);
                        OutputStream os = buff.setBinaryStream(0L);
                        try {
                            String fValue = (String) val.get(i);
                            if (fValue != null) 
                               os.write(fValue);
                        } finally {
                            os.flush();
                            os.close();
                        }
                        callStms.setBlob(i, buff);
....


Потом callStms.addBatch(); + callStms.execBatch();
Но при этом я же не освобождаю buff,
т.е. не делаю ни
buff.freeTemporary();
ни
buff.close();
ни
buff.free();
(что именно из этого нужно пока тоже не в курсе)
И еще есть подозрение, что "освобождать" надо после execBatch.
То есть придется собирать все эти локаторы в коллекцию и потом циклом проходить чистить?
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Поиск утечек в NetBeans, чтение больших файлов / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]