|
|
|
Как обработать потенциальную нехватку памяти?
|
|||
|---|---|---|---|
|
#18+
У меня следующая проблема: Программа многопоточно парсит большие файлы. У меня есть подозрение, что возможна ситуация, что программа упадёт из-за нехватки какого-нить пермгена или чего-то подбного. Ибо в реальной жизни файлы могут быть ещё больше. 1. Возможно ли это как-то предотвратить? (средства профилактики) 2. Совсем плохая ситуация, если программа свалилась, перед этим правда часть распарсила, пользователь видит результат(частичный), смотрит, что выполнение закончилось и думает, что всё уже успешно закончилось. Как такое предотвратить? catch(Throwable) ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 12:36 |
|
||
|
Как обработать потенциальную нехватку памяти?
|
|||
|---|---|---|---|
|
#18+
redwhite901. Возможно ли это как-то предотвратить? Возможно: загружать информацию разумными порциями. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 12:40 |
|
||
|
Как обработать потенциальную нехватку памяти?
|
|||
|---|---|---|---|
|
#18+
wadman, как определить разумность порции в рантайме? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 12:47 |
|
||
|
Как обработать потенциальную нехватку памяти?
|
|||
|---|---|---|---|
|
#18+
redwhite90wadman, как определить разумность порции в рантайме? Посмотреть размеры кучи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 12:48 |
|
||
|
Как обработать потенциальную нехватку памяти?
|
|||
|---|---|---|---|
|
#18+
1. Делать все через {Weak ,Soft, Phantom}Reference + ReferenceQueue 2. Отказаться от парсинга в Памяти , перейти на работу с файлами (Files java 7 итд) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 13:56 |
|
||
|
Как обработать потенциальную нехватку памяти?
|
|||
|---|---|---|---|
|
#18+
Если XML - открыть для себя, что кроме DOM, есть еще и SAX. Прочитать про устройство памяти в Java. Пока перлы "упадёт из-за нехватки какого-нить пермгена " думаю смотреть в сторону reference бессмысленно. Ну IMHO soft reference может чем то и хорош, но вот документация как он чиститься GC полный отстой. Если в проекте наплодите soft reference, боюсь падать оно не перестанет, а вот отладить место падение будет сложнее. Выделить больше памяти, что бы файл точно в память помещался. Большие файлы парсить в отдельной Java машине, что бы если и упадет, было не так жалко ))). А, вообще, зависит от специфика задачи, проекта и доступного оборудования. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 14:24 |
|
||
|
Как обработать потенциальную нехватку памяти?
|
|||
|---|---|---|---|
|
#18+
Blazkowiczredwhite90wadman, как определить разумность порции в рантайме? Посмотреть размеры кучи. А дадите ссылку просветиться как эту проблему обычно решают? непонятно с чем сравнить размер кучи, ведь sizeOf в java нет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 15:06 |
|
||
|
Как обработать потенциальную нехватку памяти?
|
|||
|---|---|---|---|
|
#18+
Atum11. Делать все через {Weak ,Soft, Phantom}Reference + ReferenceQueue оу, всегда знал о существовании этих слов, но никогда не видел как это пользуют ? покажете красочный пример? Atum12. Отказаться от парсинга в Памяти , перейти на работу с файлами (Files java 7 итд) я на 6 джаву завязан( А вообще стало интересно где тогда парситься это всё будет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 15:10 |
|
||
|
Как обработать потенциальную нехватку памяти?
|
|||
|---|---|---|---|
|
#18+
а чем тебе "size of" поможет? сравнить с потреблением своей программы/алгоритма ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 15:10 |
|
||
|
Как обработать потенциальную нехватку памяти?
|
|||
|---|---|---|---|
|
#18+
redwhite90...А вообще стало интересно где тогда парситься это всё будет? Что значит парситься? Банальный парсинг (например текстового файла), требует одного поля состояния парсера + 1-2 байта на текущей и пред. считанный символ. Зачем что-то большее? ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 15:12 |
|
||
|
Как обработать потенциальную нехватку памяти?
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsev, Leonid KudryavtsevЕсли XML - открыть для себя, что кроме DOM, есть еще и SAX. не XML и давно открыл) Leonid KudryavtsevВыделить больше памяти, что бы файл точно в память помещался. Большие файлы парсить в отдельной Java машине, что бы если и упадет, было не так жалко ))). А, вообще, зависит от специфика задачи, проекта и доступного оборудования. приложение должно быть универсальным. Файлы могут взяться откуда угодно. А парситься они должны единообразно. И программа сама должна следить, чтобы онане взяла на себя слишком много. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 15:13 |
|
||
|
Как обработать потенциальную нехватку памяти?
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsevа чем тебе "size of" поможет? сравнить с потреблением своей программы/алгоритма Ну смотрите, я так себе это представляю: Я смотрю сколько "ресурсов" я трачу сейчас, смотрю сколько "ресурсов" свободно, смотрю сколько "ресурсов" надо чтобы начать обрабатывать новый файл. Как каждое из этих трёх чисел получить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 15:15 |
|
||
|
Как обработать потенциальную нехватку памяти?
|
|||
|---|---|---|---|
|
#18+
redwhite90...приложение должно быть универсальным. Файлы могут взяться откуда угодно. А парситься они должны единообразно. И программа сама должна следить, чтобы онане взяла на себя слишком много. Какие файлы и что значит "парситься" ? Если нужна изоляция по памяти, то на мой взгляд, только запускать 2-ую (5,10-ую JVM) и выполнять парсинг там. В любом другом случае, способа гарантированно изолировать кусок кода от ядра нет. Или я такого способа не знаю. Мало того, при работе в выделенной JVM, вполне возможно, может быть и значительное ускорение приложения. Т.к. ряд задач парсящих файлы, не будут гадить в общую кучу. Соответственно и куча может быть меньше (компактнее, больше в кеше процессора поместиться) и GC будет опять таки работать быстрее. IMHO & AFAIK ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 15:17 |
|
||
|
Как обработать потенциальную нехватку памяти?
|
|||
|---|---|---|---|
|
#18+
redwhite90...Я смотрю сколько "ресурсов" я трачу сейчас, смотрю сколько "ресурсов" свободно, смотрю сколько "ресурсов" надо чтобы начать обрабатывать новый файл... "трачу" это present contininue , а посмотреть это или past или даже past perfect ))). Сорри за мой английский. Т.ч. в такой постановке вопроса - никак, в вопросе "падение падежей" ( C ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 15:20 |
|
||
|
Как обработать потенциальную нехватку памяти?
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsevredwhite90...А вообще стало интересно где тогда парситься это всё будет? Что значит парситься? Банальный парсинг (например текстового файла), требует одного поля состояния парсера + 1-2 байта на текущей и пред. считанный символ. Зачем что-то большее? ))) мне нужно анализировать содержимое файла. У меня есть некоторые паттерны, которые я там ищу... ммм....вообще да, логично. Но что имелось ввиду Atum1 Отказаться от парсинга в Памяти , перейти на работу с файлами (Files java 7 итд) я не понимаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 15:20 |
|
||
|
Как обработать потенциальную нехватку памяти?
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsevredwhite90...Я смотрю сколько "ресурсов" я трачу сейчас, смотрю сколько "ресурсов" свободно, смотрю сколько "ресурсов" надо чтобы начать обрабатывать новый файл... "трачу" это present contininue , а посмотреть это или past или даже past perfect ))). Сорри за мой английский. Т.ч. в такой постановке вопроса - никак, в вопросе "падение падежей" ( C ) Можно взять какие-то волюнтаристские запасы. Ну допустим у нас 500 единиц ресурсов свободно, предполагаем, что 300 мы можем использовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 15:24 |
|
||
|
Как обработать потенциальную нехватку памяти?
|
|||
|---|---|---|---|
|
#18+
http://stackoverflow.com/a/2015524/2674303 вот это те самые цифры, что мне нужны? Код: java 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 15:26 |
|
||
|
Как обработать потенциальную нехватку памяти?
|
|||
|---|---|---|---|
|
#18+
redwhite90вот это те самые цифры, что мне нужны? http://docs.oracle.com/javase/7/docs/api/java/lang/management/package-summary.html Через JMX, возможно, лучше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 15:32 |
|
||
|
Как обработать потенциальную нехватку памяти?
|
|||
|---|---|---|---|
|
#18+
Зависит от задачи. Вашу задачу никто не знает. В "первом (втором, третьем и так далее) приближении" можно, но гарантий соответственно никаких. 1) Мы можем посмотреть, что сейчас 100 ресурсов свободно, а на деле, еще 100500 не почищенных GC свободного место. - сказали "облом", а на деле ресурсов полно. 2) Два потока: первый посмотреть, что 550 ресурсов свободно, запустился, второй посмотрел, 550 ресурсов свободно, запустился. Каждый потратил по 300 ресурсов и... - упали, а предположим, что еще и завалили ядро И так далее Или, работаем в предположении, что код написан _качественно_ и под JVM выделенно достаточно ресурсов. Или, что бы работать с гарантией, если файлы действительно большие и алгоритм _требует_ много памяти - запускать в отдельной JVM. Но, для качественных алгоритмов, связи "размер памяти" -> "потребленная ОП память" быть не должно. IMHO & AFAIK. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 15:37 |
|
||
|
Как обработать потенциальную нехватку памяти?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz Я бы для оценки: 1) брал бы размер еден спейс и умножал на кол-во сборок (минор) муссора - кол-во памяти засираемое алгоритмом в процессе работы + 2) то, что после миннор GC осталось в памяти - кол-во памяти потребляемое на структуры но мне кажется, что это не принесет счастья ТС и никак не решит задачу озаглавленную в Subj. IMHO & AFAIK ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 15:41 |
|
||
|
Как обработать потенциальную нехватку памяти?
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsev...связи "размер памяти" -> "потребленная ОП память" быть не должно. IMHO & AFAIK. "размер файлы " -> "потребленная ОП память"... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 15:55 |
|
||
|
Как обработать потенциальную нехватку памяти?
|
|||
|---|---|---|---|
|
#18+
Хе, ща попробовал через трай-кетч вполне себе ловит OutOfMemoryError и не валится. Обрабатуйте исключение наздоровье, или я что-то не понял? Ну и чтоб не было случаев частично обработанного может положение курсора где нибудь хранить, типа если для файла не равно его размеру то значит файл недопрочтен... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 16:04 |
|
||
|
Как обработать потенциальную нехватку памяти?
|
|||
|---|---|---|---|
|
#18+
И что делать, в этой обработке Out of memory ? Как она поможет. Можно ключик java поставить и out of memory вообще никогда не будет ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 16:36 |
|
||
|
Как обработать потенциальную нехватку памяти?
|
|||
|---|---|---|---|
|
#18+
Ну например уполовинить требуемый буфер. Или по невозможности обработать пометить файл как необрабатываемый и продолжить со следующим файлом. Подозреваю что я не совсем понял вопрос ибо если так просто б все было вопроса б не было :) сори если так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 16:41 |
|
||
|
Как обработать потенциальную нехватку памяти?
|
|||
|---|---|---|---|
|
#18+
esy301sНу например.... Усложним вопрос. Два потока (два куска кода): 1. WebLogic отвечает на HTTP запрос. 2. Пользовательская обработка. Тоже в нескольких потоках. Пользовательский процесс занял всю память. Когда работает поток WebLogic'а он пытается выделить буффер под HTTP запрос, запускается GC и падает с OutOfMemory. 1. Куда вставлять try ... catch..., если даже такую обработку вставили, как понять "кто виноват" и "что половинить" 2. Где гарантия, что для работы обработчика ошибок, осталось достаточно памяти ))) (можно попытаться настроить). 3. OutOfMemory не свидетельствует (как в C), что памяти нет. Оно лишь говорит, что GC подозревает, что памяти может не быть и дальше проводить garbage не разумно. Можно дать GC ключик и этой ошибки не будет. Будет по посинения мусор собирать и не выебы..ться. Т.ч. отсутствие ошибки, это не показатель, что все хорошо (настраивается). Я не спорю, что сделать можно. Но надо ли. Лично я бы, смотрел в сторону: 1. Нормальный алгоритм. Где требования к ресурсам не связаны (слабо связаны) с размером файла. 2. Если корреляция есть - ограничение на размер обрабатываемого файла 3. Если хочется полностью независимости по памяти - запускать дочернею JVM. IMHO & AFAIK ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 17:08 |
|
||
|
Как обработать потенциальную нехватку памяти?
|
|||
|---|---|---|---|
|
#18+
1. Самый неправильный пример это такой : Код: java 1. 2. 3. http://habrahabr.ru/post/169883/ на weak - можно построить кеш - ( как WeakHashMap) Array[] - в котором будут не ссылки на объекты а weak ссылки ,в которых будут ссылки на ваши объекты - тогда объекты могут быть уничтожены ... и wr.get() = вернет null. http://javarevisited.blogspot.ru/2014/03/difference-between-weakreference-vs-softreference-phantom-strong-reference-java.html 2. заменить разбор в памяти и перенести его в файлы ... будем много работы с диском, но так работают во всех конторах где есть задачи разбора больших файлов ... (логи, видео потоки итд ...) + либы типа Hadoop for Data Analytics , Hadoop MapReduce итд ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 17:11 |
|
||
|
Как обработать потенциальную нехватку памяти?
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsev... 1. Нормальный алгоритм. Где требования к ресурсам не связаны (слабо связаны) с размером файла. 2. Если корреляция есть - ограничение на размер обрабатываемого файла 3. Если хочется полностью независимости по памяти - запускать дочернею JVM. В принципе и я о том же, но вопрос был о программе парсящей файлы, собсно и ответил что если памяти недают попробовать жрать поменьше если меньше жрать нельзя матюкнутся и откатиться все ж лучше чем по оутофмемори вылететь с непонятным состоянием. Если обработать нельзя постараться предотвратить... Собственно это очевидные вещи же. Имхо дальнейшее обсуждение имеет смысл уже с уходом в предметную область что именно и как делается ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 17:36 |
|
||
|
Как обработать потенциальную нехватку памяти?
|
|||
|---|---|---|---|
|
#18+
redwhite902. Совсем плохая ситуация, если программа свалилась, перед этим правда часть распарсила, пользователь видит результат(частичный), смотрит, что выполнение закончилось и думает, что всё уже успешно закончилось. Как такое предотвратить? catch(Throwable) ? В идеале твой парсер должен быть - finite state machine . Это предполагает фиксированную память на его тело при бесконечном разнообразии входных файлов. Эту память можно умножить на количество экземпляров паралельных потоков если таковые будут. При благоприятном стечении обстоятельств такой парсер проработает долгие годы пока не упадёт железо или ОС на сервере. В некоторых параноидальных вариантах отказоустойчивости ты можешь запускать 2 java процесса( по аналогии со средой разработки Idea, которая запускает другие экземпляры компилляций как отдельные процессы). Первый будет хозяином (master-process). Он будет запускать парсеры и контролировать факт их успешного завершения. Как контролировать - это ты сам решишь. К примеру парсер после завершения может переименовывать файлы в *.$$$ как признак. Главное чтоб фиксация была атомарной с точки зрения диска. Для долго-играющих процессов можно ввести Watchdog timer, или Hearbit как признак того что процесс еще жив. И убивать его в случае тишины или неответа в заданный период. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 18:19 |
|
||
|
Как обработать потенциальную нехватку памяти?
|
|||
|---|---|---|---|
|
#18+
1. надо подсунуть парсеру данные, которые нагрузят его сильнее, чем реальные данные, и посмотреть как он будет работать. 2. если одного потока гарантированно хвататет, то можно при ооme останавливать парсящий поток и оставлять эту часть работы в очереди - для обработки другими потоками. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 23:43 |
|
||
|
|

start [/forum/topic.php?all=1&fid=59&tid=2127001]: |
0ms |
get settings: |
7ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
175ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
65ms |
get tp. blocked users: |
1ms |
| others: | 218ms |
| total: | 497ms |

| 0 / 0 |
