Нужно ли беспокоиться о пуле String Constant? - PullRequest
2 голосов
/ 10 октября 2008

У меня есть Java-приложение, которое очень сильно зависит от строки - оно принимает огромное количество больших, различных объектов String.

Нужно ли беспокоиться о пуле строковых констант для памяти и производительности?

Есть ли способ узнать, насколько велик пул в какой-то момент?

Ответы [ 5 ]

4 голосов
/ 10 октября 2008

Как сказал Марио, константный пул относится только к внутренним () ed-строкам и к строкам, которые являются константами в коде Java (они неявно интернированы).

Но есть еще одна оговорка, которая может относиться к вашему делу: substring() метод будет использовать базовый char[] с оригинальная строка. Итак, шаблон

  String large = ...                  // read 10k string
  String small = large.substring(...) // extrakt a few chars
  large = null;  // large String object no longer reachable,
                 // but 10k char[] still alive, as long as small lives

может вызвать неожиданное использование памяти.

3 голосов
/ 10 октября 2008

Если это поток объектов, то, насколько я знаю, они не попадают в пул констант String, если вы не вызовете intern (). Потребление памяти для интернированных строк происходит не из кучи, а из пространства памяти Perm Gen, поэтому, если вы интернируете много строк, приложение вылетит с OutOfMemory, даже если осталось много кучи.

Так что это не должно быть проблемой, если вы не интернируете все эти строки. Если это станет проблемой, у вас будет возможность иметь собственную реализацию Map для хранения этих строк, поэтому вы не используете внутренний механизм.

Я проверил реализацию метода intern (), и он является нативным, поэтому не представляется простым измерить потребление памяти или просмотреть содержимое пула.

Вы можете использовать этот флаг для увеличения PermSize, если вам не хватает памяти:

-XX:MaxPermSize=64m
1 голос
/ 10 октября 2008

Я думаю, что вы должны профилировать вашу заявку, как с интернированием, так и без него. Тогда вы точно увидите, что это за эффект.

Я не верю, что есть способ увидеть размер пула строковых констант.

0 голосов
/ 13 августа 2015

В Java 1.7 substring () - метод больше не использует тот же символ [], а копирует подстроку в новый массив, т.е.

public String substring(int beginIndex, int endIndex) {
        if (beginIndex < 0) {
            throw new StringIndexOutOfBoundsException(beginIndex);
        }
        if (endIndex > value.length) {
            throw new StringIndexOutOfBoundsException(endIndex);
        }
        int subLen = endIndex - beginIndex;
        if (subLen < 0) {
            throw new StringIndexOutOfBoundsException(subLen);
        }
        return ((beginIndex == 0) && (endIndex == value.length)) ? this
                : new String(value, beginIndex, subLen);
    }

, что для конструктора String, если beginIndex не равно нулю или endIndex не равно длине массива char [].

public String(char value[], int offset, int count) {
        if (offset < 0) {
            throw new StringIndexOutOfBoundsException(offset);
        }
        if (count < 0) {
            throw new StringIndexOutOfBoundsException(count);
        }
        // Note: offset or count might be near -1>>>1.
        if (offset > value.length - count) {
            throw new StringIndexOutOfBoundsException(offset + count);
        }
        this.value = Arrays.copyOfRange(value, offset, offset+count);
    }
0 голосов
/ 10 октября 2008

Не зная точно, что это за программа, я могу только предложить вам попытаться использовать строки в качестве потока, а не хранить строку в целом. Возможно, вам нужно сделать больше абстракций для своего приложения и изобрести промежуточное представление, которое более эффективно использует память?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...