|
|
|
NIO: OutOfMemoryError
|
|||
|---|---|---|---|
|
#18+
Есть код вида: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. после обработки нескольких тысяч файлов возникает исключение Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. java version "1.6.0_33" Java(TM) SE Runtime Environment (build 1.6.0_33-b03) Java HotSpot(TM) Client VM (build 20.8-b03, mixed mode, sharing) Windows 7 32 бит Размер памяти у процесса в диспетчере задач не превышает 40Мб (запущен с опцией -Xmx1500m), в jvisualvm размер Heap не превосходит 20Мб. Как диагностировать ошибку? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2012, 20:09:04 |
|
||
|
NIO: OutOfMemoryError
|
|||
|---|---|---|---|
|
#18+
FileChannel-ы не пробовали закрывать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2012, 00:40:22 |
|
||
|
NIO: OutOfMemoryError
|
|||
|---|---|---|---|
|
#18+
BlazkowiczFileChannel-ы не пробовали закрывать?Переписал так: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. Та же ошибка на том же файле. В JVM можно как-нибудь посмотреть счетчик этих file mapping objects? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2012, 09:57:41 |
|
||
|
NIO: OutOfMemoryError
|
|||
|---|---|---|---|
|
#18+
dgx, Excessive native memory growth with NIO due to finalization delay У вас файлы большие небось. Попробуйте отдавать файлы transferTo частями. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2012, 10:24:05 |
|
||
|
NIO: OutOfMemoryError
|
|||
|---|---|---|---|
|
#18+
dgxТа же ошибка на том же файле. Так с одним и тем же файлом проблемы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2012, 11:40:58 |
|
||
|
NIO: OutOfMemoryError
|
|||
|---|---|---|---|
|
#18+
schwaУ вас файлы большие небось.Большая часть из них не превышает 1Мб, но есть файлы до 150Мб. Файлов всего, наверное, тысяч 20. Общий размер получаемого файла должен быть где-то 4Гб. BlazkowiczТак с одним и тем же файлом проблемы?За то время как я начал отслеживать эту ошибку (со вчерашнего вечера) - она постоянно возникает на одном и том же файле размером 84Мб. Перед ним успешно добавляются более 17 тысяч других файлов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2012, 12:40:44 |
|
||
|
NIO: OutOfMemoryError
|
|||
|---|---|---|---|
|
#18+
dgxЗа то время как я начал отслеживать эту ошибку (со вчерашнего вечера) - она постоянно возникает на одном и том же файле размером 84Мб. Перед ним успешно добавляются более 17 тысяч других файлов.Я правильно понимаю, что суммарный размер этих семнадцати тысяч файлов - около полутора гигабайт? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2012, 12:45:30 |
|
||
|
NIO: OutOfMemoryError
|
|||
|---|---|---|---|
|
#18+
dgxБольшая часть из них не превышает 1Мб, но есть файлы до 150Мб. Файлов всего, наверное, тысяч 20. Общий размер получаемого файла должен быть где-то 4Гб.Насколько "не превышает"? Даже десять тысяч по мегабайту - уже десять гигабайт. Никак не четыре. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2012, 12:50:08 |
|
||
|
NIO: OutOfMemoryError
|
|||
|---|---|---|---|
|
#18+
А вообще, даже не будучи программистом, я понимаю, что не надо пытаться отображать в память файл размером около четырёх гигабайт целиком . Это невозможно на 32-разрядной системе и нежелательно (мягко говоря) на 64-разрядной. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2012, 12:57:14 |
|
||
|
NIO: OutOfMemoryError
|
|||
|---|---|---|---|
|
#18+
Excessive native memory growth with NIO due to finalization delayThe java.nio package added DirectByteBuffer and MappedByteBuffer classes that allocate native memory on the native C heap and via a platform specific memory mapping function (mmap()). ... the native C heap grows to nearly 2G before a minor GC event occurs.Проблема, я так понимаю, не в "native C heap" - память занимаемая процессом не превышает 40Мб (в нее же включается native куча?). Насчет "via a platform specific memory mapping function" - не знаю как посмотреть эту память, но общие показатели памяти системы вполне нормальные. Например, "Доступная память" во время работы не опускается меньше 2Гб. Basil A. SidorovЯ правильно понимаю, что суммарный размер этих семнадцати тысяч файлов - около полутора гигабайт?Не замерял, но файл после ошибки был размером 2,2Гб. Basil A. SidorovНасколько "не превышает"? Даже десять тысяч по мегабайту - уже десять гигабайт. Никак не четыре.Много файлов размером меньше килобайта, много - 2-3 килобайта. Basil A. Sidorovне надо пытаться отображать в память файл размером около четырёх гигабайт целиком JVM дается команда скопировать данные. Команда целиком отобразить файл в память ей не дается. Во втором примере вообще выходной файл в каждом цикле затирается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2012, 13:38:08 |
|
||
|
NIO: OutOfMemoryError
|
|||
|---|---|---|---|
|
#18+
dgxJVM дается команда скопировать данные.Нет такой команды. Есть "отобразить в память". Цель такого отображения - за рамками "разумения" JVM.Команда целиком отобразить файл в память ей не дается.Я не вижу кода, который задаёт размер отображаемого окна и переотображает его на разные части файла. P.S. Если вам ехать, то копируйте "по рабоче-крестьянски" - через чтение-запись. Для буфера размером один-два мегабайта от способа копирования будет зависеть только загрузка проца. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2012, 13:48:40 |
|
||
|
NIO: OutOfMemoryError
|
|||
|---|---|---|---|
|
#18+
... тем более, что на всякой "мелочёвке" NIO не даст никакого выигрыша - существенно время тратится, скорее всего, на открытие всех этих двадцати тысяч файлов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2012, 13:55:57 |
|
||
|
NIO: OutOfMemoryError
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovНет такой команды. Есть "отобразить в память". Цель такого отображения - за рамками "разумения" JVM. Basil A. Sidorovкопируйте "по рабоче-крестьянски" - через чтение-запись. Для буфера размером один-два мегабайта от способа копирования будет зависеть только загрузка проца. JDK apidocs transferToThis method is potentially much more efficient than a simple loop that reads from this channel and writes to the target channel. Many operating systems can transfer bytes directly from the filesystem cache to the target channel without actually copying them. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2012, 13:59:00 |
|
||
|
NIO: OutOfMemoryError
|
|||
|---|---|---|---|
|
#18+
dgxНе замерял, но файл после ошибки был размером 2,2Гб. Файлы размером больше 2 гигабайт нельзя так обрабатывать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2012, 14:01:27 |
|
||
|
NIO: OutOfMemoryError
|
|||
|---|---|---|---|
|
#18+
Т.к. offset и limit там внутрях эти буферов знаковые int-ы и ими больше 2 GB никак не адресовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2012, 14:02:50 |
|
||
|
NIO: OutOfMemoryError
|
|||
|---|---|---|---|
|
#18+
schwaФайлы размером больше 2 гигабайт нельзя так обрабатывать.Где такое написано? И зачем тогда аргументы position и count типа long? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2012, 14:03:42 |
|
||
|
NIO: OutOfMemoryError
|
|||
|---|---|---|---|
|
#18+
dgxBasil A. SidorovНет такой команды. Есть "отобразить в память". Цель такого отображения - за рамками "разумения" JVM.И? Basil A. Sidorovкопируйте "по рабоче-крестьянски" - через чтение-запись. Для буфера размером один-два мегабайта от способа копирования будет зависеть только загрузка проца . JDK apidocs transferToThis method is potentially much more efficient than a simple loop that reads from this channel and writes to the target channel. Many operating systems can transfer bytes directly from the filesystem cache to the target channel without actually copying them.... между буферами приложения. В памяти. Самые медленные операции - "считать с диска", "записать на диск" и "спозиционировать головки". Поэтому "я подчеркнул". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2012, 14:04:26 |
|
||
|
NIO: OutOfMemoryError
|
|||
|---|---|---|---|
|
#18+
schwaТ.к. offset и limit там внутрях эти буферов знаковые int-ы и ими больше 2 GB никак не адресовать.Ну смысл для копирования 1Гб файла выделять в памяти 1Гб буфер? Вы думаете, что sun'овцы только до этого могли додуматься, когда создавали java.nio? Basil A. SidorovdgxJVM дается команда скопировать данные.Нет такой команды. Есть "отобразить в память". Цель такого отображения - за рамками "разумения" JVM.Команда целиком отобразить файл в память ей не дается.Я не вижу кода, который задаёт размер отображаемого окна и переотображает его на разные части файла.JVM дается команда скопировать данные из одного файла в другой. Команды использовать отображение в память ей не дается. Если на ОС, на которой исполняется этот код доступно отображение в память, JVM может использовать эту возможность по своему усмотрению. Нигде в коде не указывается, чтобы она целиком файл отображала в память. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2012, 14:13:44 |
|
||
|
NIO: OutOfMemoryError
|
|||
|---|---|---|---|
|
#18+
dgxschwaФайлы размером больше 2 гигабайт нельзя так обрабатывать.Где такое написано? И зачем тогда аргументы position и count типа long? Официально не помню где, но интернет кишит вопросами "почему nio как-то плохо работает на файлах больше 2 GB". Перепишите на цикл вызов transferTo по кусочкам и проблема пропадет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2012, 14:14:27 |
|
||
|
NIO: OutOfMemoryError
|
|||
|---|---|---|---|
|
#18+
dgxНу смысл для копирования 1Гб файла выделять в памяти 1Гб буфер? Вы думаете, что sun'овцы только до этого могли додуматься, когда создавали java.nio?NIO и лежащие в его основе каналы и буферы - доступ к хорошо оптимизированному по использованию ресурсов низкоуровневому API операционной системы. А разрабатывалось это API отнюдь не для копирования файлов.JVM дается команда скопировать данные из одного файла в другой.А вы внимательно прочитайте описание transferTo/transferFrom, которые передают данные из одного буфера в другой. А это несколько отличается от OS/2 DosCopy и неизвестных мне аналогов файлового API других операционных систем.Нигде в коде не указывается, чтобы она целиком файл отображала в память.И? Где указано, что по умолчанию не могут и не будут использоваться все доступные ресурсы и даже сверх того? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2012, 14:28:47 |
|
||
|
NIO: OutOfMemoryError
|
|||
|---|---|---|---|
|
#18+
schwaФайлы размером больше 2 гигабайт нельзя так обрабатывать. Basil A. SidorovНигде в коде не указывается, чтобы она целиком файл отображала в память.И? Где указано, что по умолчанию не могут и не будут использоваться все доступные ресурсы и даже сверх того?Вобщем да. HotSpot JVM в случае transferTo(), похоже, пытается полностью отображать (File Mapping) файл на память. Попытка скопировать большие файлы (уже даже 300Мб) таким способом приводит той же или похожим ошибкам. И, вроде бы, отображения от предыдущих вызовов еще какое-то время существуют, занимая адресное пространство и память. Basil A. SidorovJVM дается команда скопировать данные из одного файла в другой.А вы внимательно прочитайте описание transferTo/transferFrom, которые передают данные из одного буфера в другой.Вот не нашел я такого. Может использоваться один буфер - непосредственно кэш файловой системы ОС. JDK FileChannelBytes can be transferred from a file to some other channel, and vice versa, in a way that can be optimized by many operating systems into a very fast transfer directly to or from the filesystem cache. "Java NIO" by Ron HitchensThe transferTo() and transferFrom() methods allow you to cross-connect one channel to another, eliminating the need to pass data through an intermediate buffer. ... Channel-to-channel transfers can potentially be extremely fast, especially where the underlying operating system provides native support. Some operating systems can perform direct transfers without ever passing the data through user space. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2012, 18:36:50 |
|
||
|
NIO: OutOfMemoryError
|
|||
|---|---|---|---|
|
#18+
dgxBasil A. SidorovА вы внимательно прочитайте описание transferTo/transferFrom, которые передают данные из одного буфера в другой.Вот не нашел я такого. Может использоваться один буфер - непосредственно кэш файловой системы ОС.Т.е. описание интерфейса функций transferFrom и transferTo в штатной документации для вас - не аргумент???Channel-to-channel transfers can potentially be extremely fast Вас, вероятно, привлекает выделенное жирным шрифтом? На то, что подчёркнуто - вы совсем не обращаете внимания? Тогда повторю - в цепочке "считать в память из файла, записать из памяти в файл" - самое медленное "прочитать с диска, записать на диск и спозиционировать головки". Нет, операции, где надо "бороться за каждый тик и байт" - существуют, но для линейных чтения/записи основной выигрыш даёт буферизация. Всё остальное - сопли. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2012, 21:13:01 |
|
||
|
NIO: OutOfMemoryError
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovТ.е. описание интерфейса функций transferFrom и transferTo в штатной документации для вас - не аргумент???Из этого описания не следует, что JVM должна выделять в памяти какие-то дополнительные буферы. Basil A. SidorovВас, вероятно, привлекает выделенное жирным шрифтом?Я привел цитаты, в которых говорится, что существуют реализации JVM (использующие соответствующие возможности ОС), в которых данные фактически хранятся только в кэше файловой системы и не копируются в другие области памяти. Ron Hitchens пишет, что некоторые ОС способны передавать данных так, что эти данные вообще не попадают в пользовательское пространство (т.е. в процесс JVM). В Windows диспетчер кэша отслеживает, какие части и каких файлов находятся в кэше. Выделеняя явно буфер памяти в куче процесса и осуществляя копирование данных кодом (не страничным отображением), Вы: 1. лишаете диспетчер кэша возможности отследить какие данные в памяти соответствуют данным на диске, существенно снижая его возможности оптимизировать работу с устройством внешней памяти, 2. уменьшаете память, доступную под кэш ОС. Все это приводит к увеличению количества:Basil A. Sidorovсамое медленное "прочитать с диска, записать на диск и спозиционировать головки". И скажите, Вы этой дискуссией чего хотите добиться? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2012, 08:45:38 |
|
||
|
NIO: OutOfMemoryError
|
|||
|---|---|---|---|
|
#18+
В Windows диспетчер кэша отслеживает, какие части и каких файлов находятся в кэше. Выделеняя явно буфер памяти в куче процесса и осуществляя копирование данных кодом (не страничным отображением), Вы: 1. лишаете диспетчер кэша возможности отследить какие данные в памяти соответствуют данным на диске, существенно снижая его возможности оптимизировать работу с устройством внешней памяти, 2. уменьшаете память, доступную под кэш ОС.Прекращайте бредить. Когда требуется объединить тысячи файлов в один, то никакой метод копирования не позволит не то чтобы убрать, а просто уменьшить накладные расходы на открытие файлов. Я повторно озвучу размер буфера, который будет оптимальным для вашей задачи: один-два мегабайта .Все это приводит к увеличению количества:Basil A. Sidorovсамое медленное "прочитать с диска, записать на диск и спозиционировать головки".Прекращайте бредить. Изощрённая техника, которую вы пытаетесь (неправильно) применять, позволяет (лишь) сократить накладные расходы по копированию данных в памяти. Повлиять на дисковый ввод/вывод она не в состоянии. P.S. Использование кэша при копировании файлов может быть просто вредным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2012, 18:04:02 |
|
||
|
|

start [/forum/topic.php?fid=59&fpage=273&tid=2131111]: |
0ms |
get settings: |
14ms |
get forum list: |
21ms |
check forum access: |
7ms |
check topic access: |
7ms |
track hit: |
46ms |
get topic data: |
19ms |
get forum data: |
5ms |
get page messages: |
66ms |
get tp. blocked users: |
2ms |
| others: | 348ms |
| total: | 535ms |

| 0 / 0 |
