Как зайти в Даркнет?!
25th January, 01:11
5
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
893
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
912
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4350
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Как избежать OutOfMemoryError при использовании Bytebuffers и NIO?
Я использую ByteBuffers и FileChannels для записи двоичных данных в файл. Когда я делаю это для больших файлов или последовательно для нескольких файлов, я получаю исключение OutOfMemoryError .
Я где-то читал, что использование Bytebuffers с NIO нарушено и его следует избегать. Кто-нибудь из вас уже сталкивался с подобной проблемой и нашел решение для эффективного сохранения больших объемов двоичных данных в файле java?
Является ли вариант jvm -XX:MaxDirectMemorySize правильным решением?
Проверьте сопоставленные байтовые буферы Java, также известные как 'direct buffers'. В основном, этот механизм использует систему подкачки виртуальной памяти OS для 'map' вашего буфера непосредственно на диск. OS будет управлять перемещением байтов на / из диска и памяти автоматически, очень быстро, и вам не придется беспокоиться об изменении параметров виртуальной машины. Это также позволит вам воспользоваться улучшенной производительностью NIO по сравнению с традиционной java потоковой i/o, без каких-либо странных хаков.
Единственные два улова, которые я могу придумать, это:
- В 32-разрядной системе вы ограничены общим объемом чуть менее 4 ГБ для всех сопоставленных байтовых буферов . (На самом деле это ограничение для моего приложения, и теперь я работаю на 64-битных архитектурах.)
- Реализация JVM специфична и не является обязательным требованием. Я использую Sun's JVM, и нет никаких проблем, но YMMV.
Кирк Пеппердайн (несколько известный гуру производительности Java) занимается веб-сайтом www.JavaPerformanceTuning.com, на котором есть еще некоторые детали MBB: советы по производительности NIO
Если вы обращаетесь к файлам случайным образом (читаете здесь, пропускаете, пишете там, перемещаетесь назад), то у вас есть проблема ;-)
Но если вы пишете только большие файлы,вы должны серьезно рассмотреть возможность использования потоков. java.io.FileOutputStream можно использовать непосредственно для записи файла байт за байтом или обернуть в любой другой поток (например , DataOutputStream, ObjectOutputStream ) для удобства записи поплавков, ints, строк или даже сериализуемых объектов. Подобные классы существуют и для чтения файлов.
Потоки предлагают вам удобство манипулирования произвольно большими файлами в (почти) произвольно малой памяти . Они являются предпочтительным способом доступа к файловой системе в подавляющем большинстве случаев.
Предыдущие два ответа кажутся довольно разумными. Что касается того, будет ли работать переключатель командной строки, то это зависит от того, как быстро ваш объем памяти достигнет предела. Если у вас недостаточно ram и виртуальной памяти, чтобы по крайней мере утроить объем доступной памяти, то вам нужно будет использовать одно из альтернативных предложений.
Использование метода transferFrom должно помочь в этом, предполагая, что вы пишете в канал постепенно, а не все сразу, как указывают предыдущие ответы.
Это может зависеть от конкретного поставщика JDK и версии.
Есть ошибка в GC в каком-то солнце JVMs. Нехватка прямой памяти не вызовет GC в основной куче, но прямая память будет закреплена мусором direct ByteBuffers в основной куче. Если основная куча в основном пуста, то они долго не собираются.
Это может сжечь вас, даже если вы не используете прямые буферы самостоятельно, потому что JVM может создавать прямые буферы от вашего имени. Например, запись непрямого ByteBuffer в SocketChannel создает прямой буфер под крышками для использования в фактической операции ввода-вывода.
Обходной путь состоит в том, чтобы использовать небольшое количество прямых буферов самостоятельно и держать их вокруг для повторного использования.