Лучший способ оптимизировать строковые данные в приложении, которое выделяет довольно много - PullRequest
0 голосов
/ 07 июня 2018

У меня есть приложение, которое использует тонну String объектов.Один из моих объектов (назовем его Person) содержит 9 из них.Данные, которые записываются в каждый объект String, никогда не записываются более одного раза, но после этого будут считаны несколько раз.Там будет несколько сотен тысяч или около того Person объектов в данный момент времени, и многие из этих Person объектов будут иметь имя, фамилию и т. Д. ...

Я пытаюсь придумать немедленные путичтобы уменьшить объем памяти, который используется объектом Person, но я не эксперт, когда речь заходит о том, как Java управляет своей памятью.

Прежде чем я спущусь по этой кроличьей норе, я хотел бы знать, какие бы были недостатки, если бы я пошел по этим путям, и если бы это вообще имело смысл:

  • Использование StringBuilder или StringBuffer исключительно из-за метода trimToSize(), который позволил бы мне уменьшить количество выделенных байтов, используемых в строке.
  • Сохранять строки как массивы byte[] и предоставлять получательэто преобразовало бы byte[] в String и установщик, который принял бы String и преобразовал бы в byte[] - данные читаются довольно немного, так что это будет слишком дорого?
  • Создатьхеш-таблица для (давайте просто скажем) «имен», которые будут препятствовать повторному выделению (используя указатель) для одного и того же имени снова и снова (могут быть тысячи имен с 10+ символами).

Прежде чем я бессмысленно направляюсь по какой-либо из этих дорог, имеет ли это смысл делать?Может быть, Java уже сокращает String выделений и проверяет дубликаты?

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

1 Ответ

0 голосов
/ 07 июня 2018
  1. Очевидно, что StringBuilder и StringBuffer не могли помочь в этом случае.String является неизменным объектом, поэтому эти 2 класса были введены для построения Strings, а не для хранения.В любом случае вы можете (в большинстве случаев - обязательно) использовать StringBuilder, если вы объединяете / вставляете символы в середине / удаляете некоторые символы из / из строк

  2. По моему мнению, второй вариант может привести кувеличение потребления памяти, потому что новая строка будет создаваться, когда byte [] будет преобразовываться в строку каждый раз, когда вам это нужно.

  3. Рукописный StringDeduplicator - очень разумное решение, особенно если вы застряли с Java5,6,7.

  4. Java 8/9 имеет опцию дедупликации строк. По умолчанию эта опция отключена .Чтобы использовать его в Java 8, необходимо включить сборщик мусора G1, в то время как в Java 9 G1 является значением по умолчанию .

    -XX: + UseStringDeduplication

Относительно дедупликации строки см .:

...