본문 바로가기
Back-End/Java

Java 예습

by newny 2023. 3. 11.
반응형

메모리 사용 영역

.java 명령어로 JVM이 구동되면 JVM은 운영체제에서 할당받은 메모리 영역을 구분하여 사용함
 

메소드 영역

  • static영역이라고도 함
  • JVM이 바이트코드 파일(.class)을 읽은 내용이 저장되는 영역
  • 메소드 영역에 저장되는 정보
    • 클래스 정보(멤버 변수의 이름)
    • 변수 정보(데이터타입, 접근제어자 정보)
    • 메소드 정보(메소드이름, 리턴타입, 파라미터, 접근제어자 정보)
    • static변수(정적 멤버 변수, static이 붙은 자료형)
    • final class변수
    • constant pool(상수풀) : 문자상수, 타입, 필드, 객체참조가 저장됨
  • 메소드 영역에 저장되는 정보는 JVM이 종료될 때 까지 사라지지 않고 고정된 상태로 유지됨
  • 메소드 영역에 있는 것은 어떤곳에서나 접근이 가능해지기 때문에 ‘전역’이라는 키워드를 사용하며, 이 전역변수는 프로그램이 종료될 때 까지 어디서든 사용이 가능함
  • 전역변수를 무분별하게 사용하다 보면 메모리가 부족할 우려가 있음

 

힙영역

모든 객체 타입의 객체가 생성되는 영역
객체의 번지는 메소드 영역과 스택 영역의 상수와 변수에서 참조할 수 있음
JVM은 자바 프로그램에서 new키워드를 사용하여 인스턴스가 생성되면, 해당 인스턴스의 정보를 힙 영역에 저장함
 

스택영역

메소드를 호출할 때마다 생성되는 프레임이 저장되는 영역 → 메소드 호출이 끝나면 프레임은 자동 제거됨
프레임 내부에는 기본타입 변수와 참조타입 변수가 생성되고 제거되는 로컬변수 스택이 있음

자바 생성된 객체 지우는 방법?

자바는 코드를 이용한 객체 제거 방법을 제공하지 않는다. 객체를 제거하는 유일한 방법은 객체의 모든 참조를 끊는것.
참조가 끊긴 객체는 사용되지 않으므로 가비지 컬렉터가 실행되어 제거한다.

public class GarbageObjectExample {
  public static void main(Stirng[] args) {
    String hobby1 = "여행"; // hobby1 변수의 참조 번수지수가 1이라고 하면
    String hobby2 = hobby1; // hobby2 변수의 참조 번지수도 1이됨
    hobby1 = null; // hobby1 변수의 참조 번지수를 끊어도
    
    System.out.println("kind2 : " + kind2);
    //"kind2 : 여행" // hobby2의 참조는 끊어지지 않았으므로 "자동차" 출력됨
    
    hobby2 = null;
    // 모든 참조가 끊겨서 가비지컬렉터가 "여행"에 해당하는 String객체를 지움
  }
}

 

문자열의 비교

자바의 문자열은 좀 특별하다. 다른 참조타입들과 달리 자바의 문자열은 리터럴이 동일하다면 String객체를 공유하도록 설계되어있다.
하지만 new연산자로 생성된 객체는 다른 타입의 객체들과 마찬가지로 값과 상관없이 다른 객체가 된다. 그렇기때문에 문자열의 값 자체를 비교하기 위해서는 equals() 메소드를 사용해야한다.

public class GarbageObjectExample {
  public static void main(Stirng[] args) {
    String hobby1 = "여행";
    String hobby2 = new String("여행");
    System.out.println(hobby1 == hobby2);
    // false
    System.out.println(hobby1.equals(hobby2));
    // true
  }
}
반응형

'Back-End > Java' 카테고리의 다른 글

Java(1)  (0) 2023.03.13
Java 예습  (0) 2023.03.05
Java 예습  (0) 2023.03.04

댓글