|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
Что не так с Java String и как вы с этим боретесь? Почему в Java с первой версии не сделали нормальный string с подсчетом ссылок? Не осилили или были объективные причины? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 12:03 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
Eugene NewЧто не так с Java String и как вы с этим боретесь? Почему в Java с первой версии не сделали нормальный string с подсчетом ссылок? Не осилили или были объективные причины? А что не так с Java String? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 12:10 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
Garrick, вроде того, что такой код плохой Код: java 1. 2. 3. 4.
пожирает память, создавая 100 объектов, причем почему то одновременно. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 12:24 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
Eugene New, StringBuilder не предлагать? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 12:28 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
Eugene NewGarrick, вроде того, что такой код плохой Код: java 1. 2. 3. 4.
пожирает память, создавая 100 объектов, причем почему то одновременно. Как подсчет ссылок на String поможет с проблемой, возникающей из-за иммутабельности String? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 12:46 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
Eugene NewGarrick, вроде того, что такой код плохой Код: java 1. 2. 3. 4.
пожирает память, создавая 100 объектов, причем почему то одновременно. Понятно... На какие-нибудь курсы для начинающих по Java записаться не пробовали? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 12:49 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
Eugene NewЧто не так с Java String и как вы с этим боретесь? Не то, что нет доступа к "внутренностям" String без копирования кроме как платформо/версия зависимого Unsafe Из-за этого скорость операций преобразования Charset'а, особенно в non-heap memory (CharBuffer), при пользование стандартными интерфейсами ниже плинтуса. Весь смысл CharBuffer'а и NIO пропадает. AFAIK. Борятся - относительно "грязными" хаками через Unsafe (версия зависимо!) или другими, меняя грязными решениями. Поиск в google рулит Eugene Newпожирает память, создавая 100 объектов, причем почему то одновременно. 1. Про гуано-код уже сказали. Для таких вещей предназначен StringBuilder / StringBuffer 2. AFAIK "в новых версиях" замену String на StringBuilder должен производит компилятор. Т.ч. притензия как-то запоздала лет на 5-8. Под профайлером не смотрел, но в Java 1.8 эффекта быть не должно Integer.toString(i); Сам это вызов автоматом будет плодить String для возврата результата. Гуано-код. Вместо toString + append, нужно сразу делать нормальный append https://docs.oracle.com/javase/7/docs/api/java/lang/StringBuilder.html#append(long) public StringBuilder append(long lng) Appends the string representation of the long argument to this sequence. The overall effect is exactly as if the argument were converted to a string by the method String.valueOf(long), and the characters of that string were then appended to this character sequence. Parameters: lng - a long. Returns: a reference to this object. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 12:58 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
Eugene NewGarrick, вроде того, что такой код плохой Код: java 1. 2. 3. 4.
пожирает память, создавая 100 объектов, причем почему то одновременно. А что ВЫ удивляетесь? Что Вы вызваете, то так и работает SourceCode Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 13:15 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev, спасибо за информативный ответ. Удивляюсь я тому, что временные объекты не уничтожаются сразу после вычисления выражения. Поэтому от данного кода с запашком ожидаешь только лишних затрат на перераспределение памяти (чем в других языках можно и пренебречь, особенно с умным компилятором - или их вообще нет, если строки т. н. паскалевские - фиксированного размера), но не лавинообразного занятия памяти строковыми объектами. В связи со всем этим возникает несколько вопросов: 1) Почему не удаляются временные объекты сразу после вычисления выражения, в котором они задействованы? Или все-таки удаляются? Хотелось бы понять, как это работает. 2) Когда все-таки следует или приходится использовать тип String в программах на Java? 3) Есть ли практика делать для хранения строк свои классы или StringBuilder/StringBuffer (а может каких то других классов) хватает с лихвой? В чем вообще считается правильным хранить строки? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 13:27 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
Eugene NewStringBuilder/StringBufferпоищи описание , его полно и очень досканально всё описано, ещё один раз здесь нет смысла повторять. 1) поищи про сборщик мусора. 2) когда не надо много строк складывать и они не большие 3)хранить можешь как угодно, если не надо их изменять многократно ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 13:40 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
Eugene NewLeonid Kudryavtsev, 1) Почему не удаляются временные объекты сразу после вычисления выражения, в котором они задействованы? Или все-таки удаляются? Хотелось бы понять, как это работает. JIT компилятор это умеет делать. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 13:42 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
Eugene NewLeonid Kudryavtsev, спасибо за информативный ответ. Удивляюсь я тому, что временные объекты не уничтожаются сразу после вычисления выражения. Поэтому от данного кода с запашком ожидаешь только лишних затрат на перераспределение памяти (чем в других языках можно и пренебречь, особенно с умным компилятором - или их вообще нет, если строки т. н. паскалевские - фиксированного размера), но не лавинообразного занятия памяти строковыми объектами. В связи со всем этим возникает несколько вопросов: 1) Почему не удаляются временные объекты сразу после вычисления выражения, в котором они задействованы? Или все-таки удаляются? Хотелось бы понять, как это работает. 2) Когда все-таки следует или приходится использовать тип String в программах на Java? 3) Есть ли практика делать для хранения строк свои классы или StringBuilder/StringBuffer (а может каких то других классов) хватает с лихвой? В чем вообще считается правильным хранить строки? 1) Потому что сборщик мусора в java так работает. Чем в вашем примере это могло помочь? Количество создаваемых объектов не уменьшиться, независимо от того, в какой момент они удаляться будут. (P.S. Возможно в JVM отличных от HotSpot есть сборщики использующие подсчет ссылок, яхз) 2) Всегда, когда нужны строки. Просто для их модификации рекомендуется использовать классы из пункта 3. (На самом деле конкатенация строк в Java выполняется через StringBuilder, https://docs.oracle.com/javase/8/docs/api/java/lang/String.html) 3) Эти классы сделаны не для хранения строк, а для их модификации/формирования ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 13:43 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
Lelouch, Чем в вашем примере это могло помочь? Создавалось бы не более 2 лишних экземляров объекта String, а после выхода из цикла оставался бы один экземпляр - s. Так что ничего особо страшного бы не было. Код: java 1. 2. 3. 4. 5.
Не создает же 100 копий объектов для хранения integer. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 14:08 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
Eugene NewУдивляюсь я тому, что временные объекты не уничтожаются сразу после вычисления выражения 1. Они уничтожаются в момент сборки мусора. Благодаря этому у Java "сверх-быстрое" (по сравнению с другими языками, разница на порядки!) выделение памяти через new 2. Сборка мусора делится на Minor GC (быструю) для сборки "временных объектов" и Full GC (медленную) для сборки мусора "Временные объекты" хранятся нет в OldGen heap, а в Eden области (young generation). При правильной настройке GC и отстутствия гуано-кода (когда временные объекты живут значительно больше, чем время между минор-сборками мусора, т.е. временные объекты становятся не временными) - проблем с производительностью быть не должно (в оптимале) Для "старых"/"классических" GC. Для "нового" GC - G1, вроде немного не так. Но принципы те же. Eugene NewПоэтому от данного кода с запашком ожидаешь только лишних затрат на перераспределение памяти (чем в других языках можно и пренебречь, особенно с умным компилятором - или их вообще нет, При правильном Java коде и отсутствия гуано-кода (но где такой найдешь?) и в Java проблем с производительностью быть не должно Eugene Newесли строки т. н. паскалевские - фиксированного размера На дворе XXI век. Строки фиксированного размера - пережиток прошлого ))) Eugene NewВ связи со всем этим возникает несколько вопросов.... IMHO Вопросы риторические. Как оно работает (на мой взгляд AFAIK), в кратце постарался ответить выше. Eugene New3) Есть ли практика делать для хранения строк свои классы или StringBuilder/StringBuffer (а может каких то других классов) хватает с лихвой? В чем вообще считается правильным хранить строки? Зависит от задачи. Если Вы разрабатываете Real-Time OS/приложение для управления ядерным реактором - то это одно. Если обычное приложение - то другое 1.1. Обычно нет. Используют String. 1.2. В String'е 1.3. Иногда используют хакерские способы работы со String. Например, для сверх-высоко-производительного NIO Web сервера может не хватить скорости выполения перекодировки из одной кодовой-странцы в другую. AFAIK. Но все равно для хранения пользуются или String или StringBuilder или CharBuffer'ом. Дальше или аккуратное кодирование или хакерские способы зализания в private поля через Unsafe. Но тут скорее проблема не String, а концепции защиты Java (которую обходят через Unsafe). 1.4. Иногда может возникнуть желания сделать свой класс-хранилище на CharSequence. Например для парсинга файлов. Что бы избавиться от лишних копирований и выделения памяти (вместо дублирования распарсенных данных, хранить только позиции в исходном файле). Но честно говоря, затраты времени на кодирование и выйгрыш по экономии памяти / времени как-то не пропорциональный. Хотя, вроде сверх-высоко-скоростные XML-парсеры (не для Java) такой подход используют (заявленная производительность на порядки /10-50 раз/, выше чем классических XML-парсеров). ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 14:09 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
Eugene NewЧто не так с Java String и как вы с этим боретесь? Всё так, поэтому никак не борюсь. авторПочему в Java с первой версии не сделали нормальный string с подсчетом ссылок? Зато этот вопрос понятен. Вас ввело в заблуждение некоторое сходство синтаксиса Java и C++ и вы пытаетесь откосить от изучения Java, используя свои устаревшие знания C++. Не вы первый. Лучше отказаться от попыток переноса знаний C++ на Java и изучать Java с нуля. авторНе осилили или были объективные причины? Это вы не осилили. Объективная причина: не изучали Java. Ваши вопросы полностью отвечены, и больше обсуждать нечего. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 14:12 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
Странно сделали разработчики Java - вроде бы сделали тип String с семантикой значения, а не ссылки, разрешили использовать в выражениях с операторами, но корректное удаление после вычисления выражения не сделали. Хотя как раз с ТАКОЙ реализацией (копирование=всегда создание нового экземляра) это делается безболезненно. Заболел у них тогда кто-то что ли, или уволился. Или я чего то не понимаю и есть причины, по котором они это не сделали и не могут сделать до сих пор в своем основном компиляторе? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 14:14 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
cossack5Eugene NewLeonid Kudryavtsev, 1) Почему не удаляются временные объекты сразу после вычисления выражения, в котором они задействованы? Или все-таки удаляются? Хотелось бы понять, как это работает. JIT компилятор это умеет делать. AFAIK нет JIT компилятор никак в работу подсистемы выделения памяти не вмешивается. Он, потенциально. может выкидывать не нужный код (например лишние boxing/unboxing) или заменять вызовы Java-функций на inline версии на C (например toInteger() в C вариант с возвратом не String, а CharSequence, но сомневаюсь, что такой inline есть в сорцах Java). Но не вмешиваться в распределение памяти. Если бы вмешивался, это было бы очень и крайне странно. IMHO ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 14:15 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
Partisan M, отвечены или нет - мне решать. Не трудитесь больше писать сообщения на пол-страницы с 0 полезной информацией. Даже ловить вас на слове и безграмотности не хочу. Просто игнор. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 14:16 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
Eugene NewLelouch, Чем в вашем примере это могло помочь? Создавалось бы не более 2 лишних экземляров объекта String, а после выхода из цикла оставался бы один экземпляр - s. Так что ничего особо страшного бы не было. Код: java 1. 2. 3. 4. 5.
Не создает же 100 копий объектов для хранения integer. 1) Это не java 2) В вашем примере на java после выхода из цикла остается ровно 1 экземпляр строки ( s = "" ) 3) "Страшное" в вашем примере на java не количество экземпляров строки ("живых" там всегда не больше 3, считая результат Integer.toString), а то, что для конкатенации в java выполняется копирование контента аргументов в новый экземпляр строки. Именно это копирование и порождает проблемы в вашем примере, именно с ним борятся StringBuilder'ом и оно никак не связано с подстчетом ссылок ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 14:18 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev, https://dzone.com/articles/escape-analysis - я думаю, вот это имелось в виду. Объект и правда может в хип не попасть при определенных условиях. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 14:19 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
Eugene NewСтранно сделали разработчики Java - вроде бы сделали тип String с семантикой значения, а не ссылки, разрешили использовать в выражениях с операторами, но корректное удаление после вычисления выражения не сделали. Хотя как раз с ТАКОЙ реализацией (копирование=всегда создание нового экземляра) это делается безболезненно. Заболел у них тогда кто-то что ли, или уволился. Или я чего то не понимаю и есть причины, по котором они это не сделали и не могут сделать до сих пор в своем основном компиляторе? Там сделано корректное удаление. В Java, уделение через GC ! И это оправдано. Т.к. оператор new в других языках, занимает какое-то время (т.к. нужно найти free память в heap). А в Java - это практически мгновенная операция! (разница работы new в C# и Java - AFAIK порядки, в Java в десятки-сотни раз быстрее) Но любой выйгрыш, где-то имеется подводные кани. Выигрываем на new, но теперь нужна очистка памяти в GC. Но опять таки, об этом подумали. Heap (и GC) разделен нв область для ВРЕМЕННЫХ объектов (young-генерация) и ПОСТОЯННЫХ объектов (oldgen). Для которых используют совершенно разные алгоритмы сборки мусора. В оптимале, если во young только временные объекты, их удаление так же будет "мгновенно". Но на практике, т.к. программисты пишут гуано-код, то все работает не совсем так, как ожидалось создателями языка )))) Плюс теоретики от ООП и новых технологий. Проблема не в распределнии памяти, а в концепции имутабельности объектов (необходимость лишнего копирования/создания иммутаблеьных объектов). Но такая же проблема будет в любом другом языке! AFAIK ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 14:24 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev, еще раз спасибо за информативные ответы. Насчет гуано - тонкий философский вопрос - код ли гуано, или язык, или компилятор.. 21 век Ну и что, что 21 век. Все равно в 21 веке практически ничего нового по теории программирования не изобрели. Рост мощностей вычислительных систем остановился. Лучше чем записи фиксированного размера для доступа к действительно большим массивам данных все равно ведь ничего не изобрели. Т. к. в таком случае адрес нужной записи вычисляется по индексу легко. Я вообще вижу, что в 21 веке часто стали изобретать велосипеды 50-летней давности, по невежеству наступая на все уже пройденные грабли. Например, xml - тупик иерархических БД 1950-1960-х годов. Или среды разработки, которые делают меньше, хуже и медленнее, пожирая дикое количество ресурсов по сравнению с тем, что быстро работало на Pentium-I. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 14:45 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
Lelouch, "Страшное" в вашем примере на java не количество экземпляров строки Вы уж определитесь - да или нет. Создаются 100 объектов, висят ли в памяти или нет. Я ведь прямо об этом спросил сразу же. Leonid Kudryavtsev, Но такая же проблема будет в любом другом языке! Что такого в сборщике мусора от Java, чему повредит досрочное удаление объекта, сделанное без поиска в памяти? Иммутабельные временные переменные, созданные в выражениях, можно удалять сразу именно потому, что они иммутабельные. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 14:56 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
Eugene New, не надо гнать , а надо знать http://proglang.su/java/strings-stringbuilder-stringbuffer можешь сразу задать длину с запасом и будет у тебя "строка фиксированного размера" (правда может ещё и увеличиваться. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 15:01 |
|
Что не так с Java String и как вы с этим боретесь?
|
|||
---|---|---|---|
#18+
Eugene NewLelouch, "Страшное" в вашем примере на java не количество экземпляров строки Вы уж определитесь - да или нет. Создаются 100 объектов, висят ли в памяти или нет. Я ведь прямо об этом спросил сразу же. Вы спросили что не так со строками - вам ответили. Потом вы спросили какую-то ересь про подсчёт количества ссылок для строк, считая это решением проблемы, которую сами себе придумали. Почему нельзя удалять сразу - Почитайте про то, как выполняется выделение памяти и сборка мусора, вопрос пропадёт. Кратко - большинство сборщиков должны выполнить упаковку кучи (heap compaction), чтобы освободить память (по-моему только Concurrent mark and sweep упаковку не выполняет) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 15:16 |
|
|
start [/forum/topic.php?fid=59&msg=39704284&tid=2121729]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
63ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
66ms |
get tp. blocked users: |
1ms |
others: | 331ms |
total: | 503ms |
0 / 0 |