Интервьюер, вероятно, искал циклическую ссылку, подобную приведенному ниже коду (которая, между прочим, приводит к утечке памяти только в очень старых JVM, которые использовали подсчет ссылок, что уже не так). Но это довольно расплывчатый вопрос, так что это отличная возможность продемонстрировать свое понимание управления памятью JVM.
class A {
B bRef;
}
class B {
A aRef;
}
public class Main {
public static void main(String args[]) {
A myA = new A();
B myB = new B();
myA.bRef = myB;
myB.aRef = myA;
myA=null;
myB=null;
/* at this point, there is no access to the myA and myB objects, */
/* even though both objects still have active references. */
} /* main */
}
Тогда вы можете объяснить, что при подсчете ссылок вышеприведенный код приведет к утечке памяти. Но большинство современных JVM больше не используют подсчет ссылок, большинство используют сборщик мусора, который фактически собирает эту память.
Далее вы можете объяснить создание объекта, который имеет базовый собственный ресурс, например:
public class Main {
public static void main(String args[]) {
Socket s = new Socket(InetAddress.getByName("google.com"),80);
s=null;
/* at this point, because you didn't close the socket properly, */
/* you have a leak of a native descriptor, which uses memory. */
}
}
Тогда вы можете объяснить, что технически это утечка памяти, но на самом деле утечка вызвана собственным кодом в JVM, выделяющим базовые собственные ресурсы, которые не были освобождены вашим Java-кодом.
В конце концов, с помощью современной JVM вам нужно написать некоторый код Java, который выделяет собственный ресурс за пределы обычного понимания JVM.