powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Что не так с Java String и как вы с этим боретесь?
25 сообщений из 293, страница 1 из 12
Что не так с Java String и как вы с этим боретесь?
    #39704150
Eugene New
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что не так с Java String и как вы с этим боретесь?

Почему в Java с первой версии не сделали нормальный string с подсчетом ссылок? Не осилили или были объективные причины?
...
Рейтинг: 0 / 0
Что не так с Java String и как вы с этим боретесь?
    #39704157
Garrick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eugene NewЧто не так с Java String и как вы с этим боретесь?
Почему в Java с первой версии не сделали нормальный string с подсчетом ссылок? Не осилили или были объективные причины?
А что не так с Java String?
...
Рейтинг: 0 / 0
Что не так с Java String и как вы с этим боретесь?
    #39704163
Eugene New
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Garrick,

вроде того, что такой код плохой

Код: java
1.
2.
3.
4.
String s = "";
for (int i = 0; i < 100; i++) {
    s = s + Integer.toString(i);
}



пожирает память, создавая 100 объектов, причем почему то одновременно.
...
Рейтинг: 0 / 0
Что не так с Java String и как вы с этим боретесь?
    #39704164
waszkiewicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eugene New,
StringBuilder не предлагать?
...
Рейтинг: 0 / 0
Что не так с Java String и как вы с этим боретесь?
    #39704173
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eugene NewGarrick,

вроде того, что такой код плохой

Код: java
1.
2.
3.
4.
String s = "";
for (int i = 0; i < 100; i++) {
    s = s + Integer.toString(i);
}



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

Как подсчет ссылок на String поможет с проблемой, возникающей из-за иммутабельности String?
...
Рейтинг: 0 / 0
Что не так с Java String и как вы с этим боретесь?
    #39704176
Garrick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eugene NewGarrick,

вроде того, что такой код плохой

Код: java
1.
2.
3.
4.
String s = "";
for (int i = 0; i < 100; i++) {
    s = s + Integer.toString(i);
}



пожирает память, создавая 100 объектов, причем почему то одновременно.
Понятно... На какие-нибудь курсы для начинающих по Java записаться не пробовали?
...
Рейтинг: 0 / 0
Что не так с Java String и как вы с этим боретесь?
    #39704178
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
...
Рейтинг: 0 / 0
Что не так с Java String и как вы с этим боретесь?
    #39704192
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eugene NewGarrick,

вроде того, что такой код плохой

Код: java
1.
2.
3.
4.
String s = "";
for (int i = 0; i < 100; i++) {
    s = s + Integer.toString(i);
}



пожирает память, создавая 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.
    public static String toString(int i, int radix) {
        if (radix < Character.MIN_RADIX || radix > Character.MAX_RADIX)
            radix = 10;

        /* Use the faster version */
        if (radix == 10) {
            return toString(i);
        }

        char buf[] = new char[33];
        boolean negative = (i < 0);
        int charPos = 32;

        if (!negative) {
            i = -i;
        }

        while (i <= -radix) {
            buf[charPos--] = digits[-(i % radix)];
            i = i / radix;
        }
        buf[charPos] = digits[-i];

        if (negative) {
            buf[--charPos] = '-';
        }

        return  new String(buf, charPos, (33 - charPos)); 
    }
...
Рейтинг: 0 / 0
Что не так с Java String и как вы с этим боретесь?
    #39704206
Eugene New
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,

спасибо за информативный ответ.
Удивляюсь я тому, что временные объекты не уничтожаются сразу после вычисления выражения. Поэтому от данного кода с запашком ожидаешь только лишних затрат на перераспределение памяти (чем в других языках можно и пренебречь, особенно с умным компилятором - или их вообще нет, если строки т. н. паскалевские - фиксированного размера), но не лавинообразного занятия памяти строковыми объектами.

В связи со всем этим возникает несколько вопросов:

1) Почему не удаляются временные объекты сразу после вычисления выражения, в котором они задействованы? Или все-таки удаляются? Хотелось бы понять, как это работает.

2) Когда все-таки следует или приходится использовать тип String в программах на Java?

3) Есть ли практика делать для хранения строк свои классы или StringBuilder/StringBuffer (а может каких то других классов) хватает с лихвой? В чем вообще считается правильным хранить строки?
...
Рейтинг: 0 / 0
Что не так с Java String и как вы с этим боретесь?
    #39704218
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eugene NewStringBuilder/StringBufferпоищи описание , его полно и очень досканально всё описано, ещё один раз здесь нет смысла повторять.
1) поищи про сборщик мусора.
2) когда не надо много строк складывать и они не большие
3)хранить можешь как угодно, если не надо их изменять многократно
...
Рейтинг: 0 / 0
Что не так с Java String и как вы с этим боретесь?
    #39704222
cossack5
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eugene NewLeonid Kudryavtsev,

1) Почему не удаляются временные объекты сразу после вычисления выражения, в котором они задействованы? Или все-таки удаляются? Хотелось бы понять, как это работает.


JIT компилятор это умеет делать.
...
Рейтинг: 0 / 0
Что не так с Java String и как вы с этим боретесь?
    #39704223
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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) Эти классы сделаны не для хранения строк, а для их модификации/формирования
...
Рейтинг: 0 / 0
Что не так с Java String и как вы с этим боретесь?
    #39704254
Eugene New
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lelouch,

Чем в вашем примере это могло помочь?

Создавалось бы не более 2 лишних экземляров объекта String, а после выхода из цикла оставался бы один экземпляр - s. Так что ничего особо страшного бы не было.

Код: java
1.
2.
3.
4.
5.
Integer s;
for (i := 0; i < 100; ++i)
{
  s := s + i;
}



Не создает же 100 копий объектов для хранения integer.
...
Рейтинг: 0 / 0
Что не так с Java String и как вы с этим боретесь?
    #39704257
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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-парсеров).
...
Рейтинг: 0 / 0
Что не так с Java String и как вы с этим боретесь?
    #39704263
Partisan M
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eugene NewЧто не так с Java String и как вы с этим боретесь?

Всё так, поэтому никак не борюсь.

авторПочему в Java с первой версии не сделали нормальный string с подсчетом ссылок?

Зато этот вопрос понятен. Вас ввело в заблуждение некоторое сходство синтаксиса Java и C++ и вы пытаетесь откосить от изучения Java, используя свои устаревшие знания C++. Не вы первый. Лучше отказаться от попыток переноса знаний C++ на Java и изучать Java с нуля.

авторНе осилили или были объективные причины?

Это вы не осилили. Объективная причина: не изучали Java.

Ваши вопросы полностью отвечены, и больше обсуждать нечего.
...
Рейтинг: 0 / 0
Что не так с Java String и как вы с этим боретесь?
    #39704264
Eugene New
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Странно сделали разработчики Java - вроде бы сделали тип String с семантикой значения, а не ссылки, разрешили использовать в выражениях с операторами, но корректное удаление после вычисления выражения не сделали. Хотя как раз с ТАКОЙ реализацией (копирование=всегда создание нового экземляра) это делается безболезненно. Заболел у них тогда кто-то что ли, или уволился. Или я чего то не понимаю и есть причины, по котором они это не сделали и не могут сделать до сих пор в своем основном компиляторе?
...
Рейтинг: 0 / 0
Что не так с Java String и как вы с этим боретесь?
    #39704266
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cossack5Eugene NewLeonid Kudryavtsev,

1) Почему не удаляются временные объекты сразу после вычисления выражения, в котором они задействованы? Или все-таки удаляются? Хотелось бы понять, как это работает.


JIT компилятор это умеет делать.
AFAIK нет

JIT компилятор никак в работу подсистемы выделения памяти не вмешивается. Он, потенциально. может выкидывать не нужный код (например лишние boxing/unboxing) или заменять вызовы Java-функций на inline версии на C (например toInteger() в C вариант с возвратом не String, а CharSequence, но сомневаюсь, что такой inline есть в сорцах Java).

Но не вмешиваться в распределение памяти. Если бы вмешивался, это было бы очень и крайне странно.

IMHO
...
Рейтинг: 0 / 0
Что не так с Java String и как вы с этим боретесь?
    #39704270
Eugene New
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Partisan M, отвечены или нет - мне решать. Не трудитесь больше писать сообщения на пол-страницы с 0 полезной информацией. Даже ловить вас на слове и безграмотности не хочу. Просто игнор.
...
Рейтинг: 0 / 0
Что не так с Java String и как вы с этим боретесь?
    #39704273
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eugene NewLelouch,

Чем в вашем примере это могло помочь?

Создавалось бы не более 2 лишних экземляров объекта String, а после выхода из цикла оставался бы один экземпляр - s. Так что ничего особо страшного бы не было.

Код: java
1.
2.
3.
4.
5.
Integer s;
for (i := 0; i < 100; ++i)
{
  s := s + i;
}



Не создает же 100 копий объектов для хранения integer.

1) Это не java
2) В вашем примере на java после выхода из цикла остается ровно 1 экземпляр строки ( s = "" )
3) "Страшное" в вашем примере на java не количество экземпляров строки ("живых" там всегда не больше 3, считая результат Integer.toString), а то, что для конкатенации в java выполняется копирование контента аргументов в новый экземпляр строки. Именно это копирование и порождает проблемы в вашем примере, именно с ним борятся StringBuilder'ом и оно никак не связано с подстчетом ссылок
...
Рейтинг: 0 / 0
Что не так с Java String и как вы с этим боретесь?
    #39704276
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,

https://dzone.com/articles/escape-analysis - я думаю, вот это имелось в виду. Объект и правда может в хип не попасть при определенных условиях.
...
Рейтинг: 0 / 0
Что не так с Java String и как вы с этим боретесь?
    #39704284
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eugene NewСтранно сделали разработчики Java - вроде бы сделали тип String с семантикой значения, а не ссылки, разрешили использовать в выражениях с операторами, но корректное удаление после вычисления выражения не сделали. Хотя как раз с ТАКОЙ реализацией (копирование=всегда создание нового экземляра) это делается безболезненно. Заболел у них тогда кто-то что ли, или уволился. Или я чего то не понимаю и есть причины, по котором они это не сделали и не могут сделать до сих пор в своем основном компиляторе?
Там сделано корректное удаление. В Java, уделение через GC !

И это оправдано. Т.к. оператор new в других языках, занимает какое-то время (т.к. нужно найти free память в heap). А в Java - это практически мгновенная операция! (разница работы new в C# и Java - AFAIK порядки, в Java в десятки-сотни раз быстрее)

Но любой выйгрыш, где-то имеется подводные кани. Выигрываем на new, но теперь нужна очистка памяти в GC.

Но опять таки, об этом подумали. Heap (и GC) разделен нв область для ВРЕМЕННЫХ объектов (young-генерация) и ПОСТОЯННЫХ объектов (oldgen). Для которых используют совершенно разные алгоритмы сборки мусора. В оптимале, если во young только временные объекты, их удаление так же будет "мгновенно". Но на практике, т.к. программисты пишут гуано-код, то все работает не совсем так, как ожидалось создателями языка ))))

Плюс теоретики от ООП и новых технологий. Проблема не в распределнии памяти, а в концепции имутабельности объектов (необходимость лишнего копирования/создания иммутаблеьных объектов). Но такая же проблема будет в любом другом языке!

AFAIK
...
Рейтинг: 0 / 0
Что не так с Java String и как вы с этим боретесь?
    #39704302
Eugene New
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,

еще раз спасибо за информативные ответы.

Насчет гуано - тонкий философский вопрос - код ли гуано, или язык, или компилятор..

21 век

Ну и что, что 21 век. Все равно в 21 веке практически ничего нового по теории программирования не изобрели. Рост мощностей вычислительных систем остановился. Лучше чем записи фиксированного размера для доступа к действительно большим массивам данных все равно ведь ничего не изобрели. Т. к. в таком случае адрес нужной записи вычисляется по индексу легко.

Я вообще вижу, что в 21 веке часто стали изобретать велосипеды 50-летней давности, по невежеству наступая на все уже пройденные грабли. Например, xml - тупик иерархических БД 1950-1960-х годов.

Или среды разработки, которые делают меньше, хуже и медленнее, пожирая дикое количество ресурсов по сравнению с тем, что быстро работало на Pentium-I.
...
Рейтинг: 0 / 0
Что не так с Java String и как вы с этим боретесь?
    #39704313
Eugene New
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lelouch,
"Страшное" в вашем примере на java не количество экземпляров строки

Вы уж определитесь - да или нет. Создаются 100 объектов, висят ли в памяти или нет. Я ведь прямо об этом спросил сразу же.

Leonid Kudryavtsev,
Но такая же проблема будет в любом другом языке!

Что такого в сборщике мусора от Java, чему повредит досрочное удаление объекта, сделанное без поиска в памяти? Иммутабельные временные переменные, созданные в выражениях, можно удалять сразу именно потому, что они иммутабельные.
...
Рейтинг: 0 / 0
Что не так с Java String и как вы с этим боретесь?
    #39704315
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eugene New,

не надо гнать , а надо знать
http://proglang.su/java/strings-stringbuilder-stringbuffer
можешь сразу задать длину с запасом и будет у тебя "строка фиксированного размера" (правда может ещё и увеличиваться.
...
Рейтинг: 0 / 0
Что не так с Java String и как вы с этим боретесь?
    #39704337
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eugene NewLelouch,
"Страшное" в вашем примере на java не количество экземпляров строки

Вы уж определитесь - да или нет. Создаются 100 объектов, висят ли в памяти или нет. Я ведь прямо об этом спросил сразу же.


Вы спросили что не так со строками - вам ответили.
Потом вы спросили какую-то ересь про подсчёт количества ссылок для строк, считая это решением проблемы, которую сами себе придумали.

Почему нельзя удалять сразу - Почитайте про то, как выполняется выделение памяти и сборка мусора, вопрос пропадёт. Кратко - большинство сборщиков должны выполнить упаковку кучи (heap compaction), чтобы освободить память (по-моему только Concurrent mark and sweep упаковку не выполняет)
...
Рейтинг: 0 / 0
25 сообщений из 293, страница 1 из 12
Форумы / Java [игнор отключен] [закрыт для гостей] / Что не так с Java String и как вы с этим боретесь?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]