LINUX.ORG.RU
ФорумTalks

Мысль о программировании на Java.


0

0

Настоящий программист на Perl может даже на Java написать программу на Perl. почти (c). Мысль появилась по результатам разглядывания результата борьбы со Swing. Swing -- зло. Особенно с нетривиальными дизайнами. А уж про нетривиальные действия... Чтение исходников JRE помогает, но даже там не всегда [за обозримое время] понятно почему не работает одно или другое. А всего-то хотелось запускать анимированные действия (исполняются таймером) с задержкой по таймеру. Теперь не могу понять, будет память утекать или нет от оставленных бесхозных остановленных таймеров-с-листенерами или нет.

★★★★★
Ответ на: комментарий от HappyCoder

Пасиба, но мне рано ещё. Я на Java только пару месяцев как. Вообще, предпочитаю Perl и C++. До Ruby не добрался, не успел, загружаюсь по работе так, что просто некогда новый язык изучать, надо писать на чём-то подходящем, что уже и так хорошо знаю. За Java взялся, чтобы клиентское приложение написать, создателям Swing лучше не знать что я о них думаю.

Casus ★★★★★
() автор топика

Память утекать не будет, конечно. Листенер - банальная ссылка на обьект сохранённая в таймере. Если на сам таймер ссылок не осталось - попрёт под говносборку. С памятью вообще можешь не париццо, если обьекты по полгига размером не создаёшь, разумеется.

WindozePlumber
()
Ответ на: комментарий от WindozePlumber

> С памятью вообще можешь не париццо, если обьекты по полгига размером не создаёшь, разумеется.

Жесть, как она есть...

AngryElf ★★★★★
()
Ответ на: комментарий от AngryElf

.Net манагер памяти практически в любой ситуации рвёт сишный malloc/free как тузег тряпку. В жабо я не бог весть какой спец, но, уверен что там то же самое - судя по последним жабодокам что я читал они сделаны похоже.

WindozePlumber
()
Ответ на: комментарий от WindozePlumber

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

Gharik
()
Ответ на: комментарий от WindozePlumber

>.Net манагер памяти практически в любой ситуации рвёт сишный malloc/free как тузег тряпку.

в любых-любых??? О_о или его манагеру памяти сам святой дух память виделяет и потом какашки(garbage) за ним убирает?

не раз уже говорилось, что latency такого подхода есть немножко непредсказуемой(особенно когда манагер надумает мусор пособирать), по-этому использовать таки его (.НЭТ <или Жабу, если ты уже говришь, что там похожий принцип> с его манагером) где не попадя - не самое лучшее решение. (подробнее в топеге про си-плас-плас-оу-екс)

или я ошибаюсь? =)

zHACKa
()
Ответ на: комментарий от zHACKa

выделение памяти в moving gc намного быстрее, он приятнее для кэша, latency в подавляющем большинстве приложений не важен, а когда он важен, можно отключать и запускать самому сборку (или вообще не использовать Java).

Legioner ★★★★★
()
Ответ на: комментарий от zHACKa

>ну собственно что я и имел в виду...

скорее не так... скорее "я согласен, но с оговоркой про лейтенси"

то, что для большинства приложений это (latency) не есть критичным - тоже правда, но все-равно есть системы, где использование Джава или .НЕТ нецелесообразно...

zHACKa
()
Ответ на: комментарий от WindozePlumber

> Память утекать не будет, конечно.

Мне не очевидно. Я создаю объект, и сразу ссылку на него выбрасываю, но объект создаёт таймер и регистрируется в нём же. После положенного количества срабатываний, таймер останавливается. И мне не очевидно, что после остановки таймера можно как-то определить, что объект больше не нужен, и вообще не имеет больше возможности запуститься.

Casus ★★★★★
() автор топика
Ответ на: комментарий от Gharik

> С учётом того, что он его и использует

Он его не использует. Ознакомься с вопросом, прежде чем газ выпускть.

anonymous
()
Ответ на: комментарий от Casus

> Мне не очевидно. Я создаю объект, и сразу ссылку на него выбрасываю, но объект создаёт таймер и регистрируется в нём же. После положенного количества срабатываний, таймер останавливается. И мне не очевидно, что после остановки таймера можно как-то определить, что объект больше не нужен, и вообще не имеет больше возможности запуститься.


Смотри, у тебя есть стек, есть куча. Есть ссылки которые лежат в данный момент в стеке (или стеках, в случае нескольких потоков), есть обьекты на которые они ссылаются, есть обьекты на которые ссылаются эти обьекты и т.п. по рекурсии. Все эти обьекты - это "reachable" - достижимые обьекты. Т.е. обьекты до которых ьы можешь дойти по ссылкам по цепочке, начиная со стека. Всё остальное - это "unreachable", т.е. потенциальный мусор. Поэтому у тебя обьект ссылается на таймер, таймер на обьект, но они оба на куче и на них больше никто не ссылается - поэтому, как бы они друг на друга не ссылались, они "unreachable".

WindozePlumber
()
Ответ на: комментарий от Gharik

Манагер памяти выделяет кусок памяти под heap, устанавливает указатель "top" на его начало. Когда выделяется память под новый обьект, то указателю на обьект присваивается значение "top", а top увеличивается на размер обьекта. Выделение памяти по "new" происходит поэтому практически со скоростью выделения на стеке. Остаётся сборщик мусора. Но, сборщик мусора запускается только когда действительно это требуется (достигнут threshold по памяти) и работает в отдельном потоке с низким приоритетом - поэтому с большой вероятностью он будет работать, когда полезный код всё равно будет бездельничать (например ожидать на i/o). Отсюда и выигрыш в скорости.

WindozePlumber
()
Ответ на: комментарий от WindozePlumber

> поэтому, как бы они друг на друга не ссылались, они "unreachable".

Мне это не очевидно. Сейчас поясню. Дело в том, что таймер у меня свинговский, а значит, он где-то внутри зарегистрирован. Разрегистрируется ли он по команде stop? У меня в том виде, как ты говоришь "unreachable", таймер срабатывает несколько раз, значит кто-то на него ссылается.

Casus ★★★★★
() автор топика
Ответ на: комментарий от Casus

> Дело в том, что таймер у меня свинговский, а значит, он где-то внутри зарегистрирован.


Ну, по большому счёту, с точки зрения управления памятью, тебя это не должно волновать. Если свинг ссылается на таймер, значит он считает что он ему нужен и таймер идти под GC не должен, если нет, то он может пойти под GC - утечки памяти не будет в любом случае. Листенер будет достижимым, пока достижим сам таймер - если тебя именно это смущает, то просто отцепи его когда он станет не нужен.

WindozePlumber
()
Ответ на: комментарий от WindozePlumber

> Листенер будет достижимым, пока достижим сам таймер - если тебя именно это смущает, то просто отцепи его когда он станет не нужен.

Меня не то, чтобы смущает. У меня неявная циклическая зависимость (таймер содержится в объекте, на который ссылается листенер этого таймера) плюс регистрация таймера где-то внутри библиотек Java. И вот эта регистрация таймера, которой я не могу управлять, меня и смущает. Впрочем, возможно, что таймер действительно зарегистрирован только пока running, тогда я, наверное, зря беспокоюсь.

Casus ★★★★★
() автор топика
Ответ на: комментарий от WindozePlumber

Когда все это уже давным давно есть в нормальных языках, M$ выпускает только бету, и всякое быдло начинает писать как это круто и что это революционные технологии

anonymous
()
Ответ на: комментарий от anonymous

Токмо все эти "нормальные языки" нахрен никому не нужны кроме очкастых доцентов-задротов. А C# практически везде уже мейнстримит как энтерпрайз-стандарт. :-D

WindozePlumber
()
Ответ на: комментарий от WindozePlumber

До Саныча с Батарейкиным тебе ещё пилить и пилить, дружок...

Gharik
()
Ответ на: комментарий от WindozePlumber

Ню-ню C++, это наверно язык задротов в отличии от "мега" C#

anonymous
()
Ответ на: комментарий от WindozePlumber

Пока он меинстримит только в мозгах манагеров. На реальных энтерпрайз-серверах молотит Джава и ДиБи Ту.

anonymous
()
Ответ на: комментарий от anonymous

Через год-два оно уже только говно в бочке будет молотить. Сейчас даже Дойче Банкъ, у которого активов больше арбуза евро, всё на современную платформу дотНет переписывает. Ибо руль и мейнстрим. :-D :-D

WindozePlumber
()
Ответ на: комментарий от WindozePlumber

>А C# практически везде уже мейнстримит как энтерпрайз-стандарт. :-D

Где-где мейстримит? В конторе "БЫков и братаны" Нижнего Мухосранска? Где три очкастых студента-зад... лабают в VStudio 2008, привезенном с Митино?

anonymous
()
Ответ на: комментарий от Casus

Вообще, неиспользуемые блоки прослушивания - это один из анти-паттернов, приводящий именно к утечкам памяти. Если вам что-то неочевидно, то лучше читайте книги. Например, это описано в "Горький вкус Java".

Ian ★★
()
Ответ на: комментарий от Ian

> Вообще, неиспользуемые блоки прослушивания - это один из анти-паттернов

Можно пример? Особенно, под ситуацию с таймером интересно. Книжек у меня несколько есть, но там про это ничего не сказано, кроме того, что "мусор будет собран автоматически". "Горького вкуса Java" у меня нет.

Casus ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.