본문 바로가기

개발기술/Java

Java 언어의 이해

Java의 특징

  • "Programmers Write Once, Run Anywhere(WORA)"
  • JVM이라는 Java 가상머신 위에서 동작하기 때문에 환경에 종속되지 않고 동작시킬 수 있음

Java의 장점

- 간결한 객체지향 언어

- Garbage Collection을 통한 메모리 관리

- 플랫폼에 종속적이지 않고, 한번 컴파일 된 프로그램은 어느 운영체제나 환경에서 동일하게 실행을 보장

- 많은 오픈소스 프레임워크를 통해 생산성증가

 

Java의 단점

- 처리속도가 중요한 프로그램에는 맞지 않음

- 최근 나오는 프로그래밍언어에 비해 간결하지 못함

- 하드웨어를 직접 컨트롤할 수 없음

- GUI가 많은 프로그램에는 적합하지 않음

 

Java의 동작원리

  작성된 Java소스코드는 JDK에 포함되어있는 컴파일러를 통해서 클래스파일(바이너리파일)로 변환됨. 변환된 파일은 JVM의 Class Loader에 의해 JVM에서 불러와지게 되며 실행되게되며

 

JDK와 JRE

- JDK(Java Development Kit)
Java를 개발함에 있어 필요한 모든 집합체
JRE를 포함하고 있으며, 그 외에 javadoc, 컴파일러를 포함(javac)

 

- JRE(Java Runtime Environment)
Java를 실행함에 있어 필요한 환경을 포함
JVM을 포함하고 있으며, 그 외에 java class library, java 명령어들을 포함

 

JVM

- JVM(Java Virtual Machine)
Java 소스 코드로부터 생성되는 binary파일 (.class)를 실행시킬 . 수있음

jVM은 자바 클래스 로더(Class Loader)와 자바 실행엔진(Exectuion Engine)에 의존

Java로 작성된 프로그램의 메모리 관리 및 최적화를 수행

한번 컴파일된 파일은 어떤 운영체에서도 같은 JVM환경에서는 동일하게 동작할 수있음(WORA)

  •  



 

자바의 메모리구조

  •  메서드 영역(Method Area): 메서드 영역은 프로그램을 실행하는데 필요한 공통 데이터를 관리한다. 이 영역은 프로그램의 모든 영역에서 공유한다
    • 1. 클래스 정보클래스의 실행 코드(바이트 코드), 필드 생성코드메서드 코드와 인스턴스 생성자 코드 등 모든 실행 코드가 존재한다. 붕어빵의 틀을 보관한다.
    • 2. static 영역`static변수들을 보관한다
    • 3. 런타임 상수 풀프로그램을 실행하는데 필요한 공통 리터럴 상수를 보관한다.  프로그램을 효율 적으로 관리하기 위한 상수들을 관리한다
  •  스택 영역(Stack Area): 실제 프로그램이 실행되는 영역.  메소드 실행할때마다하나의 실행 스택이 생성된다각 스택 프레임은 지역 변수중간 연산 결과메서드 호출 및 회귀정보 등을 포함한다.
    • 스택 프레임:  스택 영역에 쌓이는 메모리 공간이 하나의 스택 프레임이다. 메서드를 호출할 때  쌓이고, 종료되면 제거된다.

      스택 영역은  각 쓰레드별로 하나의 실행 스택이 생성된다. 따라서 쓰레드 수 만큼 스택 영역이 생성된다.

  •  힙 영역(Heap Area)**: 동적으로 배치되는 데이터가 쌓이는 곳이다. 객체(인스턴스)와 배열이 생성되는 영역이다. 가비지 컬렉션(GC)이 이루어지는 주요 영 역이며, 더 이상 참조되지 않는 객체는 GC에 의해 제거된다.
    • 클래스 정보를 활용하여 생성된 인스턴스가 존재함. 붕어빵틀(메소드영역, 클래스)로부터 생성된 붕어빵이 존재함. 
    •  인스턴스 내부의 변수 값은 서로 다를 수 있지만메서드는 공통된 코드를 공유한다따라서 객체가 생성될 때인스턴스 변수에 는 메모리가 할당되지만, 메서드에 대한 새로운 메모리 할당은 없다. 메서드는 메서드 영역에서 공통으로 관리되고 실행된다.
    • 자식이 생성될때, 부모의 생성자가 먼저 작동되어 부모가 먼저 생성되고 그 이후에 자식이 생성됨.
  • 개발상황에서 응용 : 특정 변수에 String을 저장해야할 때, 여러 객체에서 자주 사용한다면 static field으로 설정하는 것이 메모리 관리상 유리하다. method 내에서 저장되는 것은 stack 영역에 method가 실행될 때 마다 새로 쓰이고 지워지고를 반복하며, instance field에 저장되는 것은 동일한 객체 내에서는 공유가 가능하나 객체 간에서는 공유가 불가능하며 heap영역이 과도하면 Garbage Collection이 자주 발생함. 그러므로 모든 객체에서 공유가능한 static field에 저장하는 것이 유리함.

 

클래스와 메모리구조

  • 인스턴스 생성시에 인스턴스 변수가 생기며 이를 Heap 영역에 보관된다. 인스턴스는 클래스의 메타데이터를 pointer로 가리킨다.
  • 클래스의 메타데이터는 메소드의 코드위치를 저장하고 있다. 메소드는 클래스 정보 생성과 함께 메소드영역에 보관된다.

 

Garbage Collection

메모리 할당 후 해체가 안되면 메모리 누수가 발생함. 이를 방지하기 위해서 Java에서는 가비지 컬렉터를 도입하여 동적으로 할당된 메모리 영역 중 더이상 참조되지 않는 영역을 제거를 진행함.

그러나, 가비지 컬렉션이 실행될 때 'Stop the world'가 발생하여 Garbage Collection의 빈번한 발생은 어플리케이션 성능에 좋지 않음.

'개발기술 > Java' 카테고리의 다른 글

Java 쓰레드 관리  (0) 2024.08.12
Java Dependency - Marven, Gradle, exteral libraries(Lombok etc)  (0) 2024.07.05
Java 코딩구현 - I/O System  (1) 2024.06.14
Java 코딩구현 기초 - 데이터타입  (0) 2024.05.22
Java 범용 library  (0) 2024.05.05