Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Связные списки и сборщик мусора в Java  (Прочитано 12483 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« : 17-05-2008 10:41 » 

Экспериментирую со связными списками. Насколько я понимаю, идентификаторы объектов в Java являются ссылками, и поэтому список сконструировать можно.

Программа получает простые числа от 1 до N и использует связный список для хранения ранее вычисленных значений. Код такой:
Код: (Java)
public class simpleNumber {
        private static SimpleNumber s = null, e = null;

        private static boolean checkSimpleNumber(int x) {
                int r = (int)Math.sqrt(x);
                boolean f = true;
                SimpleNumber p = s;
                while(p != null && p.number <= r && f) {
                        if(x % p.number == 0)
                                f = false;
                        p = p.next;
                }
                if(f && x > 1) {
                        p = new SimpleNumber();
                        p.number = x;
                        p.next = null;
                        if(e != null)
                                e.next = p;
                        e = p;
                        if(s == null)
                                s = p;
                }
                return f;
        }

        public static void main(String[] args) {
                for(int i = 1; i <= 100000000; i += i > 2 ? 2 : 1)
                        if(checkSimpleNumber(i))
                                System.out.println(i);
        }
}

class SimpleNumber {
        public int number;
        public SimpleNumber next;
}
Исполняю на Java 6 SE под Linux.

Она бодро работает примерно до 70 млн (и примерно 70 Мб расходуемой памяти), затем на 71-м миллионе она начинает жутко тормозить и потом молча дохнет. Подозреваю, что у сборщика мусора сносит крышу от необходимости проверять ссылки на объекты до конца такого большого списка.

Кто может компетентно объяснить, что происходит?

P.S. Не надо советовать переписать или оптимизировать программу. Меня интересует не это, а именно возможность работы с длинными связными списками.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 17-05-2008 11:21 » 

dimka, а если попробовать отловить ошибку?

Сомневаюсь, что сборщик мусора будет проверять объект с ненулевым счетчиком ссылок - это пустая трата времени.

У "удаляемого" объекта, я думаю, полезно обнулить члены-ссылки.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 17-05-2008 11:46 » 

До удаления даже ещё и не доходит. В этой программке вообще удаления нет - только в конце перед завершением процесса, может, сборщик мусора приберётся.

Проверил на 5-й версии - аналогично. Проверяю на 1.4.2.

Попробую под отладчиком пустить.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Вахмурка
Помогающий

ru
Offline Offline
Пол: Мужской
Программист


WWW
« Ответ #3 : 17-05-2008 13:19 » 

 Тип int насколько мне известно занимает четыре байта, плюс сылка не следующей элемент. 70 мегов точно не будет. Может это просто быстродействие виртуальной памяти сказывается? А для того чтобы дать Java - программе занимать много памяти её нужно запустить с параметром в командной строке. Правдо какой параметр не помню.
Записан

Программа – это мысли спрессованные в код.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 17-05-2008 14:00 » 

А на 1.4.2 работает. Правда, заметно медленней, и больше памяти потребляет, но не валится.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 17-05-2008 15:12 » 

Вахмурка, возможно. Валится по OutOfMemoryError. Только я такого ключа у java нашёл. Есть ключик -D, который позволяет какие-то там настройки устанавливать. А какие?
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 17-05-2008 15:22 » 

Значит надо пускать:

Код: (Bash)
java -Xmx150000000 simpleNumber
Потребляет около 100 Мб памяти.

А вообще этот лимит по умолчанию можно снять?
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines