Давайте проясним это.
- Интервьюер задал вам гипотетический вопрос
- Интервьюер не указал условия правильно (более позднее)
- Интервьюер имеет утверждал, что что-то произойдет произойдет ... без каких-либо доказательств и без возможности проверить это утверждение.
Предположим, у меня есть компьютер со значительно низким объемом памяти .. поэтому он сказал мне, что я получу исключение OutOfMemoryError
.
Я думаю, что Интервьюер, вероятно, ошибался.
Прежде всего, ваш код не имеет явных утечек памяти. Не то, что я вижу, и не то, что видят другие комментаторы.
Код вашего решения генерирует несколько временных объектов при каждом вызове. Я могу сосчитать до 6 временных строк и 1 или 2 временных массива, а также потенциально другие временные объекты, созданные некоторыми методами библиотеки. Вы могли бы, вероятно, уменьшить это ... , если бы оно стоило затраченного времени на оптимизацию .
Но временные объекты сами по себе не должны приводить к OOME. Современные Oracle / OpenJDK сборщики мусора действительно хороши для сбора краткосрочных объектов.
За исключением пары патологических сценариев ios:
Сценарий # 1.
Предположим, что вы были уже на пороге исчерпания памяти. Например, предположим, что до того, как вы начали 1000 вызовов методов, у вас было только небольшое количество свободного (eden) пространства после выполнения полного G C.
Для вашей задачи завершено, он сгенерирует порядка 1000 x 10 объектов x 10 000 байт временного пространства. Это около 100 МБ.
Если у вас есть 10 МБ свободного пространства Эдема, это означает, что вам потребуется примерно 10 сборок пространства Эдема за короткий промежуток времени.
Если у вас есть 1 МБ свободного пространства в Эдеме, это означает, что вам потребуется примерно 100 коллекций пространства Эдема за короткий промежуток времени.
10 Коллекций пространства Eden вплотную может быть достаточно , чтобы вызвать OOME "Превышен предел накладных расходов". С 100 это гораздо более вероятно.
Но суть в том, что если вы работаете достаточно близко к полной куче, любой фрагмент кода, который выделяет объект, может быть последней каплей. Настоящая проблема в том, что ваша куча слишком мала для задачи ... или что-то еще создает / сохраняет слишком много долгосрочных объектов.
Сценарий # 2 .
Предположим, что ваше приложение имеет строгие требования к задержке. Чтобы реализовать это, вы настраиваете JVM для использования сборщика с низкой паузой и устанавливаете некоторые очень агрессивные цели задержки для сборщика. И у вас также недостаточно памяти.
Теперь, если ваше приложение генерирует слишком много мусора слишком быстро, сборщик с низкой паузой может не справиться. Если вы поставите sh за пределы этого предела, G C вернется к выполнению коллекции «останови мир», чтобы попытаться восстановиться. Вы могли бы получить OOME ... хотя я сомневаюсь в этом. Но вы, безусловно, не достигнете своих целей по задержкам.
Но суть в том, что если у вас есть приложение с такими требованиями, важно, чтобы вы запускали его на машине с достаточными ресурсами; то есть достаточно свободной памяти, достаточно ядер, чтобы (параллельный) G C мог не отставать. Возможно, вы бы спроектировали свой метод isAnagram
, чтобы он был (эмм) немного более осторожным в том, как он создает временные объекты ... но вы бы заранее знали, что вам нужно это сделать.
Резюме
Возвращаясь к вопросу, заданному вашим интервьюером (как вам передано):
Интервьюер не говорит, сколько есть свободного места в куче, поэтому мы не можем сказать, будет ли применяться сценарий № 1. Но если это произойдет, настоящей проблемой будет либо несоответствие между размером кучи и проблемой, либо утечка памяти где-то еще в приложении.
Интервьюер не упоминает ограничения по времени ожидания. Даже если бы они существовали, первым шагом было бы указать c аппаратное обеспечение и использовать соответствующие (то есть реалистичные c) настройки JVM G C.
Если вы столкнулись с проблемами (OOMEs, пропущенные цели задержки), , то вы начинаете искать решения. Используйте профилирование памяти, чтобы определить характер проблемы (например, вызвано ли она временными объектами, долговременными объектами, утечкой памяти и т. Д. c) и отследить источник проблем c объекты.
Не просто предполагайте, что определенный бит кода будет вызывать OOMEs ... как это делает интервьюер. Преждевременная оптимизация - плохая идея.