powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / NIO: OutOfMemoryError
25 сообщений из 29, страница 1 из 2
NIO: OutOfMemoryError
    #37921355
dgx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dgx
Гость
Есть код вида:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
FileOutputStream archFile = new FileOutputStream("out.dat");
try {
  FileChannel archFileCh = archFile.getChannel();
  for (int i = 0; i < SomeList.size(); i++) {
    ...

    FileChannel fis = new FileInputStream(srcfname).getChannel();
    try {
      fis.transferTo(0, fis.size(), archFileCh);
    } finally {
      fis.close();
    }
  }
} finally {
  archFile.close();
}


после обработки нескольких тысяч файлов возникает исключение

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
java.io.IOException: Map failed
	at sun.nio.ch.FileChannelImpl.map(Unknown Source)
	at sun.nio.ch.FileChannelImpl.transferToTrustedChannel(Unknown Source)
	at sun.nio.ch.FileChannelImpl.transferTo(Unknown Source)
	at kb_pack.ppp(kb_pack.java:132)
...

Caused by: java.lang.OutOfMemoryError: Map failed
	at sun.nio.ch.FileChannelImpl.map0(Native Method)
	... 14 more


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Мб.

Как диагностировать ошибку?
...
Рейтинг: 0 / 0
NIO: OutOfMemoryError
    #37921490
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FileChannel-ы не пробовали закрывать?
...
Рейтинг: 0 / 0
NIO: OutOfMemoryError
    #37921538
dgx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dgx
Гость
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.
for (int i = 0; i < SomeList.size(); i++) {
  FileOutputStream archFile = new FileOutputStream("out.dat");
  try {
    FileChannel archFileCh = archFile.getChannel();
    try {
      FileInputStream fi = new FileInputStream(SomeList.get(i).srcfname);
      try {
        FileChannel fis = fi.getChannel();
        try {
          fis.transferTo(0, fis.size(), archFileCh);
        } finally {
          fis.close();
        }
      } finally {
        fi.close();
      }
    } finally {
      archFileCh.close();
    }
  } finally {
    archFile.close();
  }
}


Та же ошибка на том же файле.

В JVM можно как-нибудь посмотреть счетчик этих file mapping objects?
...
Рейтинг: 0 / 0
NIO: OutOfMemoryError
    #37921541
Фотография schwa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dgx,

Excessive native memory growth with NIO due to finalization delay

У вас файлы большие небось. Попробуйте отдавать файлы transferTo частями.
...
Рейтинг: 0 / 0
NIO: OutOfMemoryError
    #37921566
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dgxТа же ошибка на том же файле.

Так с одним и тем же файлом проблемы?
...
Рейтинг: 0 / 0
NIO: OutOfMemoryError
    #37921590
dgx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dgx
Гость
schwaУ вас файлы большие небось.Большая часть из них не превышает 1Мб, но есть файлы до 150Мб. Файлов всего, наверное, тысяч 20. Общий размер получаемого файла должен быть где-то 4Гб.

BlazkowiczТак с одним и тем же файлом проблемы?За то время как я начал отслеживать эту ошибку (со вчерашнего вечера) - она постоянно возникает на одном и том же файле размером 84Мб. Перед ним успешно добавляются более 17 тысяч других файлов.
...
Рейтинг: 0 / 0
NIO: OutOfMemoryError
    #37921594
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dgxЗа то время как я начал отслеживать эту ошибку (со вчерашнего вечера) - она постоянно возникает на одном и том же файле размером 84Мб. Перед ним успешно добавляются более 17 тысяч других файлов.Я правильно понимаю, что суммарный размер этих семнадцати тысяч файлов - около полутора гигабайт?
...
Рейтинг: 0 / 0
NIO: OutOfMemoryError
    #37921595
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dgxБольшая часть из них не превышает 1Мб, но есть файлы до 150Мб. Файлов всего, наверное, тысяч 20. Общий размер получаемого файла должен быть где-то 4Гб.Насколько "не превышает"? Даже десять тысяч по мегабайту - уже десять гигабайт. Никак не четыре.
...
Рейтинг: 0 / 0
NIO: OutOfMemoryError
    #37921600
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вообще, даже не будучи программистом, я понимаю, что не надо пытаться отображать в память файл размером около четырёх гигабайт целиком .
Это невозможно на 32-разрядной системе и нежелательно (мягко говоря) на 64-разрядной.
...
Рейтинг: 0 / 0
NIO: OutOfMemoryError
    #37921617
dgx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dgx
Гость
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 дается команда скопировать данные. Команда целиком отобразить файл в память ей не дается. Во втором примере вообще выходной файл в каждом цикле затирается.
...
Рейтинг: 0 / 0
NIO: OutOfMemoryError
    #37921621
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dgxJVM дается команда скопировать данные.Нет такой команды. Есть "отобразить в память". Цель такого отображения - за рамками "разумения" JVM.Команда целиком отобразить файл в память ей не дается.Я не вижу кода, который задаёт размер отображаемого окна и переотображает его на разные части файла.

P.S. Если вам ехать, то копируйте "по рабоче-крестьянски" - через чтение-запись. Для буфера размером один-два мегабайта от способа копирования будет зависеть только загрузка проца.
...
Рейтинг: 0 / 0
NIO: OutOfMemoryError
    #37921623
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
... тем более, что на всякой "мелочёвке" NIO не даст никакого выигрыша - существенно время тратится, скорее всего, на открытие всех этих двадцати тысяч файлов.
...
Рейтинг: 0 / 0
NIO: OutOfMemoryError
    #37921624
dgx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dgx
Гость
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.
...
Рейтинг: 0 / 0
NIO: OutOfMemoryError
    #37921625
Фотография schwa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dgxНе замерял, но файл после ошибки был размером 2,2Гб.
Файлы размером больше 2 гигабайт нельзя так обрабатывать.
...
Рейтинг: 0 / 0
NIO: OutOfMemoryError
    #37921626
Фотография schwa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.к. offset и limit там внутрях эти буферов знаковые int-ы и ими больше 2 GB никак не адресовать.
...
Рейтинг: 0 / 0
NIO: OutOfMemoryError
    #37921627
dgx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dgx
Гость
schwaФайлы размером больше 2 гигабайт нельзя так обрабатывать.Где такое написано? И зачем тогда аргументы position и count типа long?
...
Рейтинг: 0 / 0
NIO: OutOfMemoryError
    #37921628
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.... между буферами приложения. В памяти.
Самые медленные операции - "считать с диска", "записать на диск" и "спозиционировать головки".
Поэтому "я подчеркнул".
...
Рейтинг: 0 / 0
NIO: OutOfMemoryError
    #37921632
dgx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dgx
Гость
schwaТ.к. offset и limit там внутрях эти буферов знаковые int-ы и ими больше 2 GB никак не адресовать.Ну смысл для копирования 1Гб файла выделять в памяти 1Гб буфер? Вы думаете, что sun'овцы только до этого могли додуматься, когда создавали java.nio?

Basil A. SidorovdgxJVM дается команда скопировать данные.Нет такой команды. Есть "отобразить в память". Цель такого отображения - за рамками "разумения" JVM.Команда целиком отобразить файл в память ей не дается.Я не вижу кода, который задаёт размер отображаемого окна и переотображает его на разные части файла.JVM дается команда скопировать данные из одного файла в другой. Команды использовать отображение в память ей не дается. Если на ОС, на которой исполняется этот код доступно отображение в память, JVM может использовать эту возможность по своему усмотрению. Нигде в коде не указывается, чтобы она целиком файл отображала в память.
...
Рейтинг: 0 / 0
NIO: OutOfMemoryError
    #37921633
Фотография schwa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dgxschwaФайлы размером больше 2 гигабайт нельзя так обрабатывать.Где такое написано? И зачем тогда аргументы position и count типа long?
Официально не помню где, но интернет кишит вопросами "почему nio как-то плохо работает на файлах больше 2 GB".
Перепишите на цикл вызов transferTo по кусочкам и проблема пропадет.
...
Рейтинг: 0 / 0
NIO: OutOfMemoryError
    #37921635
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dgxНу смысл для копирования 1Гб файла выделять в памяти 1Гб буфер? Вы думаете, что sun'овцы только до этого могли додуматься, когда создавали java.nio?NIO и лежащие в его основе каналы и буферы - доступ к хорошо оптимизированному по использованию ресурсов низкоуровневому API операционной системы. А разрабатывалось это API отнюдь не для копирования файлов.JVM дается команда скопировать данные из одного файла в другой.А вы внимательно прочитайте описание transferTo/transferFrom, которые передают данные из одного буфера в другой.
А это несколько отличается от OS/2 DosCopy и неизвестных мне аналогов файлового API других операционных систем.Нигде в коде не указывается, чтобы она целиком файл отображала в память.И? Где указано, что по умолчанию не могут и не будут использоваться все доступные ресурсы и даже сверх того?
...
Рейтинг: 0 / 0
NIO: OutOfMemoryError
    #37921733
dgx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dgx
Гость
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.
...
Рейтинг: 0 / 0
NIO: OutOfMemoryError
    #37921803
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dgxBasil A. SidorovА вы внимательно прочитайте описание transferTo/transferFrom, которые передают данные из одного буфера в другой.Вот не нашел я такого. Может использоваться один буфер - непосредственно кэш файловой системы ОС.Т.е. описание интерфейса функций transferFrom и transferTo в штатной документации для вас - не аргумент???Channel-to-channel transfers can potentially be extremely fast Вас, вероятно, привлекает выделенное жирным шрифтом? На то, что подчёркнуто - вы совсем не обращаете внимания?
Тогда повторю - в цепочке "считать в память из файла, записать из памяти в файл" - самое медленное "прочитать с диска, записать на диск и спозиционировать головки".
Нет, операции, где надо "бороться за каждый тик и байт" - существуют, но для линейных чтения/записи основной выигрыш даёт буферизация. Всё остальное - сопли.
...
Рейтинг: 0 / 0
NIO: OutOfMemoryError
    #37921968
dgx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dgx
Гость
Basil A. SidorovТ.е. описание интерфейса функций transferFrom и transferTo в штатной документации для вас - не аргумент???Из этого описания не следует, что JVM должна выделять в памяти какие-то дополнительные буферы.

Basil A. SidorovВас, вероятно, привлекает выделенное жирным шрифтом?Я привел цитаты, в которых говорится, что существуют реализации JVM (использующие соответствующие возможности ОС), в которых данные фактически хранятся только в кэше файловой системы и не копируются в другие области памяти. Ron Hitchens пишет, что некоторые ОС способны передавать данных так, что эти данные вообще не попадают в пользовательское пространство (т.е. в процесс JVM).

В Windows диспетчер кэша отслеживает, какие части и каких файлов находятся в кэше. Выделеняя явно буфер памяти в куче процесса и осуществляя копирование данных кодом (не страничным отображением), Вы:
1. лишаете диспетчер кэша возможности отследить какие данные в памяти соответствуют данным на диске, существенно снижая его возможности оптимизировать работу с устройством внешней памяти,
2. уменьшаете память, доступную под кэш ОС.
Все это приводит к увеличению количества:Basil A. Sidorovсамое медленное "прочитать с диска, записать на диск и спозиционировать головки".

И скажите, Вы этой дискуссией чего хотите добиться?
...
Рейтинг: 0 / 0
NIO: OutOfMemoryError
    #37922028
OOsalivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dgx,



второй ответ
...
Рейтинг: 0 / 0
NIO: OutOfMemoryError
    #37922215
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В Windows диспетчер кэша отслеживает, какие части и каких файлов находятся в кэше. Выделеняя явно буфер памяти в куче процесса и осуществляя копирование данных кодом (не страничным отображением), Вы:
1. лишаете диспетчер кэша возможности отследить какие данные в памяти соответствуют данным на диске, существенно снижая его возможности оптимизировать работу с устройством внешней памяти,
2. уменьшаете память, доступную под кэш ОС.Прекращайте бредить. Когда требуется объединить тысячи файлов в один, то никакой метод копирования не позволит не то чтобы убрать, а просто уменьшить накладные расходы на открытие файлов.
Я повторно озвучу размер буфера, который будет оптимальным для вашей задачи: один-два мегабайта .Все это приводит к увеличению количества:Basil A. Sidorovсамое медленное "прочитать с диска, записать на диск и спозиционировать головки".Прекращайте бредить. Изощрённая техника, которую вы пытаетесь (неправильно) применять, позволяет (лишь) сократить накладные расходы по копированию данных в памяти. Повлиять на дисковый ввод/вывод она не в состоянии.

P.S. Использование кэша при копировании файлов может быть просто вредным.
...
Рейтинг: 0 / 0
25 сообщений из 29, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / NIO: OutOfMemoryError
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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