클래스 로더의 종류에 대해 설명해보세요.

상위 계층부터 부트스트랩 클래스 로더, 플랫폼 클래스 로더, 애플리케이션 클래스 로더가 있습니다.
부트스트랩 클래스 로더는 최상위 클래스 로더로 자바 API를 로드하며, 다른 클래스 로더와 달리 네이티브 코드로 구현되어 있습니다. 플랫폼 클래스 로더는 기본 자바 API를 제외한 확장 클래스를 로드합니다. 애플리케이션 클래스 로더는 클래스 패스 지정된 클래스와 라이브러리를 로드합니다.

클래스 로더의 계층 구조에서 어떠한 클래스 로더들이 상위에 위치하고, 하위에 위치하는지 설명해주세요.

최상위에 부트 스트랩 클래스 로더가 위치하고, 플랫폼 클래스 로더, 애플리케이션 클래스 로더가 위치합니다.

클래스로더의 delegation model에 대해 좀 더 상세히 설명해주세요. 클래스로더가 클래스를 로드할 때 어떤 과정을 거치는지 설명해보세요.

Delegation Model은 계층 구조를 통해 클래스 로딩 요청을 상위 클래스 로더로 위임하는 방식을 의미합니다. 하위 클래스인 애플리케이션 클래스 로더는 부모인 플랫폼 클래스 로더에 요청을 전달하고, 다시 최상위 부트스트랩 클래스에게 요청을 전달합니다. 최상위 클래스 로더에서 클래스를 찾으면 클래스가 로드되고, 못 찾으면 하위 클래스로 요청을 다시 전달합니다.

클래스 로더의 부모-자식 관계가 클래스를 로드하는 과정에 어떤 영향을 미치나요?

클래스 로더는 부모 클래스 로더에게 클래스를 먼저 검색하도록 위임하고, 부모 클래스 로더가 클래스를 찾지 못한 경우에 자식 클래스 로더에게 검색을 위임합니다.

클래스 로더의 위임 방식은 어떤 이점을 가지고 있으며, 어떤 순서로 클래스를 검색하는지 설명해주세요.

  • 이점
    (중복 로딩 방지) 상위 클래스에서 이미 로딩된 클래스가 중복 로딩되는 것을 방지하여 메모리 낭비를 방지할 수 있습니다.
    (보안 강화) 상위 클래스 로더는 표준 자바 API, 확장 라이브러리를 로드합니다. 따라서 하위 클래스 로더가 핵심 자바API나 확장 클래스를 임의로 로드, 변경되는 것을 방지하여 시스템 보안과 안정성을 유지할 수 있습니다.
  • 순서
    부트스트랩 클래스 로더를 통해 표준 자바 API 클래스가 로드된 후
    확장 클래스 로더에서 확장 클래스가 로드합니다.
    이후 애플리케이션 클래스 로더에서 클래스 패스에 있는 클래스를 로드합니다.

GC 발생할 때 어플리케이션이 일시적으로 중단되는 이유는 무엇인가요?

메모리 일관성 유지, 오동작을 방지하기 위함이다.
GC 도중 다른 스레드에 의해 사용되지 않던 객체가 다시 참조하게 되는 경우 오동작을 일으킬 수도 있고, 메모리의 일관성이 깨질 수 있다. 특히 컴팩션 과정에서 객체가 이동하는 동안 해당 객체를 참조한다면 잘못된 위치를 참조할 수도 있다. 따라서 이러한 프로그램의 오동작, 메모리 일관성을 유지하기 위해 애플리케이션은 일시적으로 중단될 수 있다.

'언어, 프레임워크 > TIL' 카테고리의 다른 글

7/4 TIL  (0) 2024.07.05

hashCode()와 equals() 메소드의 관계에 대해 설명하세요.

두 객체가 equals()에 의해 동일하다면, 두 객체의 해시코드는 동일해야 하는 관계를 가집니다.

이퀄스 메소드를 오버라이딩할 때 어떤 점을 주의해야 하나요?

해시 코드와 같이 오버라이딩해야 합니다. 같이 오버라이딩하지 않으면 해시 기반의 자료구조가 제대로 작동하지 않을 수 있기 때문입니다.

이퀄스 메소드와 해시코드가 일관되지 않을 때 어떤 문제가 발생할 수 있나요?

해시 컬렉션의 객체 동등성 비교가 제대로 동작하지 않을 수 있습니다.

이퀄스 메소드와 해시코드를 일관되게 구현하기 위해 무엇을 고려해야 할까요?

일관되게 구현하기 위해서는 객체의 논리적 동등성을 판단할 기준을 고려해야 합니다.
예를 들어 학생 객체 필드는 이름, 주민번호, 나이, 주소. 동등성 판단을 위해 이름이나 나이 고려할 필요 없으며 주민번호로만 판단해도 될 것.

Object equals() 메서드를 오버라이딩할 때 hashCode() 메서드를 같이 오버라이딩해야 하는 이유는 무엇일까요?

해시 코드를 오버라이딩하지 않으면 동일한 객체라 하더라도 서로 다른 해시 코드를 갖게 되어 해시 기반의 자료구조(예: 해시맵)에서 제대로 작동하지 않을 수 있기 때문입니다. 객체를 비교할 때 equals 메서드로 비교하더라도, 해시 코드가 다르면 다른 객체로 간주될 수 있습니다.
따라서 일관성 있는 동작을 보장하기 위해 해시코드를 같이 오버라이딩해야 합니다.

toString() 메서드 재정의하면 뭐가 좋을까?

객체의 상태를 쉽게 확인할 수 있어, 디버깅과 로깅에 유용하게 사용할 수 있다.

==과 .equals() 각각은 무엇을 비교하나?

  • ==은 값을 비교하는 게 아니라 주소를 비교하며,
  • equals() 는 비교하는 객체의 내용을 비교한다. 두 객체가 논리적으로 동등한지 비교한다. (단, 모든 객체의 부모인 Object.equals() 메소드는 주소를 비교하며, 각 클래스에서 equals() 메소드는 오버라이딩해 줘야 함. equals() 구현시 hashCode() 까지 같이 오버라이딩)

primitive type casting과 reference type casting 차이에 대해 설명해보세요.

프리미티브 타입 캐스팅은 주로 값의 크기와 표현 방법을 바꾸는 것이고, 레퍼런스 타입 캐스팅은 상속 계층 구조 내에서 상위 클래스 타입을 하위 클래스 타입으로 바꾸어 객체의 타입을 변환합니다. 레퍼런스 타입 캐스팅은 다형성의 개념도 포함되어 있습니다.

다형성이란 무엇이고 어떤 장점을 가지고 있나요?

다형성이란 하나의 기능이 다양한 형태를 띄는 것을 의미합니다. 자바에서는 하나의 자료형에 여러 타입의 데이터를 대입하여 다양한 결과를 얻어낼 수 있는 성질입니다. 다형성을 통해 코드의 유지보수성과 유연성, 확장성이 높은 코드를 작성할 수 있습니다.
(+ 다형성을 구현하기 위한 방법)

자바에서 다형성을 구현하는 방법 중 하나인 오버라이딩(Overriding)과 오버로딩(Overloading)의 차이점은 무엇인가요?

오버라이딩은 부모 클래스의 메소드를 자식 클래스에서 재정의하는 것을 말하고, 오버로딩은 같은 클래스 내에서 메소드의 이름은 같지만 매개변수의 개수나 타입이 다른 메소드를 여러개 정의하는 것을 말합니다. 오버라이딩은 부모 클래스의 내용을 무시하고 덮어 쓴다면 오버라이딩은 기존 메소드의 기능을 확장한다는 점에서 차이가 있습니다.

오버라이딩시 반드시 지켜야 하는 규칙?

메서드 반환타입, 시그니처 일치해야 하며, 부모 클래스보다 더 제한적인 접근 제어자를 가질 수 없습니다. + 예외까지

자바에서 오버라이딩을 할 때 예외(throws)를 선언하는 규칙은 무엇인가요?

상위 클래스 메서드가 던지는 예외와 동일하거나 하위 타입의 예외를 던져야 합니다.

'언어, 프레임워크 > TIL' 카테고리의 다른 글

7/5 TIL  (0) 2024.07.05

들어가며

JVM 공부 도중 레퍼런스 마다 Method Area와 Permanent Generation 용어가 각각 나타나거나 나타나지 않는 곳도 있어서, JVM의 물리적인 구조의 이해가 약간 어려웠다. 그리고, Permanent Generation 이 Heap 으로 표기된 경우, 아닌 경우도 레퍼런스마다 다 달라서 혼란스러웠다. Metaspace 용어 또한 등장하는데, 레퍼런스마다 있는 곳도 있고, 없는 곳도 있었다. 이 부분은 자바 버전에 따라서 JVM 스펙이 바뀐 부분이었다. 이 부분들에 초점을 맞추어, 자바 버전에 따라서 바뀐 부분을 찾아 정리해 보았고, 앞에 기술했던 용어상 혼란스러웠던 부분도 찾아서 정리해 보았다.


Java 7

  • Permanent Generation
    • Class의 메타 데이터 (바이트코드 포함)
    • Method의 메타 데이터
    • static 객체, 상수 (static final)
    • 상수화된 String Object
    • Class와 관련된 배열 객체 메타데이터
    • JVM 내부 객체들과 JIT 최적화 정보
  • 문제점 - 메모리 관리의 불편함
    • String Constant Pool, static object, Class 메타 데이터들이 쌓여 java.lang.OutOfMemory에러 발생
      • Permanent Generation은 고정된 메모리 사이즈. MAX 값 설정되어 있으며, 초과 에러
  • Permanent Generation은 Non-Heap Memory
    • 국내에 Heap으로 표현된 그림은 Generation 관점에서 JVM 메모리 개념을 설명하기 위한 것일 뿐, Heap이 아님
  • 오라클 HotSpot JVM 에서는 Method AreaPermanent Generation라고 부른다.

Java 8

  • Permanent Generation 제거하고, Metaspace 추가해 Native Memory 영역으로 이동
  • 변경 사항
    • Class의 메타 데이터 (바이트코드 포함) → Metaspace 이동
    • Method의 메타 데이터 → Metaspace 이동
    • static 객체, 상수 (static final) → Heap 이동
    • 상수화된 String Object → Heap 이동
    • Class와 관련된 배열 객체 메타데이터 → Metaspace 이동
    • JVM 내부 객체들과 JIT 최적화 정보 → Metaspace 이동
    • ⇒ static object, literal string 가 Heap으로 이동하여, GC의 대상이 됨
  • Heap은 JVM에 의해 관리, Native Memory는 OS에 의해 관리됨
  • Metaspace 개선점
    • Native Memory에 속하여 OS에 의해 관리되므로, 개발자는 메모리 신경 쓸 필요 없다.
    • MAX 값 설정하지 않으면 디폴트로 OS가 제공할 수 있는 만큼 자동으로 늘어남.
    • MAX 값을 설정하지 않으면 디폴트 값으로 64비트 Integer의 최댓값인 18446744073709547520으로 설정됨
    • 대신, Native Memory를 사용하므로 동일한 서버에 다른 Application까지 모두 죽는 현상 (전체 서버 다운) 이 생길 수 있다.
      • Heap Size모니터링 뿐만 아니라, Metaspace 모니터링이 필요할 수 있음
    • 그래서 Metaspace의 크기를 제한하는 -XX:MetaspaceSize, -XX:MaxMetaspaceSize 옵션을 제공한다.
    • GC 기능을 가지고 있어서 더 이상 사용하지 않는 클래스 메타데이터들을 제거함으로써 메모리를 효율적으로 사용한다.

Metaspace

  • Permanent Generation to Metaspace
    • Java 8부터 Permanent Generation이 Metaspace로 대체
    • Native Memory 영역에 저장
  • 클래스 로더가 로드한 클래스의 메타 데이터 metadata가 저장되는 공간
  • 할당(생성) allocate 시점
    • 클래스가 로드될 때, metaspace가 클래스 로더에 의해 할당됨
  • 해제 release 시점
    • 클래스의 live instance 없고, 참조도 없을 때, GC 후에 해제됨
  • GC
    • Heap 입장에서는 GC를 통해 얻을 수 있는 것이 많지 않더라도, metaspace 내 오래된 class metadata 제거를 위한 GC가 수행되는 것이 효율적일 수 있다.
    • metaspace에서 유도되는 GC 종류
      • metaspace 할당 시
        • 지속적으로 metadata 를 쌓으면서 확장하지만, 공간의 효율적인 활용을 위해 어느 임계 지점에서는 오래된 class loader들을 GC로 정리한다.
      • metaspace OOM 시
        • 메모리 용량이 MaxMetaspaceSize를 초과하거나, Compressed Class Space 가 부족할 때 GC가 발생할 수 있다.

출처

https://jaehoney.tistory.com/177
https://obv-cloud.com/41
https://becomeweasel.tistory.com/entry/JVM%EC%9D%98-Java-8%EC%97%90%EC%84%9C%EC%9D%98-%EB%B3%80%ED%99%94
https://blog.voidmainvoid.net/184
https://stackoverflow.com/questions/41358895/permgen-is-part-of-heap-or-not
https://blog.naver.com/simjunbo/221080829920
https://d2.naver.com/helloworld/1230
https://jaemunbro.medium.com/java-metaspace%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90-ac363816d35e

+ Recent posts