[자바기본기] 00

sameul__choi·2022년 4월 25일
0

[자바기본기]

목록 보기
1/3

00 자바 기본기 미션

1. JVM이란 무엇인가 ?

  • JVM은 자바 플랫폼의 초석이다. 하드웨어와 OS 독립성을 보장해주고, 악성 프로그램으로부터 보호하는 기능을 담당하는 기술의 요소이다.

  • JVM은 추상 컴퓨팅 머신이다. 진짜 컴퓨팅 머신과 같이 명령어 세트가 있고, 런타임에 다양한 메모리 영역을 조작한다.

  • JVM의 첫번째 프로토타입은 PDA와 유사한 휴대용 장치에서 호스팅하는 소프트웨어의 JVM 명령세트를 에뮬레이트 했다. 현재는 모바일, 데스크탑 및 서버 장치에서 JVM을 에뮬레이트 할 수 있다. JVM 덕분에 자바 프로그램은 특정 구현 기술이나 호스트 하드웨어 또는 호스트 OS에 상관없이, JVM 하고만 상호작용한다. OS의 변경없이 어디서나 실행 가능하다. 다만 JVM은 OS에 종속적이다. -> "write once, run anywhere"

  • JVM은 프로그래밍 언어에 대해서는 모르고, 특정 바이너리 형식인 클래스 파일만 알고 있다. 클래스 파일에는 JVM 명령어와 기호, 테이블 및 기타 보조 정보가 포함되어 있다.

  • 클래스 파일로 표현할 수 있는 모든 언어는 JVM에서 호스팅 할 수 있다.

출처 : https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-1.html#jvms-1.2

2. 컴파일 하는 방법

 javac [ options ] [ sourcefiles ] [ classes ] [ @argfiles ]
  • javac 는 자바 언어로 쓰여진 클래스나 인터페이스 정의를 읽는 도구다, 그리고 바이트 코드 클래스 파일로 컴파일 한다. 자바 소스파일 이나 클래스의 주석도 처리할 수 있다.

    • 첫번 째 방법 : 명령줄에 파일 이름 나열

    • 두번 째 방법 : 소스파일이 많으면 파일이름을 공백이나 line breaker로 나눈 뒤에 파일 이름 리스트를 사용하여 javac 명령어를 사용한다.

      • C:\>dir /B
        greetings
        C:\>dir greetings /B
        Aloha.java
        GutenTag.java
        Hello.java
        Hi.java
        C:\>javac greetings\*.java
        C:\>dir greetings /B
        Aloha.class                        
        Aloha.java                           
        GutenTag.class
        GutenTag.java
        Hello.class
        Hello.java
        Hi.class
        Hi.java
    • source파일 이름은 반드시 .java로 끝나야하고, class file 이름은 반드시 .class 로 끝나야 한다.

    • InnerClass 정의는 추가적인 classfile을 생성한다. inner랑 outer 이름이 결합하게 된다

      • MyClass$MyInnerClass.class
    • 반드시 소스파일을 패키지를 반영한 디렉토리로 정렬해야 한다.

3. 실행하는 방법

java [ options ] <class> [ arguments ... ]
java [ options ] -jar <file.jar> [ arguments ... ]
javaw [ options ] <class> [ arguments ... ]
javaw [ options ] -jar <file.jar> [ arguments ... ]
  • 자바 어플리케이션을 실행하는 명령어이다.

  • 이것은 자바 런타임 환경에서 시작한다. 특정 클래스를 로딩하고 main 메서드를 호출한다.

  • 메서드는 반드시 public 그리고 static으로 선언되어 있어야 한다.

  • 그리고 반드시 어떠한 값도 리턴하면 안된다.

  • 반드시 String array를 파라미터로 받아야 하며, 메서드 시그니처는 public static void main(String[] args) 여야만 한다.

  • 클래스 이름 또는 JAR 파일 이름 뒤에 옵션이 아닌 인수가 main함수에 전달된다.

  • javaw명령은 연결된 콘솔 창이 없다는 java점을 제외하고 와 동일하다.

  • javaw런처는 어떤 이유로 시작이 실패할 경우 오류 정보가 포함된 대화 상자를 표시합니다.

  • 출처 : https://docs.oracle.com/javase/7/docs/technotes/tools/windows/java.html

4. 바이트 코드란 무엇인가

  • java 파일을 만들고

  • javac로 컴파일 하면

  • 보기 힘드니까 디컴파일링을 해보자. javap

  • 소스파일을 .class 파일로 변환할 때, 그 산출물이 JVM이 이해할 수 있는 언어로 만들어지는데, 운영체제에 상관없이 JVM만 있으면 실행이 되도록 하기 위함이다

  • 즉 java 바이트 코드는 바이트 코드로 이루어진 JVM의 명령어 셋이다.

  • 명령어 셋엔 여러종류가 있는데 명령어 셋과 기능에 대해 간략하게 알아보면, 이 정도가 있다.

    • Load and store (e.g. aload_0, istore)

    • Arithmetic and logic (e.g. ladd, fcmpl)

    • Type conversion (e.g. i2b, d2i)

    • Object creation and manipulation (new, putfield)

    • Operand stack management (e.g. swap, dup2)

    • Control transfer (e.g. ifeq, goto)

    • Method invocation and return (e.g. invokespecial, areturn)

  • 출처 : https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html

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

  • 오라클 JVM을 위한 JIT 컴파일러는 더욱 빠른 실행이 가능하다.

    • 외부 메커니즘 없이 검증, 리컴파일, 코드 저장이 가능하기 때문이다.
  • 원래는 소스코드를 컴파일하고 바이트코드로 변환하고 자바 인터프리터가 바이트코드를 기계어로 해석하고 실행한다.

  • JIT 컴파일러는 같은 코드를 매번 해석하지 않고, 쓸만한 코드를 컴파일해두고 사용한다.

  • 한마디로 자주 쓰는 코드를 캐싱, 캐싱된 코드를 가져다 쓰기 때문에 속도를 개선할 수 있는 것

  • 장점은 Java 클래스의 성능을 향상 시키고, 재컴파일을 방지한다는 것, C 컴파일러가 필요 없다는 것, 빈 메서드를 자동으로 제거해준다는 것, 블록 내 하위 표현식을 제거해준다는 것

  • 단점은 초기 구동시에 손해를 본다 (어찌 됐든 첫 컴파일 시 시간과 메모리를 소모하고 저장해두어야 하기 때문) 그리고 런타임에 동적으로 코드를 생성하여 실행한다는 특징 때문에 잠재적으로 보안 문제를 가지고 있다는 것

  • 출처 : https://docs.oracle.com/en/database/oracle/oracle-database/19/jjdev/Oracle-JVM-JIT.html#GUID-23D5BA60-A2B3-45F9-93DF-81A3D971CA50

6. JVM 구성 요소

  • 1) ClassLoader

    • JVM의 Subsystem으로 클래스 파일을 로드한다. Java 프로그램을 실행 할 때 마다 클래스 로더에 의해 먼저 로드 된다. 세가지의 클래스 로더를 가진다
      - BootStrap ClassLoader : Extension 클래스 로더의 상위 클래스인 첫 번째 클래스 로더이다. java.net, java.util, java.io, java.sql 패키지 클래스 등과 같은 Java Standard Edition의 모든 클래스 파일을 포함하는 rt.jar 파일을 로드한다.
      - Extension ClassLoader : $JAVA_HOME/jre/lib/ext 디렉토리에 있는 jar 파일을 로드한다.
      - System/Application ClassLoader : 클래스 경로에서 클래스 파일을 로드한다. 기본적으로 클래스 경로는 현재 디렉토리로 설정되며 -cp, -classpath를 사용하여 클래스 경로를 변경할 수 있다.
      2) Class Area
    • 런타임 상수 풀, 필드 및 메서드 데이터, 메서드에 대한 코드와 같은 클래스별 구조를 저장한다.
      3) Heap
    • 객체가 할당되는 런타임 데이터 영역이다.
      4) Stack
    • 프레임을 저장한다. 로컬 변수와 부분 결과를 보유하고 메서드 호출 및 반환에 역할을 한다.
    • 각 스레드에는 스레드와 동시에 생성되는 개인 JVM 스택이 있다.
      5) Program counter Register
    • 현재 실행 중인 자바 가상머신 명령어의 주소가 포함된다.
      6) Native Method Stack
    • application에서 사용되는 모든 기본 메서드가 포함된다.
      7) Excution Engine
    • 가상 프로세서, 인터프리터, JIT 이 포함된다.
      8) Java Native Interface
    • 다른 언어로 작성도니 다른 application과 통신하기 위한 인터페이스를 제공하는 프레임워크이다. 콘솔에 출력을 보내거나 OS 라이브러리와 상호 작용한다.

7. JDK와 JRE의 차이

JDK

  • Java Development Kit 의 약자
  • Java Application 및 애플릿을 개발하는 데 사용되는 소프트웨어 개발 환경
  • 플랫폼별 소프트웨어이며, 개발자는 이를 사용하여 Java 프로그램을 코딩하고 실행할 수 있다.
  • JRE, 컴파일러, 디버거, 인터프리터, 아카이버 및 문서 생성기와 같은 기타 개발 도구가 포함되어 있다.
  • 같은 컴퓨터에 둘이 상의 JDK 버전을 설치할 수 있다.
  • 주된 기능은 개발이다.
  • JDK = JRE + 기타 개발 도구

JRE

  • Java Runtime Eviromental 의 약자

  • Java 프로그램 실행을 위한 환경을 제공하기 위해 특별히 설계됨

  • JDK와 같이 플랫폼에 따라 다르고, JVM, JAVA Binary 및 기타 클래스로 구성됨

  • 컴파일러 디버거 등과 같은 개발도구 포함 안됨

  • 프로그램만 실행하기 위해서라면 컴파일 할 필요가 없으므로 JDK가 아닌 JRE만 설치하면 됨

  • 주된 기능은 실행을 위한 환경을 만드는 데 사용됨.

  • JRE = JVM + 기타 클래스 라이브러리

  • 출처 : https://www.geeksforgeeks.org/difference-between-jdk-and-jre-in-java/

0개의 댓글