Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Маленький тест, :) 
:(
    Опции темы
redrick
Дата 20.8.2004, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 547
Регистрация: 7.1.2004
Где: Москва

Репутация: 3
Всего: 5



хм, спору нет, но вот вообще в С++ сообществе считается хорошим тоном не заставлять конструктор делать что-то кроме своих прямых обязанностей, т. е. инициаллизации полей _начальными_, а не появляющимися в процессе работы значениями. Думаю, если и можно придумать пример, в котором это правило будет нарушено и нарушение оправдано, то это получится довольно натянуто. Неговоря уже о тяжелой воспринимаемости такого кода (нужно лишний раз соображать что и где вызовется). В вышеприведенном примере я бы вынес все эти действия в функцию типа init_0() и явно вызывал бы ее.


--------------------
Имею Мнение Хрен Оспоришь   
PM MAIL ICQ   Вверх
Domestic Cat
Дата 20.8.2004, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



А что ж тут плохого? Я инициализирую суперкласс в init().
Для инициализации сабкласса мне нуzhно чо-то другое отпарсить, вот и все. Если учесть возможность того, что саблассы могут по-другому инициализировать поля, наследованные от суперкласса, то как раз все ок. Если не ошибаюсь, в C++ есть такая штука как
"resource acquisition is initialization". Да и вызов init() вполне нормальное
явление, см. Stroustrup, The C++ Programming Language, 2000, 14.4.1. Using Constructors
and Destructors.
init() , initParsers() могут инициализировать различные ресурсы, соответственно, можно один init() разбит' на несколько методов.

Это сообщение отредактировал(а) Domestic Cat - 20.8.2004, 16:23


--------------------

PM   Вверх
redrick
Дата 20.8.2004, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 547
Регистрация: 7.1.2004
Где: Москва

Репутация: 3
Всего: 5



вобщем здесь я уже немного "не в теме", поэтому не буду говорить и утверждать глупостей, но вот у Страуструпа насколько я понял идет речь как раз об использовании ресурсов, ну то есть памяти, а когда вы парсите там что то, то это уже никак нельзя назвать просто захватом ресурсов.

И вот ещё (опять же на правах чистого имхо) : если ваш детёнок инициализирует поля родителя по-другому нежели родитель, то стоило ли его вообще делать детёнком этого родителя ?


--------------------
Имею Мнение Хрен Оспоришь   
PM MAIL ICQ   Вверх
Domestic Cat
Дата 20.8.2004, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



Цитата(redrick @ 20.8.2004, 08:02)
если ваш детёнок инициализирует поля родителя по-другому нежели родитель, то стоило ли его вообще делать детёнком этого родителя ?


Например:
Код

class Submarine
{
   protected Engine engine;
   public Submarine()
   {
       init();
   }
   
   protected void init()
   {
       engine = new Engine();
   }
}
class NuclearSubmarine extends Submarine
{
   public NuclearSubmarine()
   {
   }
   
   protected void init()
   {
       engine = new NuclearEngine();
   }
}
class DieselSubmarine extends Submarine
{
   public DieselSubmarine()
   {
   }

   protected void init()
   {
       engine = new DieselEngine();
   }
}

class DieselSubmarineType2 extends DieselSubmarine
{
   public DieselSubmarineType2()
   {
   }
   
   protected void init()
   {
       engine = new DieselEngineType2();
   }
}
class DieselSubmarineType1 extends DieselSubmarine
{
   public DieselSubmarineType1()
   {
   }
   
   protected void init()
   {
       engine = new DieselEngineType1();
   }
}


Это сообщение отредактировал(а) Domestic Cat - 20.8.2004, 17:20


--------------------

PM   Вверх
Domestic Cat
Дата 20.8.2004, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



Давайте вернемся к теме.

Вопрос: какие проблемы могут возникнуть при запуске программы:
Код


public class Test extends Thread
{
   int[] array;
   
   public Test()
   {
       run();
   }
   
   public void run()
   {
       array = new int[10000];
   }
   public static void main(String [] arg)
   {
       for (int i = 0; i < 10000; i ++)
       {
           new Test();
       }
   }
}



--------------------

PM   Вверх
AntonSaburov
Дата 20.8.2004, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 51
Всего: 118



А эта строчка специально с пробелом (String []) ?
Цитата(Domestic @ 20.8.2004, 18:30)
public static void main(String [] arg)


А вообще 10000*10000 = 100 000 000 да еще на размер целого. Вывалится по нехватке памяти, если конечно опциями не добавить.
PM MAIL WWW ICQ   Вверх
Domestic Cat
Дата 20.8.2004, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



Цитата(AntonSaburov @ 20.8.2004, 08:50)
А эта строчка специально с пробелом (String []) ?


А разве на что-то влияет? smile.gif

Цитата(AntonSaburov @ 20.8.2004, 08:50)
А вообще 10000*10000 = 100 000 000 да еще на размер целого. Вывалится по нехватке памяти, если конечно опциями не добавить.


Хм. А сборщик мусора? Разве не должен он убирать все эти массивы? wink.gif
Добавлено @ 17:54
Ведь сразу после 1 пробега цикла ссылки на объект в памяти нет!


--------------------

PM   Вверх
redrick
Дата 20.8.2004, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 547
Регистрация: 7.1.2004
Где: Москва

Репутация: 3
Всего: 5



а сборщик мусора когда захочет, тогда и соберет - вовсе не обязательно сразуже

и вот еще такой вопрос : собственно где и какая ссылка на объект класса Test появляется после выполнения

new Test() ?

понятно, что эивет она в фигурных скобочках цикла только - но тогда, кстати, все объекты будут жить, пока цикл не закончится и GC нам тут уж никак не поможет


--------------------
Имею Мнение Хрен Оспоришь   
PM MAIL ICQ   Вверх
Domestic Cat
Дата 20.8.2004, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



Цитата(redrick @ 20.8.2004, 09:58)
а сборщик мусора когда захочет, тогда и соберет - вовсе не обязательно сразуже


Если создается много объектов - он начнет работать. Зуб даю. Редиской буду.
Ну а проверить можно, запуская с флагом -verbose:gc. В данном случае сбоки мусора будут, но незначительные.

Цитата(redrick @ 20.8.2004, 09:58)
и вот еще такой вопрос : собственно где и какая ссылка на объект класса Test появляется после выполнения


А ее нету - прoграмма на объект не ссылается, следовательно , он подлежит сборке

Цитата(redrick @ 20.8.2004, 09:58)
понятно, что эивет она в фигурных скобочках цикла только - но тогда, кстати, все объекты будут жить, пока цикл не закончится и GC нам тут уж никак не поможет


Чтобы проверить, нужно поставить в цикл просто

int[] array = new int[10000];

и запустить с тем же флагом.
Уууупс smile.gif Не будут они жить smile.gif


--------------------

PM   Вверх
redrick
Дата 20.8.2004, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 547
Регистрация: 7.1.2004
Где: Москва

Репутация: 3
Всего: 5



насчет GC - ну это хорошо, но формально никаких гарантий нет и полагаться на это нельзя совсем. А то сделаем из Sun ещё один M$ (http://www.joelonsoftware.com/articles/APIWar.html)

а насчет времени жизни - это я ошибся, т. е. не знал =)

забавно получается - создаем объект и он сразу может умирать


--------------------
Имею Мнение Хрен Оспоришь   
PM MAIL ICQ   Вверх
Domestic Cat
Дата 21.8.2004, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



В общем, проблема такая: если поставить в main

Код

...
System.out.println(Runtime.getRuntime().freeMemory());
for (int i = 0; i < 10000; i ++)
{
    new Test();
}
System.out.println(Runtime.getRuntime().freeMemory());
...


то окажется, что new Test() забивает память очень серьeзно; а gc работать и не собирается
(хотя он на самом деле чего-то собирает, по нескольку килобайт несколько раз smile.gif )

Заменим new Test() чем-нибудь другим- будь то new Object(), new Integer() или int[] arr = new int[10000] - все ок, в конце память почти не истрачена, да и gc трудится хорошо. Вопрос: почему? Подсказка n1 : в коде есть логическая ошибка. Но даже если ее найти, то почему gc не убирает мертвые объекты?


--------------------

PM   Вверх
DarkDS
Дата 22.8.2004, 01:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 748
Регистрация: 6.5.2003
Где: Таллинн, Эстония

Репутация: 11
Всего: 16



Цитата(Domestic @ 20.8.2004, 15:54)
Если я все-таки хочу вызвать a.init(), я вставлю super() в c.init().
А если я не хочу его вызвать? Здесь -то все просто, а в C++ нужно что сделать? По-моему, только переписать А, и соответственно, все классы от него наследующие.

Для этого в сях есть виртуальность smile.gif
PM MAIL   Вверх
Guest
Дата 23.8.2004, 09:49 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Объекты не "мертвые". Они находятся в состоянии NEW.
GC не трогает объект класса Thread до тех пор, пока он не окажется в состоянии TERMINATED
  Вверх
AntonSaburov
Дата 23.8.2004, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 51
Всего: 118



Цитата(Guest @ 23.8.2004, 10:49)
Объекты не "мертвые". Они находятся в состоянии NEW.
GC не трогает объект класса Thread до тех пор, пока он не окажется в состоянии TERMINATED

А можно поподробнее - что-то я такого не встречал (все знать нельзя smile.gif ). Было бы крайне интересно.
PM MAIL WWW ICQ   Вверх
Guest
Дата 23.8.2004, 14:50 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











http://java.sun.com/j2se/1.5.0/docs/api/ja...read.State.html

http://www.codeguru.com/java/tij/tij0155.shtml#Heading483

When main( ) creates the Thread objects it isn’t capturing the handles for any of them. An ordinary object would be fair game for garbage collection, but not a Thread. Each Thread “registers” itself so there is actually a reference to it someplace and the garbage collector can’t clean it up until the thread exits its run( ) and dies
  Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0843 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.