Мухи могут помочь
Если не сжимает, вы можете использовать шаблон Flyweight, чтобы избежать затрат на строку-клавишу, повторяемую в каждом объекте.
Помните, что строка - это объект, поэтому ключ в вашей хэш-карте является ссылкой на нее. Если множество объектов с одинаковым свойством используют ссылки на один и тот же строковый объект, у вас есть только 4 байта для каждой ссылки и только одна строка в памяти.
Как убедиться, что вы разделяете строковые объекты между объектами? Вы можете использовать что-то похожее на String.intern()
. Но, пожалуйста, не используйте сам String.intern () .
Стажировка строки возвращает тот же строковый объект для того же строкового значения. Вы должны хранить кеш для этих строк. Причина, по которой я не рекомендую String.intern (), заключается в том, что кеш - это сам класс String, поэтому он никогда не будет освобожден. Но вы можете реализовать что-то аналогичное.
Этот код возвращает вашу собственную строку, если она новая. И возвращает первый, если это не так.
HashMap<String,String> internedStrings = new HashMap<String,String>();
syncrhonized String returnUniqueString(String str) {
String alreadyCached = internedStrings.get(str);
if (alreadyCached == null) {
internedStrings.put(str, str);
alreadyCached = str;
}
return alreadyCached;
}
Но если вы сжимаете, не
Поскольку сжатие означает, что вы сериализуете свои графы объектов, и каждое имя свойства будет сериализовано как отдельная строка, поэтому повторяется. Возможно, сжатый размер не слишком сильно увеличивается, потому что это повторяющаяся строка, но при повторном увлажнении объектов они будут создаваться отдельно.
Может быть, вы можете использовать returnUniqueString
во время повторного увлажнения:)