공부해요/JAVA

[온라인 자바 스터디 1주차] 자바 소스 파일(.java)을 JVM으로 실행하는 과정 이해하기

예쁜꽃이피었으면 2021. 1. 15. 02:41

 

github.com/whiteship/live-study/issues/1

 

1주차 과제: JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가. · Issue #1 · whiteship/live-study

목표 자바 소스 파일(.java)을 JVM으로 실행하는 과정 이해하기. 학습할 것 JVM이란 무엇인가 컴파일 하는 방법 실행하는 방법 바이트코드란 무엇인가 JIT 컴파일러란 무엇이며 어떻게 동작하는지 JV

github.com

- 1주차 과제 목표 
자바 소스 파일(.java)을 JVM으로 실행하는 과정 이해하기. 

- 학습할 것 
1. JVM이란 무엇인가 
2. 컴파일 하는 방법 
3. 실행하는 방법 
4. 바이트코드란 무엇인가 
5. JIT 컴파일러란 무엇이며 어떻게 동작하는지 
6. JVM 구성 요소 
7. JDK와 JRE의 차이

www.youtube.com/watch?v=peEXNN-oob4&list=PLfI752FpVCS96fSsQe2E3HzYTgdmbz6LU&index=1

 

1. JVM이란 무엇인가?

 

자바의 정석 p4 ~ p5

JVM은 'Java virtual machine'을 줄인 것으로 직역하면 '자바를 실행하기 위한 가상 기계'라고 할 수 있다.

(JVM = 컴퓨터를 사용해서 자바를 실행하기 위한 가상 컴퓨터라고 이해하자.)

자바로 작성된 어플리케이션은 모두 이 가상 컴퓨터(JVM)에서만 실행되기 때문에, 자바 어플리케이션이 실행되기 위해서는 반드시 JVM이 필요하다.

 

단점 : java어플리케이션은 JVM을 한 번 더 거치고,

( 일반 어플리케이션 코드는 OS만 거치고 바로 하드웨어로 전달된다. = OS에 종속적 )

하드웨어에 맞게 완전히 컴파일된 상태가 아니고 실행시에 해석(interpret)되기 때문에 속도가 느리다.

( 기술의 발달로 속도가 많이 빨라짐. )

 

장점/특징 : Write once, run anywhere(한 번 작성하면 어디서든 실행된다.) 

java어플리케이션은 JVM하고만 상호작용을 하기 때문에  OS와 하드웨어에 독립적

단, JVM은 OS에 종속적이기 때문에 해당 OS에서 실행가능한 JVM이 필요

 

자바를 다루는 기술 p24 ~p30

JVM은 자바를 실행하기 위한 가상 서버이다.

 

JVM의 단점 : JVM위에서 애플리케이션이 동작하기 때문에 성능과 시스템 자원 접근 측면에서 문제점이 발생한다.

- 구동된 JVM은 컴퓨터의 메모리와 CPU사용량을 차지한다. 시스템 하드웨어 성능이 좋지 않았던 과거에는 자바를 사용하면 성능이 떨어진다는 느낌을 주기도했다.

- c혹은 c++같은 언어는 시스템 함수를 사용할 수 있어서 시스템을 제어하는데 자유로웠지만 자바의 경우에는 JNI를 통해서 JVM을 한 번 더 거쳐야 하므로 성능상의 이슈가 발생하였다. 하지만 하드웨어의 성능이 발전되어서 성능에 대한 이슈는 무시할 정도가되었고, 오히려 자바의 편리함이나 생상성에 좀 더 많은 이목이 집중되었다.

 

> ctrl+ F : JNI

 

 

 

 


 

 

 


2. 컴파일 하는 방법 

자바의 정석 p9 ~ p11

- 자바 개발을 하려면  JDK이외에 메모장, 에이트플러스. 이클립스, 넷빈즈와 같은 편집기 필요

 

                                   javac.exe                                                    java.exe
Hello.java 작성 --------------------------------> Hello.class 생성 --------------------------------------> 실행

1) 컴파일하여 클래스 파일 만들기
파일이 있는 위치로 이동 후 명령어
javac Hello.java
* 파일명 대소문자 구분해야 한다.

2) 클래스 파일 실행
javac Hello.java
( Cmd jni 에러 시  javac Hello.java --release 8) 

 

메모장에 코드를 작성 후 Hello.java로 저장했다.

 

파일이 저장된 위치로 이동 후 컴파일을 하여 클래스 파일을 생성한다.

 

클래스 파일이 생성되었다.

 

 

 

 

 


 

 

 

 

3. 실행하는 방법 

 

만들어진 클래스 파일을 실행하려고 했는데 버전이 맞지 않아서 에러가 났다.

* Cmd jni 에러 해결법 

bskwak.tistory.com/46 

 

[JAVA ERROR] cmd 창에서 나타나는 에러

1. "~~~~"은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는 배치 파일이 아닙니다. 원인 ( 나의 경우) cmd창에 주소 입력할 때 "cd 주소" 가 아닌 그냥 주소만 입력했기 때문에 위와 같은

bskwak.tistory.com

이클립스면 설정파일을 바꿔줘야 하는데.. 그냥 뒤에 버전 정보를 추가하여 실행했다.

 

 

* 자바에서 모든 코드는 반드시 클래스 안에 존재해야 한다.

* 모든 클래스가 main메서드를 가지고 있어야 하는 것은 아니지만, 하나의 java어플리케이션에는 main메서드를 포함한 클래스가 반드시 하나는 있어야 한다.

* 예외적으로 애플릿이나 서블릿은 main메서드가 없어도 되나. 대신 유사한 역할을 하는 다른 메서드가 존재한다.

 

 

 

 

 

 

 


 

 

 

 

4. 바이트코드(Bytecode, 중간언어)란 무엇인가 

ko.wikipedia.org/wiki/%EB%B0%94%EC%9D%B4%ED%8A%B8%EC%BD%94%EB%93%9C

바이트 코드는 특정 하드웨어가 아닌 가상 컴퓨터에서 돌아가는 실행 프로그램을 위한 이진표현법이다.

바이트코드는 특정 하드웨어에 대한 의존성을 줄이고, 인터프리팅도 쉬운 결과물을 생성하고자 하는 프로그래밍 언어에 의해, 출력 코드의 한 형태로 사용된다. 컴파일 되어 만들어진 바이트코드는 특정 하드웨어의 기계 코드를 만드는 컴파일러의 입력으로 사용되거나, 가상 컴퓨터에서 바로 실행된다.

바이트코드 프로그램은 보통 한 번에 하나의 명령어를 읽은 후 실행한다.

이러한 형태의 바이트코드 인터프리터는 높은 이식성을 갖는다.

 

namu.wiki/w/%EB%B0%94%EC%9D%B4%ED%8A%B8%EC%BD%94%EB%93%9C

바이트코드는 고급언어로 작성된 소스 코드를 가상머신이 이해할 수 있는 중간코드로 컴파일 한 것을 말한다.

바이트코드는 가상머신이 있는 곳이라면 대체로 함께 존재한다 (가상머신이 텍스트를 읽지않으니 기계어와 같이 효율적으로 저장하고 불러올 수 있는 형식이 필요하다. )

 

바이트코드라는 명칭은 java및 JVM에서 대표적으로 사용한다.(JAVA바이트코드라고 확실하게 말하기도 한다.)

 

=> 내가 이해한 바이트코드

1. 자바코드를 컴파일 했을 때 생성된 클래스파일이 바이트코드를 담고있다.

javac Hello.java 했을 때 생긴 Hello.class

2. 개발자가 작성한 java등의 고급언어를 JVM(가상 컴퓨터)에서 실행할 수 있게 만든 이진표현법

 

 

 

 

 


 

 

 

 

5. JIT 컴파일러란 무엇이며 어떻게 동작하는지 

ko.wikipedia.org/wiki/%EB%B0%94%EC%9D%B4%ED%8A%B8%EC%BD%94%EB%93%9C 

실시간 번역기 또는 저스트 인 타임(just-in-time, JIT) 컴파일러

실행 중에 필요에 따라서 바이트코드를 기계어로 번역한다.

예를 들어, 자바 C# 코드는 보통 바이트코드 형태로 컴파일되어 저장되며, 실행 전에 JIT 컴파일러에 의해 기계 코드로 번역된다. 이 번역으로 인해 프로그램 실행 전에 지연시간이 발생하게 되지만, 보통 인터프리터보다는 훨씬 좋은 성능을 보여 준다.

 

aboullaite.me/understanding-jit-compiler-just-in-time-compiler/

 

 

 

 


 

 

 

6. JVM 구성 요소 

자바를 다루는 기술 p 25 ~ , p66

* JVM의 내부를 모른다고해도 충분히 개발이 가능하다. 그러나 JVM내부 동작 원리를 안다면 어플리케이션의 성능을 높일 수 있고, JVM을 튜닝한다면 보다 높은 성능을 끌어낼 수 있다.

 

1. 클래스 파일

클래스 파일은 개발자가 만들거나 만들어진 프로그램을 의미한다.

컴파일 과정을 거쳐 생성된 클래스 파일은 JVM에서 실행 가능하다.

 

2. 클래스 로더 서브 시스템

자바 클래스 파일들은 OS에서 직접 동작하지 않고 JVM 위에서 동작한다.

JVM은 실행할 클래스 파일을 읽고, JVM메모리에 올려놓는 과정이 필요한데 이 과정을 클래스로딩이라고 한다.

이 클래스 로딩 작업은 JVM의 클래스 로더 서브 시스템(= 클래스 로더)이 담당한다.

 

2-1.클래스 로더가 JVM메모리에 클래스 파일을 로딩하는 과정

1) JVM에서 실행할 클래스 파일의 내부 구조를 분석한다.

(어떤 메소드가 있는지, 어떤 변수가 선언되어 있는지, 각각의 성격은 어떤지)

2) 분석된 내용을 바탕으로 성격에 따라 구분하고 각각 JVM의 적합한 메모리 영역에 데이터를 올려놓는다.

3) 분류된 데이터는 JVM의 특별한 메모리 영역에 저장되어 있다가 클래스가 실행되면 JVM의 실행 영역의 힙 메모리로 복사된다. 그리고 시스템 리소스를 활용해서 클래스를 실행시킨다.

 

클래스를 분석하는 과정에서 클래스 로더는 리플렉션 기법을 사용하여 컴파일된 클래스 내부를 분석한다. 

> ctrl+ F : 리플렉션 기법 

자바는 클래스를 동적으로 로딩할 수 있다. (= 동적 로딩 , 클래스를 실행하는 도중에 새로운 클래스를 로딩할 수 있다.)

클래스 파일을 로딩하는 시점에 따라

로드 타임 동적 로딩과 런타임 동적 로딩으로 나뉜다.

- 로드 타임 동적 로딩 : 프로그램 실행 초기에 클래스를 로딩하는 것

- 런타임 동적 로딩 : 프로그램 실행 중간에도 클래스를 로딩하는 것

 

3. 실행 데이터 영역(Runtime data area)

: 클래스 로더로부터 분석된 데이터를 저장하고 실행 도중 필요한 데이터를 저장하는 영역

실행 데이터 영역은 메모리에 올라간 클래스, 객체, 변수들이 저장되는 곳으로 5개의 영역으로 구분되어 있다.

( 밑에 4~8 )

 

4. 메소드 영역(Method Area)

: 클래스 로더에 의해서 로딩된 클래스가 저장되는 곳이다.

클래스 = 메소드 + 클래스 변수로 구성되어 있음. => 메타정보

JVM에서 클래스를 실행하면 메소드 영역에서 클래스 정보를 복사하고 힙 영역에서 메모리를 할당하여 실행한다.

 

* 메소드 영역은 JVM메모리 영역 중 가장 먼저 데이터가 저장되는 곳

 

 

5. 스택 영역 (java stacks)

클래스 실행 = 메소드 호출

메소드는 다른 메소드를 호출할 수 있다.

호출된 (실행된) 메소드 정보(매개변수, 지역변수, 복귀 주소 등..)가 저장되는 곳이 스택영역이다.

실행이 끝나면 저장된 정보는 삭제된다.

스택은 LIFO(last in first out)방식으로 동작하기 때문에 메소드 호출 정보나 호출 순서 등을 추적하기 편리하다.

 

6. 힙 영역(Heep Area)

JVM의 실행 데이터 영역 중에서 가장 중요한 역할

클래스를 객체라고 할 때, 객체는 클래스가 실행될 때 생성되서 힙 영역에 저장된다.

힙 영역은 다시 여러개의 영역으로 구분되어 있다.

(밑에 9.Young Generation , 10.Old , 11.Permanent 

Young 영역은 프로그램 내부에 어떤 코드가 실행되면서 새롭게 생긴 데이터가 저장되는 부분

Young영역의 데이터가 계속 사용되면 Old로 이동한다.

Permanent 영역은 클래스에 대한 정보가 저장되는 곳이다.

=> JVM은 데이터의 목적과 수명에 따라서 저장 영역을 달리하여 관리한다.)

클래스 파일이 실행되면 메소드 영역에서 클래스 정보를 복사하여 힙 영역에 실행할 클래스를 위한 메모리를 할당한다.

즉, 힙 영역은 동적으로 데이터가 생성되고 소멸되는 영역이다.

JVM성능 항샹을 위해서 튜닝이 가능한 영역이기도 하다.

 

7. 레지스터 영역(PC Register Area)

현재 JVM이 수행할 명령어릐 주소를 저장하는 메모리 공간(개발자의 개입 필요없음)

 

8. 네이티브 메소드 스택 영역 (Native Method)

OS의 시스템 정보, 리소스를 사용하거나 접근하기 위한 코드로 보통 c, c++로 작성한다.

네이티브 메소드 스택은 이러한 매개변수나 지역 변수 등 네이티브 메소드를 위한 영역으로 이에 대한 정보가 저장된다.

자바 프로그램과 OS사이에 JVM이 존재하고 있기 때문에 자바 프로그램은 시스템에 직접 접근하기 어려운 형태다.

하지만 JNI(java native interface) API를 사용하면 자바 프로그램에서 OS시스템에 대한 접근이 가능하다.

이 때 사용되는 네이티브 메소드들에 대한 정보가 네이티브 메소드 스택 영역에 저장된다.

 

9. Young Generation

Young Generation = Eden / Servivor1 / Servivor2

Young영역에 저장된 데이터의 사용이 끝나고 일정 시간동안 사용되지 않으면 그 데이터는 가비지 컬렉터가 지운다.

> ctrl+ F : 가비지 컬렉터 

 

 

10. Old 영역

빈번하게 사용되는 데이터는 Young영역에서 Old영역으로 이동된다.

Youn영역에 비해 Old영역에서는 오랫동안 데이터가 보관된다.

Old영역에서 실행되는 가비지 컬렉터의 알고리즘은 Young영역보다 수행횟수가 적으며 속도도 느리다. 그래서 저장되는 기간도 더 길다.

 

11. Permanent 영역

클래스들의 정보가 저장되는 영역으로 JVM에서 클래스 정보를 바탕으로 메모리 위에 객체를 빠르게 생성하기 위해 저장하는 곳이다.

* 힙 영역을 이렇게 세가지 영역으로 나눠서 데이터를 저장하는 이유는

첫번째, 보다 효율적으로 데이터를 관리하기 위함이다.

자주 사용되는 데이터는 더 오랫동안 보관하여 전체적인 효율성을 높인다.

두번째, 가비지 컬렉터가 실행되는 동안에 발생하는 STW(Stop The World)를 줄이기 위함.

> ctrl+ F : STW

 

 

자바의 정석 p174

* cv : 클래스 변수

* Iv : 지역 변수

* iv : 인스턴스 변수

 

1. 메서드 영역(method area)

프로그램 실행 중 어떤 클래스가 사용되면, JVM은 해당 클래스의 클래스 파일(.class)을 읽어서 분석하여 클래스에 대한 정보(클래스 데이터)를 이곳에 저장한다.

이 때, 그 클래스의 클래스 변수도 이 영역에 함께 생성된다.

 

2. 힙(heap)

인스턴스가 생성되는 공간, 프로그램 실행 중 생성되는 인스턴스는 모두 이곳에 생성된다.

즉, 인스턴스변수들이 생성되는 공간이다.

 

3. 호출스택(call stack, execution stack)

호출 스택은 메서드의 작업에 필요한 메모리 공간을 제공한다.

메서드가 호출되면, 호출스택에 호출된 메서드를 위한 메모리가 할당되며, 이 메모리는 메서드가 작업을 수행하는 동안 지역변수(매개변수 포함)들과 연산의 중간결과 등을 저장하는데 사용된다.

* 호출 스택의 특징

- 메서드가 호출되면 수행에 필요한 만큼의 메모리를 스택에 할당받는다.

- 메서드가 수행을 마치고나면 사용했던 메모리를 반환하고 스택에서 제거된다.

- 호출스택의 제일 위에 있는 메서드가 현재 실행 중인 메서드이다.

- 아래에 있는 메서드가 바로 위의 메서드를 호출한 메서드이다.

 

 

 

 


 

 

 

 

7. JDK와 JRE의 차이

7-1. JDK란?

ko.wikipedia.org/wiki/%EC%9E%90%EB%B0%94_%EA%B0%9C%EB%B0%9C_%ED%82%A4%ED%8A%B8

자바 개발 키트(java development kit)는 자바SE, 자바EE, 자바 ME플랫폼 중 하나를 구현한 것으로 솔라리스, 리눅스, 맥 OS X,윈도 자바 개발자를 대상으로 오라클에 의해 바이너리 제품으로 제공된다.

 

codevang.tistory.com/86

"JDK > JRE > JVM"

- Java로 된 언어를 컴파일하고 개발할 수 있도록 해주는 개발 환경의 세트를 의미함
- Java Development Kit의 약자, 개발자를 위한 JAVA라고 할 수 있음
- 개발자만을 위한 컴파일러, 디버깅툴 등을 제공
- 개발자 및 사용자를 위한 JAVA인 JRE(+JVM)을 포함한 종합 툴

 

www.itworld.co.kr/news/110817

 

"JDK란 무엇인가" 자바 개발 키트 소개와 설치하기 - ITWorld Korea

자바 개발 키트(Java Development Kit, JDK)는 자바 애플리케이션을 구축하기 위한 핵심 플랫폼 구성요소다. 이 중심에는 자바 컴파일러(Compiler)가 있다.Credit: Nic McPhee (CC BY-SA 2.0)JDK는 자바 가상 머신(Jav

www.itworld.co.kr

 

 

 

7-2. JRE란?

www.itworld.co.kr/news/110768

 

"JRE란 무엇인가", 자바 런타임 환경의 이해 - ITWorld Korea

자바 개발 키트(Java Development Kit, JDK), 자바 가상 머신(Java Virtual Machine, JVM), 자바 런타임 환경(Java Runtime Environment, JRE)은 자바 애플리케이션을 개발하고 실행하기 위한 자바 플랫폼의 3대 구성 요소

www.itworld.co.kr

 

 

 

 

7-3. JDK와 JRE의 차이점

m.blog.naver.com/cjhol2107/221781711556

JDK는 자바 기반 소프트웨어를 개발하기 위한 도구들로 이뤄진 반면,

JRE는 자바 코드를 실행하기 위한 도구들로 구성된 패키지라는 점이다.

JRE는 단지 자바 프로그램을 구동하기 위한 독립현 구성요소로써 사용될 수 있지만,

동시에  JDK의 일부이기도 하다.

자바 프로그램을 구동하는 것이 자바 프로그램 개발의 일부분이기 때문에 JDK는 JRE를 필요로 한다.

 

 

www.oracle.com/topics/technologies/newtojava/programming-center.html#Young_Developers

JAVA SE 개념도

 

 

 

 

더보기

더 보기 시작 ------------------------------------------------------------------------------------------------------------

 

* JNI (Java Native interface)

자바 프로그램에서 해당 플랫폼에서만 실행 가능한 네이티브 코드에 접근하기 위해 만들어진 API이다.

 

* 리플렉션 기법

리플렉션이란 객체를 통해 클래스의 정보를 분석해 내는 프로그램 기법을 말한다. 

 

* 가비지 컬렉터

가비지 컬렉터가 데이터를 삭제하는 알고리즘은 힙의 세부 영역에 따라서 다르게 적용된다.

즉, 가비지 컬렉터가 수행되는 빈도와 지우는 속도는 세부 영역마다 다르다.

Young영역에 사용되는 가비지 컬렉터는 자주 그리고 빠르게 수행되는 알고리즘을 사용한다.

그래서 Young 영역의 데이터 저장과 삭제는 비번하게 발생하며 대부분의 데이터는 짧은 시간동안 존재한다.

이런 데이터들이 메모리 영역에서 삭제되면 프로그램은 에러를 발생하거나  다시 데이터를 생성해야 한다.

이 모든 것을 JVM이 알아서 관리해주니 개발자는 신경쓰지 않아도 된다.

 

* STW

가비지 컬렉터가 실행되는 동안 JVM의 다른 기능들이 잠시 멈추는 것을 의미한다.

만약 가비지 컬렉터가 데이터를 지우는데 누군가가 다시 그 데이터를 참조(사용)하려고 한다면 문제가 발생할 수도 있기 때문이다.

그래서 STW가 가주 발행하면 그만큼 프로그램의 실행 시간이 늘어날 수 밖에 없고 이는 성능 저하의 원인이 된다.

 

* JDK 개발도구 명령어 (자바를 다루는 기술 p35)

1) java 

자바 애플리케이션(컴파일된 '.class' 바이트 코드 파일)을 실행하는 명령어.

자바에서는 애플리케이션의 확장자를 제외한 파일 이름이 클래스 이름과 같다.

사용법 : java [Class명]

사용예 : java Helloworld

 

2) javac

자바 컴파일러 명령어로 잡 코드로 프로그래밍 되어 확장자가 '.java'인 파일을 실행 가능한 '.class'파일로 컴파일 해준다. 컴파일된 확장자가 '.class'인 파일은 바이트 코드를 담고 있다

사용법 : javac [Java파일명]

사용예 : javac Helloworld.java

 

3) jar

자바에서 사용되는 묶음 파일이 Jar파일을 다루기 위한 명령어

Jar파일은 클래스 파일들을 편리하고 효율적으로 배포하기 위해 실행에 필요한 여러 파일들을 묶어(Archive) 하나의 파일로 만든 것이다. 주로 외부 라이브러리들을 배포하거나 애플리케이션을 패치하는데 많이 사용된다.

묶는법 : jar -xvf[대상 디렉토리 혹은 Class파일들]

푸는법 : jar -cvf[jar파일경로]

 

4) javadoc

자바 문서를 만들어주는 명령어. 소스 사이에 미리 정의된 주석 형식(/** */)으로 설명을 달고 미리 정의된 태그를 사용하여 필요한 정보를 입력한다. 그리고 javadoc명령어를 실행하면 java파일에 저장된 데이터를 HTML형식의 Java문서로 만들어준다.

사용법 : javadoc [Java파일명] 

 

5) jps

지금 실행 중인 자바 프로세스들의 이름과 프로세스 ID를 보여주는 명령어 , 유닉스 계열의 운영체제에서는 보통 ps명령어와 grep명령어를 같이 사용하여 확인하는 방법도 있다.

사용법 : jps

 

6) jmap

JVM의 힙 메모리 상태를 확인할 수 있는 명령어.  JVM의 힙영역의 상태(클래스가 사용하고 있는 메모리 크기)를 확인하는 것을 메모리 덤프나 메모리 절단명이라고 한다.

애플리케이션의 유지보수 혹은 애플리케이션에서 에러가 발생했을 때 원인을 찾기 위해서 많이 사용하는 명령어다.

사용법 : jmap -heap:format=b,file=[저장할 dump 파일명][pid]

 

7) jhat

jmap을 사용하여 생성한 메모리 덤프 파일을 분석해주는 명령어. 이 명령어를 이용하면 스스로 웹서버를 띄워서 html형식으로 분석된 내용을 보여준다. 보통 jps,jmap그리고 jhat은 에러의 원인 분석이나 JVM상태를 모니터링하기 위해서 사용한다.

사용법 : jhat[저장한 dump파일명]

 

 

더 보기 끝------------------------------------------------------------------------------------------------------------

 

 

 

 


1주차 추가 과제 : javac옵션 조사하기 

google search word : javac option

docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html

 

javac - Java programming language compiler

Warn about finally clauses that cannot complete normally. For example: public static int m() { try { throw new NullPointerException(); } catch (NullPointerException e) { System.err.println("Caught NullPointerException."); return 1; } finally { return 0; }

docs.oracle.com

 

javac - Java programming language compiler.pdf
0.47MB

1. 명령어 작성법

javac [ options ] [ sourcefiles ] [ classes ] [ @argfiles ]

 

- options : 명령줄 옵션 

- sourcefiles : 컴파일 할 하나 이상의 소스일 (예 : MyClass.java)

- classes : 어노테이션에 대해 처리할 하나 이상의 클래스 (예 : MyPackage.MyClass)

- @argfiles : 옵션 및 소스파일을 나열하는 하나 이상의 파일

 

2. 설명

javac 도구는 Java프로그래밍 언어로 작성된 클래스 및 인터페이스 정의를 읽고 이를

바이트코드 클래스 파일로 컴파일 한다.

또한 JAVA소스 파일 및 클래스의 주석을 처리할 수도 있다.

 

javac에 소스 코드 파일 이름을 전달하는 2가지 방법

1) 적은 수의 원본 파일의 경우 명령줄에 파일이름을 나열하면 된다.

2) 소스파일이 많은 경우 파일 이름을 공백 또는 줄바꿈으로 구분하여 파일에 나열한다.

그런 다음 javac명령줄의 목록 파일 이름 앞에 @문자를 사용한다.

소스코드 파일이름에는 .java접미사가 있어야 하고, 클래스 파일 이름에는 .class접미사가 있어야 한다.

소스 및 클래스 파일모두에 클래스를 식별하는 루트 이름이 있어야 한다.

예) MyClass.java -> MyClass.class

 

패키지 트리를 반영하는 디레터리 트리에서 원본 파일을 정렬해야 한다.

예를 들어 모든 원본 파일이 C:\workspace에 있고 com.mysoft.mypack안에 코드인 경우

MyClass는 C:\workspace\com\mysoft\mypack\MyClass.java에 있어야 한다.

 

기본적으로 컴파일러는 각 클래스 파일을 소스파일과 동일한 디렉터리에 넣는데

위치를 바꾸고 싶은 경우 -d를 사용하여 디렉터리를 지정할 수 있다.

 

3. 옵션

1) classpath 
-cp path or -classpath path
사용자 클래스 파일 및 (선택 사항) 주석 프로세서 및 원본 파일을 찾을 위치를 지정합니다. 

2) -d directory
클래스 파일의 대상 디렉토리를 설정합니다. 디렉터리는 이미 존재해야 합니다.
-d가 지정되지 않은 경우 javac은 각 클래스 파일을 생성된 원본 파일과 동일한 디렉터리에 넣습니다.

3) -g
로컬 변수를 포함하여 모든 디버깅 정보를 생성합니다. 기본적으로 줄 번호와 원본 파일 정보만 생성됩니다.

4) -target
지정된 버전의 VM을 대상으로 하는 클래스 파일을 생성합니다. 클래스 파일은 지정된 대상 및 이후 버전에서 실행되지만 이전 버전의 VM에서는 실행되지 않습니다. 유효한 대상은 1.1, 1.2, 1.3, 1.4, 1.5(또한 5), 1.6(또한 6), 1.7(또한 7)입니다.

더보기

더 보기 시작 ------------------------------------------------------------------------------------------------------------

Standard Options

-Akey[=value]

주석 프로세서에 전달할 옵션입니다. 이러한 기능은 javac에서 직접 해석하지는 않지만 개별 프로세서가 사용할 수 있습니다. 키는 ""로 구분된 하나 이상의 식별자여야 합니다.

-cp path or -classpath path

사용자 클래스 파일 및 (선택 사항) 주석 프로세서 및 원본 파일을 찾을 위치를 지정합니다. 표준 옵션

-Akey[=value]

주석 프로세서에 전달할 옵션입니다. 이러한 기능은 javac에서 직접 해석하지는 않지만 개별 프로세서가 사용할 수 있습니다. 키는 ""로 구분된 하나 이상의 식별자여야 합니다.

-cp path or -classpath path

사용자 클래스 파일 및 (선택 사항) 주석 프로세서 및 원본 파일을 찾을 위치를 지정합니다. 이 클래스 경로는 CLASSPATH 환경 변수의 사용자 클래스 경로를 재정의합니다. CLASSPATH, -cp 및 -class 경로를 지정하지 않은 경우 사용자 클래스 경로는 현재 디렉토리로 구성됩니다. 자세한 내용은 클래스 경로 설정을 참조하십시오.

-sourcepath 옵션이 지정되지 않은 경우 사용자 클래스 경로도 소스 파일을 검색합니다.

 

-processorpath 옵션을 지정하지 않은 경우 클래스 경로에도 주석 프로세서가 검색됩니다.

 

-Djava.ext.dirs=directories

설치된 확장의 위치를 재정의합니다.

-Djava.endorsed.dirs=directories

승인된 표준 경로의 위치를 재정의합니다.

-d directory

클래스 파일의 대상 디렉토리를 설정합니다. 디렉터리는 이미 존재해야 합니다. javac이 디렉터리를 만들지 않습니다. 클래스가 패키지의 일부인 경우 javac은 클래스 파일을 패키지 이름을 반영하는 하위 디렉터리에 저장하여 필요에 따라 디렉토리를 생성합니다. 예를 들어 -dC:\myclasses를 지정하고 클래스를 com.mypackage라고 하는 경우MyClass는 클래스 파일을 C:\myclasses\com\mypackage\MyClass.class라고 합니다.

-d가 지정되지 않은 경우 javac은 각 클래스 파일을 생성된 원본 파일과 동일한 디렉터리에 넣습니다.

 

참고: -d로 지정된 디렉토리는 사용자 클래스 경로에 자동으로 추가되지 않습니다.

 

-deprecation

사용되지 않는 구성원 또는 클래스의 각 사용 또는 재정의에 대한 설명을 표시합니다. 감가상각이 없으면 javac은 사용되지 않는 구성원 또는 클래스를 사용하거나 재정의하는 원본 파일의 요약을 표시합니다. -declation은 -Xlint:declation의 줄임말입니다.

-encoding encoding

소스 파일 인코딩 이름(예: EUC-JP 및 UTF-8)을 설정합니다. 인코딩을 지정하지 않으면 플랫폼 기본 변환기가 사용됩니다.

-endorseddirs directories

승인된 표준 경로의 위치를 재정의합니다.

-extdirs directories

외부 디렉터리의 위치를 재정의합니다. 디렉터리 변수는 콜론으로 구분된 디렉터리 목록입니다. 지정된 디렉터리의 각 JAR 아카이브가 클래스 파일을 검색합니다. 발견된 모든 JAR 아카이브는 자동으로 클래스 경로에 포함됩니다.

다른 Java 플랫폼 구현의 부트스트랩 및 확장 클래스에 대해 클래스를 컴파일하는 경우 이 옵션은 확장 클래스를 포함하는 디렉터리를 지정합니다. 자세한 내용은 교차 컴파일 옵션을 참조하십시오.

 

-g

로컬 변수를 포함하여 모든 디버깅 정보를 생성합니다. 기본적으로 줄 번호와 원본 파일 정보만 생성됩니다.

-g:none

디버깅 정보를 생성하지 마십시오.

-g:{keyword list}

쉼표로 구분된 키워드 목록으로 지정된 일부 종류의 디버깅 정보만 생성합니다. 유효한 키워드는 다음과 같습니다.

source

소스 파일 디버깅 정보

lines

라인 번호 디버깅 정보

vars

로컬 변수 디버깅 정보

-help

표준 옵션의 개요를 인쇄합니다.

-implicit:{class,none}

암시적으로 로드된 소스 파일의 클래스 파일 생성을 제어합니다. 클래스 파일을 자동으로 생성하려면 -implicit:class를 사용합니다. 클래스 파일 생성을 억제하려면 -implicit:none을 사용합니다. 이 옵션을 지정하지 않은 경우 기본값은 클래스 파일을 자동으로 생성하는 것입니다. 이 경우, 주석 처리를 할 때 그러한 클래스 파일이 생성되면 컴파일러가 경고를 발령한다. 이 옵션이 명시적으로 설정되어 있으면 경고가 발생하지 않습니다. 유형 검색을 참조하십시오.

-Joption

javac에서 호출한 Java 런처에 옵션을 전달합니다. 예를 들어 -J-Xms48m은 시작 메모리를 48MB로 설정합니다. -J는 Java로 작성된 애플리케이션을 실행하는 기본 VM에 옵션을 전달하는 것이 일반적입니다.

참고: CLASSPATH, -classpath, -bootclasspath 및 -extdir는 javac 실행에 사용되는 클래스를 지정하지 않습니다. 이러한 방식으로 컴파일러의 구현을 만지작거리는 것은 보통 무의미하고 항상 위험하다. 이렇게 해야 하는 경우 -J 옵션을 사용하여 기본 Java 런처에 옵션을 전달합니다.

 

-nowarn

경고 메시지를 비활성화합니다. 이것은 -Xlint:none과 같은 의미를 가집니다.

-proc: {none,only}

주석 처리 및/또는 컴파일이 수행되는지 여부를 제어합니다. -proc:none은 주석 처리 없이 컴파일이 수행됨을 의미합니다. -proc:none은 이후의 컴파일 없이 주석 처리만 수행됨을 의미합니다.

 

-processor class1[,class2,class3...]

실행할 주석 프로세서의 이름입니다. 이렇게 하면 기본 검색 프로세스가 바이패스됩니다.

 

-processorpath path

주석 프로세서를 찾을 위치를 지정하십시오. 이 옵션을 사용하지 않으면 클래스 경로가 프로세서를 검색합니다.

-s dir

생성된 원본 파일을 저장할 디렉터리를 지정하십시오. 디렉터리는 이미 존재해야 합니다. javac이 디렉터리를 만들지 않습니다. 클래스가 패키지의 일부인 경우 컴파일러는 소스 파일을 패키지 이름을 반영하는 하위 디렉터리에 저장하여 필요에 따라 디렉터리를 생성합니다. 예를 들어 -sC:\mysrc를 지정하고 클래스를 com.mypackage라고 하는 경우MyClass, 그러면 원본 파일이 C:\mysrc\com\mypackage\MyClass.java에 배치됩니다.

-source release

승인된 소스 코드의 버전을 지정합니다. 다음 릴리스 값이 허용됩니다.

1.3 | 컴파일러는 Java SE 1.3 이후에 도입된 주장, 제네릭 또는 기타 언어 기능을 지원하지 않습니다.

1.4 | 컴파일러는 자바 SE 1.4에서 도입된 어설션들을 포함하는 코드를 받아들인다.

1.5 | 컴파일러는 Java SE 5에 도입된 제네릭 및 기타 언어 기능을 포함하는 코드를 수락합니다.

5 |  1.5의 동의어입니다.

1.6 |  Java SE 6에는 언어 변경이 도입되지 않았습니다. 그러나 이제 소스 파일의 인코딩 오류는 이전 Java SE 릴리스와 같이 경고 대신 오류로 보고됩니다.

6 | 1.6의 동의어입니다.

1.7 | 기본값입니다. 컴파일러는 자바 SE 7에 도입된 기능들을 가진 코드를 받아들인다.

7 | 1.7의 동의어입니다.

-sourcepath sourcepath

클래스 또는 인터페이스 정의를 검색할 소스 코드 경로를 지정합니다. 사용자 클래스 경로와 마찬가지로 원본 경로 항목은 세미콜론(;)으로 구분되며 디렉터리, JAR 아카이브 또는 ZIP 아카이브일 수 있습니다. 패키지를 사용할 경우 디렉터리 또는 아카이브 내의 로컬 경로 이름이 패키지 이름을 반영해야 합니다.

참고: 클래스 경로를 통해 검색된 클래스는 소스도 발견될 경우 자동으로 다시 컴파일될 수 있습니다. 유형 검색을 참조하십시오.

 

-verbose

상세 출력. 여기에는 로드된 각 클래스와 컴파일된 각 소스 파일에 대한 정보가 포함됩니다.

-version

버전 정보를 인쇄합니다.

-Werror

경고가 발생할 경우 컴파일을 종료합니다.

-X

비표준 옵션에 대한 정보를 표시하고 종료합니다.

 

 

Cross-Compilation Options

기본적으로 클래스는 javac이 함께 제공된 플랫폼의 부트스트랩 및 확장 클래스에 대해 컴파일됩니다. 그러나 javac은 다른 Java 플랫폼 구현의 부트스트랩 및 확장 클래스에 대해 클래스가 컴파일되는 교차 컴파일도 지원합니다. 교차 컴파일할 때 -bootclass path 및 -extdir를 사용하는 것이 중요합니다. 아래 교차 컴파일 예제를 참조하십시오.

 

-target version

지정된 버전의 VM을 대상으로 하는 클래스 파일을 생성합니다. 클래스 파일은 지정된 대상 및 이후 버전에서 실행되지만 이전 버전의 VM에서는 실행되지 않습니다. 유효한 대상은 1.1, 1.2, 1.3, 1.4, 1.5(또한 5), 1.6(또한 6), 1.7(또한 7)입니다.

-target의 기본값은 -source의 값에 따라 달라집니다.

 

-source가 지정되지 않은 경우 -target의 값은 1.7입니다.

-source가 1.2이면 -target의 값은 1.4입니다.

-source가 1.3이면 -target의 값은 1.4입니다.

-source가 1.5인 경우 -target의 값은 1.7입니다.

-source가 1.6이면 -target의 값은 1.7입니다.

-source의 다른 모든 값에 대해 -target의 값은 -source의 값입니다.

 

-bootclasspath bootclasspath

지정된 부팅 클래스 집합에 대해 교차 컴파일합니다. 사용자 클래스 경로와 마찬가지로 부트 클래스 경로 항목은 콜론(:)으로 구분되며 디렉터리, JAR 아카이브 또는 ZIP 아카이브일 수 있습니다.

 

 

 

Non-Standard Options

-Xbootclasspath/p:path

부트스트랩 클래스 경로 앞에 추가합니다.

-Xbootclasspath/a:path

부트스트랩 클래스 경로에 추가합니다.

-Xbootclasspath/:path

부트스트랩 클래스 파일의 위치를 재정의합니다.

-Xlint

권장되는 모든 경고를 사용합니다. 이 릴리스에서는 사용 가능한 모든 경고를 활성화하는 것이 좋습니다.

-Xlint:all

권장되는 모든 경고를 사용합니다. 이 릴리스에서는 사용 가능한 모든 경고를 활성화하는 것이 좋습니다.

-Xlint:none

모든 경고를 사용하지 않습니다.

-Xlint:name

경고 이름을 사용합니다. 이 옵션을 사용하여 활성화할 수 있는 경고 목록은 -Xlint 옵션을 사용하여 활성화 또는 비활성화할 수 있는 경고 섹션을 참조하십시오.

-Xlint:-name

경고 이름을 사용하지 않습니다. 이 옵션을 사용하여 비활성화할 수 있는 경고 목록은 -Xlint 옵션을 사용하여 활성화 또는 비활성화할 수 있는 경고 섹션을 참조하십시오.

-Xmaxerrs number

인쇄할 최대 오류 수를 설정합니다.

-Xmaxwarns number

인쇄할 최대 경고 수를 설정합니다.

-Xstdout filename

컴파일러 메시지를 명명된 파일로 보냅니다. 기본적으로 컴파일러 메시지는 System.err.로 이동합니다.

-XPrefer: {newer,source}

형식에 대한 소스 파일과 클래스 파일이 모두 있을 때 읽을 파일을 지정합니다. (유형 검색을 참조하십시오.) -Xprefer:newnew를 사용하는 경우, 유형에 대한 소스 또는 클래스 파일의 최신 파일(기본값)을 읽습니다. -Xprefer:source 옵션이 사용되는 경우 소스 파일을 읽습니다. 모든 주석 프로세서가 SOURT의 보존 정책으로 선언된 주석에 액세스할 수 있는지 확인하려면 -Xprefer:source를 사용하십시오.

-Xpkginfo:{always,legacy,nonempty}

패키지 정보 파일 처리 지정

-Xprint

디버깅 목적으로 지정된 형식의 텍스트 표현을 인쇄합니다. 주석 처리나 컴파일을 수행하지 않습니다. 출력 형식이 변경될 수 있습니다.

-XprintProcessorInfo

프로세서가 처리해야 할 주석에 대한 정보를 인쇄합니다.

-XprintRounds

초기 및 후속 주석 처리 라운드에 대한 정보를 인쇄합니다.

 

 

더 보기 끝 ------------------------------------------------------------------------------------------------------------

 

여기 쓸만한거 정리되어 있음

sjava.net/2008/02/javac-%EB%AA%85%EB%A0%B9%EC%96%B4%EC%9D%98-%EC%98%B5%EC%85%98-%EC%A0%95%EB%A6%AC/

 

 

 

 

 

 

 

 

 

2021/01/16 - [공부해요/JAVA] - [온라인 자바 스터디 1주차] 자바 소스 파일(.java)을 JVM으로 실행하는 과정 이해하기 - 리뷰1(자바 뉴스)

2021/01/16 - [공부해요/JAVA] - [온라인 자바 스터디 1주차] 자바 소스 파일(.java)을 JVM으로 실행하는 과정 이해하기 - 리뷰2(과제확인)

 

반응형