-
JAVA - 1 ( JAVA 기초 )study/java 2020. 7. 13. 17:25
C/C++ 과의 차이점
- 실행 환경
- JAVA는 링크 과정이 없이 컴파일러가 바이트 코드를 생성하고, C/C++은 컴파일을 하고 난 후 링크 과정이 필요
- C는 절차 지향 언어이고 JAVA는 객체 지향적인 언어
- C는 임베디드나 운영체제처럼 속도나 용량 등에서 최적화가 필요한 곳에서 주로 사용하고, JAVA는 웹 사이트나 운영체제와 상관없이 실행되어야 하는 응용 SW, 안드로이드 앱 등에서 주로 사용
장/단점
장점
- 운영체제에 독립적 ( JVM 에서 동작하기 때문 )
- 객체 지향적인 언어 ( 캡슐화, 상속, 추상화, 다형성 등)
- 가비지 컬렉터(GC)가 자동으로 메모리 관리
- 오픈 소스 라이브러리가 풍부
- 객체가 필요한 시점에 클래스를 동적 로딩하여 생성
단점
- JVM에 의해 기계어로 번역되고 실행하는 과정을 거치기 때문에 완전한 기계어에 비해 속도가 느림
- 예외처리가 불편 ( 개발자가 직접 해주어야 함 )
구동 원리
1. 소스 코드를 작성 (.java 파일)
2. 컴파일러가 소스 코드(.java)를 바이트 코드(.class)로 변환
3. 런처(java.exe)로 JVM을 구동
4. JVM이 바이트 코드를 해성하여 자바 프로그램 실행
구조
- Class loader : 런타임시에 클래스 파일들을 JVM 내부로 로딩하고, 클래스 파일을 분석한 뒤 각각 런타임 데이터 영역에 배치한다.
- Runtime Data Area : 클래스 로더에서 분석된 클래스 파일의 데이터를 저장하고 실행 도중에 필요한 데이터를 저장
- 메소드 영역 : 바이트 코드의 정보들이 저장되는 공간 ( 바이트 코드, 전역 변수, static 변수 )
- 힙 영역 : 동적 메모리 할당이 되는 영역으로 객체가 저장되는 공간, GC가 관리 ( new로 생성된 객체 )
- 스택 영역 : 컴파일하며 이미 계산된 메모리를 할당하며 Primitive 데이터 타입이 저장, 블록 작업 완료시 메모리 반환 ( 매개 변수, 지역 변수 )
- Native Method : 자바 외의 다른 언어를 저장하는 공간, JNI를 통해 다른 언어와 호환
* JNI(Java Native Interface) : JAVA 외의 언어를 사용할 수 있게 해주는 인터페이스
- Execution Engine : 런타임 데이터 영역에 배치된 바이트 코드를 해석하며 실행. 인터프리터 방식과 JIT 컴파일 방식을 혼합하여 해석
* 인터프리터 방식 : 바이트 코드를 한 줄씩 읽으며 해석
* JIT(Just-In-Time) : 바이트 코드를 런타임 시점에 바로 기계어로 변환
- 가비지 컬렉터 : 때에 따라 메모리 관리 기능을 자동으로 수행. 더 이상 사용되지 않는 객체를 해제시켜 메모리를 반납
※ Heap vs Stack
Heap
Stack
동적 메모리 할당(런타임때)
컴파일할 때 이미 계산된 메모리 할당
전역, 정적 변수 저장
Object type 저장
지역, 매개 변수, primitive type 변수 저장 heap에 저장된 참조 값 저장
GC가 처리
한 블록씩 작업이 종료되는데 각 작업이 종료되면 메모리 반환
JVM(Java Virtual Machine)
: 일반 프로그램은 운영체제가 프로그램을 실행시키는 반면 JAVA는 운영체제가 JVM을 실행시키면 JVM이 프로그램을 실행
사진 출처 :
JVM의 메모리 구조
'study > java' 카테고리의 다른 글
[JAVA] Try-with-resources (0) 2020.07.30 JAVA - 5 (0) 2020.07.20 JAVA - 4 ( 객체지향 ) (0) 2020.07.16 JAVA - 3 (0) 2020.07.16 JAVA - 2 (변수타입과 컬렉션) (0) 2020.07.15