Строка занимает большое количество памяти в любом приложении. В частности, массив Char [], содержащий независимый символ UTF-16, больше всего способствует потреблению памяти JVM-потому что каждый символ занимает 2 цифры.
30%памяти на самом деле очень распространены. Используя Java 8 Update 20, теперь мы можем связаться с новой функцией, называемой строкой, чтобы стать тяжелой.
Строка повторно используется для повторного использования внутреннего из строки, на самом деле является массивом char, а особенность финала, поэтому JVM может произвольно манипулировать ими.
Разработчик рассматривает множество стратегий для строки строки, но окончательная реализация используется в окончательной реализации:
Всякий раз, когда устройство восстановления мусора обращается к объекту String, оно будет отмечать массив CHAR. Он получил хеш -значение массива char и существует его со слабой ссылкой на массив. Пока мусор -репутатор находит другую строку, а эта строка и массив ЧАР имеют одинаковый хэш -код, то оба сравниваются с одним символом и одним символом.
Если они просто совпадают, будет изменена строка, указывая на массив Чар второй строки. Первый массив char больше не цитируется, поэтому его можно переработать.
Конечно, весь этот процесс приносит некоторые расходы, но он контролируется очень плотным верхним пределом. Например, если персонаж не будет повторен, его больше не будут проверять в течение определенного периода времени.
Так как же работает эта функция? Прежде всего, вам нужно просто отпустить Java 8 Update 20, а затем следить за этой конфигурацией: -xmx256m -xx:+USEG1GC, чтобы запустить следующий код:
Общедоступные классы j = 0; );}}}
Этот код будет сообщены OutofmemoryError после 30 итераций.
Теперь откройте строку, чтобы перейти, используйте следующую конфигурацию для запуска вышеуказанного кода:
-Xmx256m -xx:+useg1gc -xx:+useStringdeduplication -xx:+printstringuplicationstator
В настоящее время он может работать дольше, и он закончится только после 50 итераций.
JVM также напечатал то, что сделал, давайте посмотрим:
[GC-одновременная дедупликация String String, 4658,2K-> 0,0B (4658,2K), AVG 99,6%, 0,0165023 сек] [Последний исполнитель: 0,0165023 СЕС, IDLE: 0,0953764 SEC: блокировано: 0/0,00000 с. [Skippd: 0 (0,0%)] [Hashed: 119538 (100,0%)] [известно: 0 (0,0%)] [Новая: 119538 (100,0%) 4658,2K] [DedUplicated: 119538 (100,0%) 4658,2K (100,0 .0.0] [Young: 372 (0,3%) 14,5K (0,3%)] [Old: 119166 (99,7%) 4643,8K (99,7%)] [Всего EXEC: 4/0,0802259 СЕС, холостое время: 4/0,6491928 с, заблокированные : 0/0,0000000 с] [осмотрено: 557503] [Specked: 0 (0,0%)] [Hashed: 556191 (99,8%)] [известно: 903 (0,2%)] [Новое: 556600 (99,8%) 21,2M] [ Дедупликации: 554727 (99,7%) 21,1 млн. (99,6%)] [молодые: 1101 (0,2%) 43,0 тыс. (0,2%)] [старый: 553626 (99,8%) 21,1 млн. : 81.1k] [Размер: 2048, мин: 1024, макс.: 16777216] [Записи: 2776, нагрузка: 135,5%, кэширование: 0, добавлено: 2776, удалено: 0] [Изменение размера: 1, смягчаюсь трид: 13 65 (65 (66,7%), порог выращивания: 4096 (200,0%)] [Повторное количество перебоев: 0, Порог перепроблемы: 120, Хэш Семя: 0x0] [Порог возраста: 3] [queue] [упал: 0]
Для удобства нам не нужно рассчитывать добавление всех данных сами, и этого достаточно, чтобы удобно использовать их.
Приведенный выше сегмент кода предусматривает, что строка достигается тяжелой.
Вышеуказанные функции только что запущены, что означает, что они могут не быть всесторонне рассмотрены.具体的数据在实际的应用中可能看起来有差别 , 尤其是那些应用中字符串被多次使用和传递 因此一些字符串可能被跳过或者早就有了 Hashcode ((, Код строкового хеша был лениво загружен).
В вышеупомянутых случаях вся строка тяжелая, а 4,5 МБ данных удаляется в памяти.
[Таблица] Часть статистической информации о внутренней таблице отслеживания приведена.
Итак, в чем разница между взвешиванием строки и резиденцией строки? Фактически, строка зависит от того, что она похожа на резиденцию.
Споры создателя предложения по улучшению JDK 192 заключаются в том, что застройщики часто не знают, где поместить резидентную строку, или она скрыта из -за фреймворта. Из страны) вам нужны здравый смысл.
Когда строка остается в потоке приложения, когда восстановление мусора асинхронно и передается, строки не будут увеличивать потребление во время выполнения. Это добавит слишком много давления к GC, так что строка не произойдет вообще.