본문 바로가기
프로그래밍/Java

Java - JVM의 메모리 모델과 Object 클래스

by 왕거 2020. 7. 23.

19강까지 진행했다.

 

위코드 기간동안은 파이썬을 위주로 진행할 수 밖에 없어서 남은 강의들을 듣는데에 시간이 얼마나 걸릴지 모르겠다.

 

틈틈이 진행해야겠다.

 

 

JVM(자바)의 메모리 모델

  • JVM의 메모리는 3가지의 영역으로 나누어 관리된다.공간을 나누는 목적은 메모리 제어의 효율성 확보가 목적
    • 메소드 영역
      • 메소드들의 바이트코드
      • Static 변수
      • 메소드 영역에는 프로그램 실행에 필수적인 바이트 코드가 위치하는 영역이기 때문에 프로그램 실행 도중에 삭제될 일이 없기 때문에 static 변수도 이 곳에 위치한다.
      • 이 영역은 프로그램이 완전히 종료될 때 없어진다고 볼 수 있다.
    • 스택 영역
      • 지역변수
      • 매개변수
      • 스택 영역에는 일반적인 변수들과 매개변수들이 위치하는 영역이다. 동시에 stack 자료구조의 특징인 LIFO구조와도 유사하게 작동한다.
        • 프로그램 흐름이 위에서 아래로 진행되는 점과 중간중간 할당되었다가 사라지는 지역 및 매개변수들을 생각해보면 된다.
      • 해당되는 변수들을 사용한 메소드가 종료될 때 영역에서 값을 지운다.
    • 힙 영역
      • 인스턴스
      • 힙 영역은 인스턴스들을 위한 영역이다.
      • 참조 변수와 인스턴스의 관계는 1대1이 아니기 때문에 참조 변수가 지워졌다고 해서 인스턴스도 지울 수 없는 경우가 있다.
        • 이 경우를 위한 공간이 힙 영역으로 JVM이 어떤 변수로부터도 참조당하지 않는 인스턴스를 찾아내서 지우는 작업인 Garbage Collection을 위한 영역이라고 이해하면 편하다.
  • OS의 입장에서 볼 때에는 JVM 또한 하나의 프로그램일 뿐이다. 전체 메모리 할당의 경우도 OS의 할당에 따른다.
    • JVM을 표현할 때 사용되는 stack구조를 보면 하나의 JVM에 여러 자바 프로그램이 돌아가는 걸로 알 수 있으나 n개의 자바 프로그램 실행되면 n개의 JVM이 실행된다. 

 

Garbage Collection

  • 더 이상 참조되지 않는 인스턴스를 JVM이 자동적으로 삭제하는 작업
  • 작업 자체가 꽤 무겁고 자원을 필요로 하기 때문에 이 작업을 많이 수행하는 경우 그 만큼 소요되는 시간이 늘어난다.

 

Object 클래스

  • finalize()
    • object 클래스의 메소드로 모든 클래스에서 해당 메소드를 사용할 수 있다.
    • 인스턴스가 소멸할 때 호출되는 메소드로 Garbage Collection 작업과 관련이 있다.
    • 자식 클래스에서 오버라이딩하여 사용이 가능하나, 추천하지 않거나, 아예 쓰지 말라고 못박은 경우도 있다.
  • equals()
    • object 클래스의 메소드로 참조 값을 비교하는 연산을 제공한다. "==" 연산과 동일함
      • 단 참조하는 인스턴스 자체를 비교할 뿐 내부의 데이터까지 비교하지 않는다.
    • 오버라이딩해서 사용하는 것을 전제로 제공된다.
      • 개발자가 직접 어떤 값을 비교할 지, 어떤 것이 참인지 거짓인지 등을 정해서 사용이 가능하다.
  • clone()
    • object 클래스의 메소드로 목표로한 인스턴스를 복사한다.
      • 인스턴스를 복사하는 작업은 간단하게 볼 일이 아니기 때문에 개발자가 직접 cloneable 인터페이스를 구현해주어야 clone 메소드를 사용할 수 있다.
    • 기본적으로 오버라이딩하여 protected인 접근 지정자를 바꿔줘야 사용이 원활하다.
    • 기본적인 반환형이 Object이기 때문에 반환값에 대해서 형변환이 필수로 진행되어야 한다.
      • 오버라이딩하는 메소드가 있는 클래스에 한해서 Object가 아닌 다른 클래스를 반환형으로 지정해 줄 수 있다.

Shallow Copy and Deep Copy

  • Shallow Copy - 얕은 복사
    • clone를 통해서 복사를 할 때 인스턴스 자체만 복사되는 것
      • 인스턴스 내부까지 포함하는 복사는 추가적인 작업이 필요하다.
  • Deep Copy - 깊은 복사
    • 얕은 복사에서 인스턴스 내부까지 포함하는 작업을 clone 메소드를 오버라이딩해서 구현한 복사

 

'프로그래밍 > Java' 카테고리의 다른 글

Ubuntu에서 Java 개발환경 세팅  (0) 2020.09.14
Java - Java의 기본 클래스 (1)  (0) 2020.07.25
Java - 예외처리 (2)  (0) 2020.07.17
Java - 예외처리 (1)  (0) 2020.07.12
Java - 인터페이스  (0) 2020.07.08