![]() |
|
| Правила Форума редакция от 22.06.2020 |
|
|||||||
|
|
Окажите посильную поддержку, мы очень надеемся на вас. Реквизиты для переводов ниже. |
|
![]() |
|
|
Опции темы | Опции просмотра |
Language
|
|
|
#16
|
|||||||||||||||||||||||
|
Новичок
Пол:
Регистрация: 09.05.2009
Сообщений: 1
Репутация: 0
|
int i = 5; i = ++i + ++i;
см. http://lurkmore.ru/%2B%2Bi_%2B_%2B%2Bi
Это сделать просто, описано в литературе. Этот тест родился в результате изучения загрузки классов. Код:
public class InitTest {
public static void main(String[] args) {
BB x = new BB();
System.out.println("b="+Integer.toString(x.b));
}
}//main
class AA{
protected void init(){}
public AA(){
init();
}
}
class BB extends AA{
int b = 1;
protected void init(){
b=2;
}
public BB(){}
}
|
|||||||||||||||||||||||
|
|
|
| Реклама: | hp m211dw | фильм жажда славы | купить серьги для девочки | Мебельный магазин: кровать складная - Переходи на сайт! | мозырь лясковичи |
|
|
#17
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
В Java это 6 + 7 , без вариантов
Ссылочку если можно... .
А подробней нельзя? В чём тут соль? ... На мой последний вопрос по сборке мусора, кто нибудь знает ответ?
__________________
Лучше сидеть в маленькой душной пивной , чем работать на большом светлом заводе...
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
#18
|
|||||||||||||||||||||||
|
Неактивный пользователь
Пол:
Регистрация: 16.01.2009
Сообщений: 38
Репутация: 11
|
После выхода из цикла не останется ни одной ссылки на объект (так как переменная объявлена внутри цикла и ее область видимости - тело цикла, ограниченное {}). Значит сборщик мусора получит все объекты, созданные в теле цикла. |
|||||||||||||||||||||||
|
|
|
|
|
#19
|
|||||||||||||||||||||||
Значит по Вашему получается 4 объекта? У меня получается 1 объект... . Попробую обосновать > В цикле создаётся новый объект 4 раза, но ссылка на все объекты одна. Значит когда создаётся скажем второй объект, ссылка на первый созданный объект пропадает. А вроде бы, если на объект нет никакой ссылки, то незаметно подкрадывается ... garbage collector и хавает объект за милую душу. Блин! Как это проверить програмно? Кто знает? По моему так, или? ![]()
__________________
Лучше сидеть в маленькой душной пивной , чем работать на большом светлом заводе...
Последний раз редактировалось ana; 13.05.2009 в 21:32.. |
||||||||||||||||||||||||
|
|
|
|
|
#20
|
|
Неактивный пользователь
Регистрация: 18.01.2008
Сообщений: 7
Репутация: 1
|
"там же и остаются" - это только область видимости внутри скобок. Переменные, созданные где-либо в методе, создаются в стеке и уничтожаются только после возвращения из метода. |
|
|
|
|
|
#21
|
|||||||||||||||||||||||
Так они удаляются после выхода из области видимости, или при выходе из метода? ![]()
__________________
Лучше сидеть в маленькой душной пивной , чем работать на большом светлом заводе...
|
||||||||||||||||||||||||
|
|
|
|
|
#22
|
|
Неактивный пользователь
Пол:
Регистрация: 16.01.2009
Сообщений: 38
Репутация: 11
|
Сборщик мусора - весьма загадочная штука. Он может "отработать" сразу после того, как ссылок на объект не стало, а может и вообще не быть вызван. Поэтому конкретно сказать, в какой момент какие объекты будут именно "собраны" сборщиком я затрудняюсь...
|
|
|
|
|
|
#23
|
|||||||||||||||||||||||
Это можно лекго проверить, сделаем для этого простой класс со статическими переменными... Код:
class Nowa {
static int created = 0;
static int finalized = 0;
int i;
Nowa() {
i = ++created;
System.out.println("Object NOWA created: " + i);
}
public void finalize() {
finalized++;
}
}
При вызове конструктора мы увеличиваем статическую переменную и пишем в консоль, какой по счёту объект мы создали. А в методе finalize() [Кто не знает, он вызывается перед уборкой мусора] увеличиваем другую статическую переменную, что бы узнать, а сколько раз был вызван этот метод, или другими словами, сколько раз сборщик мусора прошёлся по нашему объекту безжалостно его уничтожая и освобождая такую нужную память, для более высоких дел ... Теперь вернёмся к нашей задаче и попробуем разобраться, а сколько объектов будет доступно для garbage collector после выполнения цикла в main? Код:
public class Garbage {
public static void main(String[] args) {
for (int i = 1; i < 5; i++) {
Nowa nowa = new Nowa();
}
System.gc();
System.out.println("Total finalized = " + Nowa.finalized);
}
}
![]()
__________________
Лучше сидеть в маленькой душной пивной , чем работать на большом светлом заводе...
Последний раз редактировалось ana; 21.05.2009 в 07:48.. |
||||||||||||||||||||||||
|
|
|
|
|
#24
|
|
Неактивный пользователь
Пол:
Регистрация: 16.01.2009
Сообщений: 38
Репутация: 11
|
У меня получилось 0. Что говорит о том, что сборщик мусора, по всей вероятности, вообще не запускался не смотря на System.gc().
|
|
|
|
|
|
#25
|
|||||||||||||||||||||||
У меня тоже, пока не понял почему ... ![]() А сколько получится если создать объекты без указателя? т.е. вместо Код:
Nowa nowa = new Nowa(); Код:
new Nowa();
__________________
Лучше сидеть в маленькой душной пивной , чем работать на большом светлом заводе...
Последний раз редактировалось ana; 22.05.2009 в 08:57.. |
||||||||||||||||||||||||
|
|
|
|
|
#26
|
|||||||||||||||||||||||
|
Если увеличить число итераций, то можно увидеть как и когда начинает срабатывать сборщик мусора.
Если увеличить количество итераций например до 100, тогда можно будет увидеть как включается сборщик мусора> Код:
package cc.nowa;
/**
* Демонстрация сборщика мусора и финализации
*/
class Nowa {
static int created = 0;
static int finalized = 0;
int i;
Nowa() {
i = ++created;
}
public void finalize() {
finalized++;
}
}
public class Garbage {
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
Nowa nowa = new Nowa();
}
System.gc();
System.out.println("... and total finalized = " + Nowa.finalized);
}
} // /:~
Если немного модернизировать код, и заставить убирать мусор скажем после 1000 объектов, то результат меня озадачил. Вот код> Код:
package cc.nowa;
/**
* Демонстрация сборщика мусора и финализации
*/
class Nowa {
static int created = 0;
static int finalized = 0;
int i;
Nowa() {
i = ++created;
}
public void finalize() {
finalized++;
}
}
class RunGarbage {
public static void start() {
for (int i = 0; i < 100; i++) {
Nowa nowa = new Nowa();
}
System.gc();
System.out.println("... and total finalized = " + Nowa.finalized);
}
}
public class Garbage{
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
new RunGarbage().start();
}
}
}
// /:~
![]() Код:
... and total finalized = 31 ... and total finalized = 147 ... and total finalized = 277 ... and total finalized = 349 ... and total finalized = 400 ... and total finalized = 481 ... and total finalized = 652 ... and total finalized = 700 ... and total finalized = 703 ... and total finalized = 818 но не народной, а в виртуальной, блин! ![]() Подводим итоги, по задаче> все объекты которые вне области видимости (другими словами за фигурными скобками например), подлежат полному и беспощадному уничтожению! НО! Уборщик мусора такой толстый и ленивый, что не хочет перегружаться работой и оставляет в памяти ещё кучу мусора, которая грузит память... Многие жалуются, что Java работает медленно. Это одна из причин. Если ещё при программирование не учитывать время жизни объектов, то ... без комментариев. Кстати если допустим поменять строку Nowa nowa = new Nowa(); на new Nowa(); Т.е. создать объект без указателя, то и результат будет другим> Код:
... and total finalized = 100 ... and total finalized = 200 ... and total finalized = 300 ... and total finalized = 300 ... and total finalized = 600 ... and total finalized = 600 ... and total finalized = 700 ... and total finalized = 823 ... and total finalized = 900
__________________
Лучше сидеть в маленькой душной пивной , чем работать на большом светлом заводе...
|
||||||||||||||||||||||||
|
|
|
|
|
#27
|
|||||||||||||||||||||||
|
Новичок
![]() ![]() Пол:
Регистрация: 02.11.2007
Сообщений: 26
Репутация: 14
|
После выхода из цикла ссылка на этот объект теряется, т.к. происходит выход из области видимости, и соответственно сборщик муссора начинает свою работу |
|||||||||||||||||||||||
|
|
|
|
|
#28
|
|
Для любителей семантики Java, попробуйте с карандашиком в руке подсчитать, что программа выведет в консоль. Честно, я не смог справится... запутался
![]() Код:
class Test
{
public static void main(String args[])
{
int i=0, j=0;
X1: for(i = 0; i < 3; i++)
{
X2: for(j = 3; j > 0; j--)
{
if(i < j) continue X1;
else break X2;
}
}
System.out.println(i+" "+j);
}
}
PS. Задача взята с экзамена SCJP ![]()
__________________
Лучше сидеть в маленькой душной пивной , чем работать на большом светлом заводе...
|
|
|
|
|
|
|
#29
|
|
Неактивный пользователь
Регистрация: 13.09.2009
Сообщений: 1
Репутация: 0
|
Правильный ответ : 3 0. Хотя что то я не уверен.
|
|
|
|
|
|
#30
|
|
Неактивный пользователь
Регистрация: 22.09.2009
Сообщений: 2
Репутация: 0
|
в методе finalize поле finelized остается = 0,наверное.Ведь ссылка то одна
Последний раз редактировалось iskandarchik; 22.09.2009 в 23:04.. |
|
|
|
![]() |
Похожие темы
|
||||
| Тема | Автор | Раздел | Ответов | Последнее сообщение |
| Загадки и задачки | Nu Je | Юмор | 202 | 17.05.2025 11:56 |
| Java начинающему. Что нужно для разработки Java-приложения? | mrzed | Java | 37 | 24.03.2011 16:31 |
| Помогите решить задачки | Vladylbkin | Программирование | 1 | 07.10.2009 22:44 |
|
|