Привет, я использую jdk7 и ram 6GB с процессором intel corei5. У меня есть Java-код, который имеет размер arraylist более 6000, и каждый элемент в этом массиве содержит 12 двойных значений. Скорость обработки значительно уменьшилась, и теперь она принимает около 20 минут для запуска всего кода.
Что делает код, выглядит следующим образом:
Есть около 4500 итераций, происходящих из-за вложенных циклов... и на каждой итерации читается файл размером 400 Кб, и происходит некоторая обработка, а некоторые значения хранятся в arraylist.
Как только аррайалист готов, значения arraylist записываются в другой файл через csvwriter.и затем я использовал jtable, а jtable также требовал, чтобы arraylist ссылался на некоторые значения в этом arraylist.so в основном я не могу очистить этого arraylist.
Я дал значения для памяти кучи следующим образом
-Xms1024M -Xmx4096M
Я новичок в программировании, и я довольно смущен относительно того, что я должен делать? Могу ли я увеличить размер кучи больше, чем это? Это поможет? Мой старший предлагает использовать память на жестком диске для хранения элементов или обработки arraylist, но я сомневаюсь, что это возможное. Помогите. Любая помощь будет оценена
12 x 8 x 6000 удваивают не собираются занимать значительное количество памяти
Если скорость вашей программы становится все медленнее каждый раз, пока она в конечном итоге не сработает с OutOfMemoryError, тогда возможно, что у вас есть ошибка кодирования, вызывающая утечку памяти.
В этом вопросе есть несколько примеров причин утечки памяти в Java.
Использование VisualVM или некоторых ручных протоколов поможет определить проблему. Также могут помочь статический код anaylsers, такой как FindBugs или PMD.
Размер кучи не является вашей проблемой. Когда у вас есть один из них, вы увидите OutOfMemoryError
.
Обычно то, что вы делаете, когда сталкиваетесь с такими проблемами производительности, как это, является профилем, либо с помощью чего-то вроде VisualVM
либо вручную, используя System.nanoTime()
чтобы отслеживать, какая часть вашего кода является узким местом. Оттуда вы убедитесь, что используете соответствующие структуры данных, алгоритмы и т.д., А затем посмотрите, где вы можете распараллелить свой код.
Наверное, вы как-то утечка JTable
. Это может легко случиться с Listeners, TableSorters и т.д. Правильный инструмент скажет вам, но лучшим способом является ИМХО, чтобы разложить проблему.
Либо это часть GUI, что создает проблемы или нет. В идеале оставшаяся программа должна быть полностью независимой от графического интерфейса, поэтому вы можете запускать ее изолированно, и вы увидите, что происходит.
Мой старший предлагает использовать память на жестком диске для хранения элементов или обработки arraylist, но я сомневаюсь, что это возможно.
Многое возможно, но мало что имеет смысл. Если вы действительно храните только 12 x 8 x 6000 удваивается, тогда это не имеет никакого смысла. Даже с большими издержками Double
, это всего несколько мегабайт.
Другая идея: если все данные, которые вам нужны, вписываются в память, вы можете попробовать прочитать все это заранее. Это гарантирует, что вы не храните несколько копий.
8*12*6000 = 576000
меньше 1 МБ. Похоже, у вас есть алгоритмическая проблема. Если вы обновите свой вопрос с более подробной информацией о том, какую обработку вы выполняете, мы сможем помочь вам лучше.