7_4_1주차 hyowon - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki

java 콜백 함수는 힙 메모리에 쌓이나?

  • Ok. 가비지컬렉터는 heap을 관리하는데, "callback 누수가 발생한다"는 말에서 유추해보자면 callback도 heap 내에 존재할 것.

리스너(listener) 혹은 콜백(callback) 내에서도 누수가 발생할 수 있는 이유?

콜백은 호출당하는 쪽에서 함수를 실행할지 안할지를 판단하기 때문에,
콜러에서 콜백함수가 등록해서 사용하는 코드가 있어도, 코드가 실제 실행되는지 안되는지 GC가 판단할 수 없습니다.
이럴 때 활용 가능한 것이 약한 참조를 사용하는 WeakHashmap입니다.

WeakHashmap

  • 보통의 맵은 키에 값이 null이 들어가면 키를 삭제합니다.
  • 그러나 WeakHashmap을 사용하면 (약한 참조) 값이 더이상 사용되지 않은 경우에도 키를 삭제합니다.
  • HashMap과 마찬가지로 thread-safe하지 않습니다.

2. 함수형 인터페이스에서 사용하는 구현체는 어디 메모리에 쌓이나?

모든 메서드, 필드 정보는 메서드 에리어에 저장된 후 인스턴스화 될 때 가져와서 heap에 객체를 올립니다.
그러므로 함수형 인터페이스의 구현체를 인스턴스로 본다면 heap에 저장되어있다고 말할 수 있고,
코드 그 자체를 말하는 거라면 메서드 에리어에 쌓여있다고 말할 수 있습니다.

3. WeakHashMap에서 참조키를 지워주는 로직?

상세 코드를 보는 대신 weak reference 방식을 찾아보았습니다.

[Weak Reference 작동방식]

  • java.lang.ref 패키지 안에 SoftReference, WeakReference, PhantomReference 클래스를 사용합니다.
  • 객체 참조를 할 때 참조되는 객체(referent)를 캡슐화한 WeakReference 객체를 생성하고, 캡슐화된 내부객체는 WeakReference에 의해 참조됩니다.
  • java GC는 WeakReference 객체를 보고 참조된 객체를 특별하게 다룹니다.
  • 그래서, 메모리 회수 타이밍이 strong ref와 달라지게 됩니다.
  • 즉, ref 패키지 내부 클래스를 사용해 개발자가 GC 작업에 관여할 수 있습니다.

4. 클래스가 private이거나 package private이고 equals 메서드를 호출할 일이 없다.(이너 클래스로 되어있으면 equals()가 필요하지 않나?)

이펙티브 자바 item 10(p.52)을 참고하면
클래스가 private이거나 package private이고 equals 메서드를 호출할 일이 없다"면" → equals()를 구현할 필요가 없다는 맥락이었습니다.