JAVA학습 1주차 (2021.01.21)
목표
자바 소스 파일(.java)을 JVM으로 실행하는 과정 이해하기.
학습할 것
- JVM이란 무엇인가
- 컴파일 하는 방법
- 실행하는 방법
- 바이트코드란 무엇인가
- JIT 컴파일러란 무엇이며 어떻게 동작하는지
- JVM 구성 요소
- JDK와 JRE의 차이
- JAVAC 옵션
- Opcode란?
JVM이란 무엇인가
JAVA Virtual Machine
시스템 메모리를 관리하면서 자바 기반 어플리케이션을 위해 이식 가능한 실행 환경을 제공
ㄴ무슨말이냐
ㄴ메모리를 생각 안해도 자바가 알아서 할당 해제 해준다는 말이다이말이야
방어적 코딩
ㄴ방어적 프로그래밍은 예상치 못한 입력에도 한 소프트웨어가 계속적 기능 수행을 보장할 수 있도록 고안된 방어적 설계의 한 형태이다. 이 생각은 머피의 법칙이 발현할 가능성을 줄이거나 제거하는 것으로 보일 수 있다.
ㄴ예외 처리(?)
JVM의 2가지 원칙
어느 운영체제 상에서도 싱해욀 수 있게 한다.
메모리 관리하고 최적화 한다
메모리 관리
ㄴHEAP과 STACK의 메모리를 어떤 과정으로 관리하는가
ㄴ가바지 컬렉션
ㄴㄴ자바 프로그램에서 사용되지 않는 메모리를 지속적으로 찾아내서 제거한다
신기하네
자바 컴파일 과정
일단 컴파일이란 사용자 언어를 기계어로 바꾸는 걸 말한다.
자바는 그 과정을 JVM을 통해서 진행한다
그래서 어떤 환경이든 JVM이 있다면
컴파일되는것이다.
자바파일생성 -> 빌드 -> JAVAC라는 명령어를 사용해 CLASS파일 생성
= 자바 바이트코드 완성(반 기계어) == CLASS
CLASS를 크래스로더에 의해서 JVM내로 로드 -> 실행엔진에 의해서 기계어로 해석되면서 메모리상에 배치
++실행엔진
Interpreter : 자바 바이트 코드를 한줄 씩 실행. 속도가 느림.
JIT Compiler : Interpreter의 단점을 보완. 전체 바이트 코드를 컴파일. 속도가 느림. 하지만 캐시 사용으로 한번 컴파일 하면 다음에는 빠르게 수행됨.
출처: https://aljjabaegi.tistory.com/387 [알짜배기 프로그래머]
메모리 과정은 한번 읽어봤음
실행하는 방법
코드작성 -> .JAVA로 소스파일 생성 -> 자바C로 .CLASS생성(컴파일) -> 클래스적재와 바이드 코드 검증 및 실행
- 클래스 적재기
JVM안의 적재기는 클래스 파일들을 메모리에 올려둠
- 바이드코드검즘
바이드코드 == CLASS파일
CLASS코드가 이상이 없는지, 자바의 보안 규칙을 위배하지 않는지 검사
실행
++메모장에 있는것을 JAVAC로 컴파일만 하면 .CLASS가 생성됨
바이트코드& JIT 컴파일러
바이트 코드
JAVAC에 의해서 .CLASS화된 코드
반기계어라고 함
JIT Compiler : Interpreter의 단점을 보완. 전체 바이트 코드를 컴파일. 속도가 느림. 하지만 캐시 사용으로 한번 컴파일 하면 다음에는 빠르게 수행됨.
실행엔진의 한 종류
JVM 구성 요소
Class Loader
==.CLASS파일을 읽고 메모리에 배치를 하는 모듈
Execution Engine
== 배치된 코드를 실행하는것
Interpreter
JIT (Just In Time) Compiler
==실행엔진
Garbage Collector
==동적으로 할당된 메모리를 실시간으로 해제하는것
JDK와 JRE의 차이
JDK = JRE + @
JRE는 읽기 전용, JDK 읽기 / 쓰기 전용
일단 JVM은
반기계어인
바이너리 코드를 읽고 검증하고 실행하는것
JRE는 JVM의 실행환경을 구현했다고 할 수 있다.
JDK는 개발을 위해 필요한 도구(javac, java등)들을 포함한다.
JDK를 설치하면 JRE도 같이 설치됨
결론 JDK만 있으면 됨 ㄷ
javac 옵션
개발을 하다보면 맞게 코드를 작성해도 오류가 나타나는 경우가있다
1. classpath 옵션을 이용해서 컴파일할때 필요한 클래스들의 경로를 지정해주않는다.
2. 이전에 class하였던 자바 언어와 현재의 언어 버전이 다르다 등등
-classpath (-cp) :
컴파일러가 컴파일 할때 필요로하는 라이브러리나 클래스들의 경로를 지정해주는 옵션이다.
classpath 옵션을 이용해서 컴파일할때 필요한 클래스들의 경로를 지정해주지 않으면 에러들이 발생
그럴땐 javac -classpath lib경로/* java파일 로 입력해주면 된다.
아래 예시를 참조.
javac -classpath 프로젝트경로/WEB-INF/lib/* 프로젝트경로/WEB-INF/classes/SomeFile.java
절대경로로 입력하든, 상대경로로 입력하든 시스템이 찾아갈수있게끔만 지정해주면 된다.
2.
이런 상황이면 버전 확인 후 경로 지정해주어야 한다.
Opcode
우리가 읽을 수 있는 어셈블리어보다 기계어 쪽으로 한단계 더 간 코드이다,