Хранится область неизменяемых классов - PullRequest
0 голосов
/ 25 сентября 2019

В недавнем интервью меня спросили, хранится ли строка в пуле строк, так как она поддерживает неизменяемость, тогда где наши пользовательские неизменяемые классы хранятся в java.

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

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

Может кто-нибудь объяснить, что такое область хранения неизменяемых классов, поскольку они также неизменяемы, как строка?

1 Ответ

4 голосов
/ 25 сентября 2019

В недавнем интервью меня спросили, хранится ли строка в пуле строк, так как она поддерживает неизменность, тогда где наши пользовательские неизменяемые классы хранятся в java.

Этобессмысленный вопрос с неверной предпосылкой.Строки не «хранятся в пуле строк», они хранятся в куче, как и любой другой объект.Это своего рода тавтология, поскольку кучная память точно определена как « Куча - это область данных времени выполнения, из которой выделяется память для всех экземпляров и массивов классов. »

Пул строк может рассматриваться как содержащий строки, точно так же, как Collection может содержать объекты, но в любом случае он просто содержит ссылки на объекты.Таким образом, строка, содержащаяся в пуле, по определению сохраняется в динамической памяти, в то время как пул имеет ссылку на нее.

Но интервьюер продолжал утверждать, что - если String имеет string-pool,могут ли неизменяемые классы иметь такую ​​концепцию?

Это совершенно другой вопрос.Конечно, вы можете реализовать пул объектов, как уже указывалось выше по аналогии с Collection.Подобно тому, как строки, содержащиеся в пуле, все еще хранятся в памяти кучи, объекты вашего класса все еще хранятся в памяти кучи, когда на них ссылается любая структура данных, используемая для пула, на которую они ссылаются.Даже не обязательно, чтобы объект был неизменным, чтобы иметь такой пул, но подразумеваемое совместное использование экземпляров может вызвать семантические проблемы, когда возможны мутации.Поэтому создание пула обычно имеет смысл только для неизменяемых объектов.

Например, многие классы-обертки имеют такое совместное использование, методы valueOf для Short, Integer и Long будут возвращать sharedэкземплярам для значений в диапазоне -128 … +127 и реализациям разрешено делиться еще больше, тогда как Byte и Boolean возвращают общие экземпляры для всех возможных значений.

Однако есть причины, почему не каждый неизменяемый классреализует пул для всех его значений:

  • Если имеется большое пространство значений, вы должны рассмотреть вопрос о поддержке сбора мусора неиспользуемых объектов, даже если на него ссылается пул
  • Youнеобходимо учитывать безопасность потоков вашего пула
  • Оба приведенных выше пункта могут привести к сложному решению с потерей производительности, которую вы не хотите платить, когда объект используется только в течение короткого времени, так как только совместное использованиеуменьшает потребление памяти для долго живущих объектов

Это относится и к существующим примерам.Объекты-оболочки предоставляют общие объекты только для ограниченного пространства значений.Которые предварительно выделены и никогда не GCed.Пул строк, с другой стороны, является динамическим, потокобезопасным и поддерживает сборку мусора его элементов, поэтому intern() не является дешевой операцией и не должна применяться к каждой строке.Вместо этого пул в основном используется для констант, которые действительно долгоживущие.

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