|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
Eugene New...можно удалять сразу... А зачем? Это будет жесткий тормоз. Например Java new выделяет память не кусочками по байтам, а сразу большим куском для всего thread. Что бы минимизировать время блокировки heap при многопользовательской/многопотоковой обработке. Дальнейшее выделение памяти в Java (new), в оптимале, просто одна ассемблерная инструкция: add указатель_на_свободное_место + выделяемый_размер В оптимале, т.к. и тут теоретики ООП постарались. Ввели исключение при синхронизации для иммутабельных полей типа final в объектах. Теперь любой new дополнительно требует включение asm инструкций для синхронизации. Но, вроде, читал иследование которое этому было посвещено, потери времени минимальный, единицы процентов (плюс авторы иследования нашли баги в JVM ))) - в ассемблерном коде были перепутаны типы блокировок ))) ) Так же и освобождение. Бесмысленно освобождать по одному объекту. Когда eden (young генерация) заполнится - ее всю сразу и освободят. В оптимале, если в eden только временные объекты, опять таки, одна ассемблерная инструкция ))) Поменять один eden на другой (их два) P.S. Как я понимаю, сейчас проблема "иследований" это научить языки оптимально работать с NUMA архитектурой. Никаких алгоритмов более-менее оптимального выделения памяти для NUMA до сих пор не придумано. Пока выделяют первое попавшееся, а потом получают тормоза при выполнении. Но опять таки, это проблема не только JAVA, а практически любого современного языка программирования. AFAIK ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 15:37 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
Eugene NewЯ вообще вижу, что в 21 веке часто стали изобретать велосипеды 50-летней давности, по невежеству наступая на все уже пройденные грабли. Например, xml - тупик иерархических БД 1950-1960-х годов. х.я се. в середине 40х только только появились электронные вычислители которые с натяжкой можно и компьютером то назвать, оказывается через 5 лет на таких уже иерархические бд крутились. Eugene NewИли среды разработки, которые делают меньше, хуже и медленнее, пожирая дикое количество ресурсов по сравнению с тем, что быстро работало на Pentium-I. Никто не заставляет пользоваться IDE, берешь notepad++ прогаешь на java, сразу после hello world вернешся назад на IDE. Почти все здесь пробовали в notepad писать. Как видно фанатов notepad здесь не много. Ну вот тебе навскидку что такое IDE https://martinfowler.com/bliki/PostIntelliJ.html Eugene NewЧто такого в сборщике мусора от Java, чему повредит досрочное удаление объекта, сделанное без поиска в памяти? Иммутабельные временные переменные, созданные в выражениях, можно удалять сразу именно потому, что они иммутабельные. Ничему не повредит но скорее всего врядли поможет. Помимо это есть термин фрагментация памяти. Смысл есть если у нас все объекты будут однинакового размера со всеми вытекающими те. все объекты должны быть размером с самый большой объект. Сборщик не просто чистит но еще и дефрагментирует. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 15:38 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
вообще название сборщик мусора прижилось, возможно вначале они был сборщиком мусора но по сути это менеджер памяти встроенный в jvm. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 15:40 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
Eugene NewЧто не так с Java String и как вы с этим боретесь? Да, еще одна вещь, которая "не так" с Java String На самом деле, правильный интерфейс, это CharSequence !!! а String - это конкретная имплементация НО в большинстве ф-ций языка и 100% библиотк/пользовательского кода, вместо интерфейса CharSequence, забит String ((( Никто, никогда ПРАВИЛЬНО не пишет - CharSequence, все тупо в описании ф-ций гуано-кодят String и не парятся. Из-за этого, нет возможности сделать свою "правильную" имплементацию ((( Если бы народ не загуано-кодил 100500 миллиардов строк с тупым указанием String (имплементации), а правильно всюду бы использовали CharSequence (интерфейс) - проблемы бы не было. ООП бы рулил. Но сейчас, весь lagacy код жестко привязан к конкретной имплементации. Поэтому свою имплементацию, при всем желание, сделать уже не получается. Тогда нужно во ВСЕХ ныне существующих библиотеках find-and-replace String на CharSequence заменять и перекомпилировать ((( ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 15:55 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
Leonid KudryavtsevНикто, никогда ПРАВИЛЬНО не пишет - CharSequence в android везде CharSequence ;) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 16:35 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
Eugene NewGarrick, вроде того, что такой код плохой Код: java 1. 2. 3. 4.
пожирает память, создавая 100 объектов, причем почему то одновременно. Потому что у тебя код слишком сложный для escape analysis оптимизации. Вот здесь почитай, как оно работает в java, и в каких случаях объекты не аллоцируются: https://habr.com/company/jugru/blog/322348/ А так да, асбстрактный совершенный компилятор здесь бы ничего не создал кроме финальной строки. Но таких пока нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 16:40 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
lleming, вас еще много открытий ждет. Как говорил Сократ: "я знаю что ничего не знаю". Leonid Kudryavtsev, значит, дело в тормозах. Теперь понятно, спасибо. Я тут сейчас прочитал про новый алгоритм выделения памяти в Java 2017 года - вообще отказаться от сборки мусора и просто ронять программу когда память заканчивается Никаких алгоритмов более-менее оптимального выделения памяти для NUMA до сих пор не придумано. IMHO раз в 2000-м году не придумали, сейчас тем более вряд ли что то новое родят. Под локальные объекты-значения просится стек, но есть опасения, что для строк неограниченной длины потребуется слишком много места в стеке. По поводу грязного кода - его же сами разработчики Java и наплодили в своих библиотеках, а не народ. Даже грязный Integer.ToString придумал не народ. :-) Возвращаясь к использованию String. Хотелось бы кое что уточнить. Мне бы хотелось иметь какие то критерии его использования. Понятно, что в принципе его вообще не надо использовать и бить тапками по голове всех, кто его упомянет в программе, включая самих разработчиков Java. Непонятно, когда его использовать все таки МОЖНО и это не будет грязным. Ну вроде для хранения константных значений, которые никогда не будем даже читать - можно :) А любая попытка доступа к нему даже для чтения породит копию объекта в куче, которая там будет висеть в потенциале очень долго. Если по final в функцию передать, сделает копию или нет? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 16:43 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev, CharSequence повялся гораздо позже String у String контракт на hashCode, без него switch не работает с CharSequence будут возникать проблемы (ну самое простое: как его использовать в качестве ключа Map?) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 16:45 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
chpasha, в android везде CharSequence ;) Неправда. FontVariationAxis(String tagString, float styleValue) https://developer.android.com/reference/android/graphics/fonts/FontVariationAxis Я просто наугад потыкал в справочник, ожидая что первое со строками выпадет. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 16:49 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
Eugene Newlleming, вас еще много открытий ждет. Как говорил Сократ: "я знаю что ничего не знаю". Leonid Kudryavtsev, значит, дело в тормозах. Теперь понятно, спасибо. Я тут сейчас прочитал про новый алгоритм выделения памяти в Java 2017 года - вообще отказаться от сборки мусора и просто ронять программу когда память заканчивается Никаких алгоритмов более-менее оптимального выделения памяти для NUMA до сих пор не придумано. IMHO раз в 2000-м году не придумали, сейчас тем более вряд ли что то новое родят. Под локальные объекты-значения просится стек, но есть опасения, что для строк неограниченной длины потребуется слишком много места в стеке. По поводу грязного кода - его же сами разработчики Java и наплодили в своих библиотеках, а не народ. Даже грязный Integer.ToString придумал не народ. :-) Возвращаясь к использованию String. Хотелось бы кое что уточнить. Мне бы хотелось иметь какие то критерии его использования. Понятно, что в принципе его вообще не надо использовать и бить тапками по голове всех, кто его упомянет в программе, включая самих разработчиков Java. Непонятно, когда его использовать все таки МОЖНО и это не будет грязным. Ну вроде для хранения константных значений, которые никогда не будем даже читать - можно :) А любая попытка доступа к нему даже для чтения породит копию объекта в куче, которая там будет висеть в потенциале очень долго. Если по final в функцию передать, сделает копию или нет? Копия создается только при изменении. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 16:49 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
Код: java 1.
Знающие, прокомментируйте это, пожалуйста. Так ли это или он меня в заблуждение вводит? Не первое противоречие в данной теме. String s1 = 'Превед'; String s2 = s1; Создается копия или нет? По идее да. Так зачем он мне пишет, что "Копия создается только при изменении." ??? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 17:04 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
Eugene NewЗнающие, прокомментируйте это, пожалуйста. Так ли это или он меня в заблуждение вводит? Не первое противоречие в данной теме. String s1 = 'Превед'; String s2 = s1; Создается копия или нет? По идее да. Так зачем он мне пишет, что "Копия создается только при изменении." ??? Нет конечно Где тут какое-то создание? (вызов new) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 17:17 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
Eugene New...Если .... в функцию передать, сделает копию или нет? Нет конечно. Еще раз читать книжки по Java для начинающих. AFAIK В Java ВСЕ передачи параметров типа "объект" by reference, а все передачи atomic типов by value. Разумеется никаких копий объектов при передачи в функцию не будет и быть не может. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 17:30 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
Eugene New... Почему в Java с первой версии не сделали нормальный string с подсчетом ссылок? при чем здесь String? Если подразумевается управление памятью с использованием счетчика ссылок на себя в самом объекте, то этого механизма памяти в java нет совсем . Ни для каких объектов. Управление памятью строится на базе достижимости объектов от переменных - "корней" графа созданных объектов. Недостижимые от таких корней объекты удаляются, со временем, сборщиком мусора. Eugene New Не осилили или были объективные причины? Мир они так видели. В целом, надеялись, что этот подход даст им более простые механизмы управления памятью, а значит, как они верили, более надёжный язык. Eugene NewКогда все-таки следует или приходится использовать тип String в программах на Java? Всегда, когда вам требуются ключевые свойства String - иммутабельность, компарабельность и предвычисленность хеш-значения. И, если вдруг, все три одновременно - то нужны очень-очень специальные основания для того, чтобы думать, чем их заменить. Eugene NewСтранно сделали разработчики Java - вроде бы сделали тип String с семантикой значения, а не ссылки... В java вообще нет объектов с "семантикой значения". Совсем, by design. Eugene NewПод локальные объекты-значения просится стек, но есть опасения, что для строк неограниченной длины потребуется слишком много места в стеке. Повторю. Никто никуда не просится. Объектов-значений в java просто нет . PS Дело ваше, конечно, что и как вам говорить. Но выглядят ваши тексты как ..., допустим, как слишком толстый троллинг. Местами - за гранью хамства. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 17:48 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
Код: java 1. 2. 3.
s1 = "Hello" - хотя для других объектов было бы новое значение, а не старое. У Java нет перегрузки операторов, но String можно использовать в выражениях с оператором + . При том, что нет атомарного типа - последовательности символов. Поэтому String все же какой то особенный класс, отсюда вопросы про ньюансы его передачи в функции. хамство. Никакого хамства, желание разобраться - не более. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 18:42 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
Eugene New Код: java 1. 2. 3.
s1 = "Hello" - хотя для других объектов было бы новое значение, а не старое. У Java нет перегрузки операторов, но String можно использовать в выражениях с оператором + . При том, что нет атомарного типа - последовательности символов. Поэтому String все же какой то особенный класс, отсюда вопросы про ньюансы его передачи в функции. Нет никаких ньюансов передачи в функции Ваш пример и текст - совершенно не понял. В примере, вообще никакого создания объектов на этапе выполнения не будет. Т.к. все строковые константы будут созданы еще в момент загрузки класса. И никаких new у Вас нет. по исходному вопросу темы (хоть уже и отвечали): Использовать + с классом String, это гуано-код. Для нормального решения данной задачи, есть StringBuilder/StringBuffer и метод append Последние версии Java, умеют сами преобразовывать + в StringBuilder/StringBuffer Но в Вашем исходном примере, дофига лишних вызовов: Integer.toString() и + между String'ами. Хотя, все можно сделать одним вызовом: StringBuilder.append( int ) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 18:50 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
проблема в конструкции a = b + c в том, что Вы неявно говорите, мне нужен объект a, с новым значением a + b. В случае, атомарных типов. это и пофиг. просто перепишется существующее значение. В случае со строками, нужно или аллоцировать новую область памяти под новое значение или, как минимум, выполнять копирование строки с места на место (если буфер фиксированного размера) Никакой разницы между Java и другими языками программирования - НЕТ. Счетчик ссылок тут тоже никаким боком помочь не может. Даже строки с фиксированной длиной, помочь не могут. Т.к. их все равно нужно копировать (что не бесплатно! и строки могут быть в 100500 символов) Т.ч. в любом языке, такая конструкция будет не оптимальной. Оптимальный вариант, вместо создания 100500 раз разных переменных под временные значения в цикле и многократного копирования строк, один раз выделить буфер и дописывать в его конец... В Java для этого существует класс StringBuilder. В других языках (например "чистый" Basic) и того нет, только многократное копирование строк с места на место. Ни Java, ни GC, ни счетчик ссылок - тут вообще никаким боком. IMHO & AFAIK ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 18:58 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
Eugene News1 = "Hello" - хотя для других объектов было бы новое значение, а не старое почему-это? Код: java 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 18:58 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
chpashaпочему-это?потому что ссылки ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 19:01 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
chpashaпочему-это? Запустить... проверить ))) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 19:03 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
вадя Leonid Kudryavtsev я не спрашиваю, почему так получается. был приведен пример Код: java 1. 2. 3.
и утверждение "s1 = "Hello" - хотя для других объектов было бы новое значение" я привел пример с объектами, идентичный указанному и усомнился в сделаных выводах ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 19:10 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
Сорри. Полностью с тобой согласен. Просто показалось, что это вопрос Т.С., уже на твой ответ ))) вечер, пора идти пить пиво ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 19:28 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
Eugene New Код: java 1.
Знающие, прокомментируйте это, пожалуйста. Так ли это или он меня в заблуждение вводит? Не первое противоречие в данной теме. String s1 = 'Превед'; String s2 = s1; Создается копия или нет? По идее да. Так зачем он мне пишет, что "Копия создается только при изменении." ??? А зачем тут копию создавать. Тут во второй строке ссылка копируется из одной переменной в другую. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 19:51 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev, . В примере, вообще никакого создания объектов на этапе выполнения не будет. Т.к. все строковые константы будут созданы еще в момент загрузки класса. И никаких new у Вас нет. Хотелось бы подробностей. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Верно ли, что a = "Abc" это не a = new String ("Abc") ? Что есть строковая константа "Abc"? Объект класса String или что? В момент загрузки какого класса он создается - класса MyCoolClass или какого? Где хранится объект "Abc" (если это вообще объект) - в куче или где то в другом месте? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 20:28 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
Eugene NewВерно ли, что a = "Abc" это не a = new String ("Abc") ? Что есть строковая константа "Abc"? Объект класса String или что? В момент загрузки какого класса он создается - класса MyCoolClass или какого? Где хранится объект "Abc" (если это вообще объект) - в куче или где то в другом месте? Да, верно Объект класса String Собственно последовательность байтиков-букв "Abc", в данном конкретном случае, будет хранится в некоторой специальной области для intern() строк пришедших из class файла. Куча это или нет - вопрос сложный и филосовский. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 20:41 |
|
|
start [/forum/topic.php?fid=59&msg=39704502&tid=2121729]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
71ms |
get topic data: |
8ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
others: | 337ms |
total: | 501ms |
0 / 0 |