JAVA/Basic

[스터디할래? Java 01] JVM 이란 무엇인가?

[스터디할래? Java] 목차

 

이글은 백기선님 스터디 할래? 스터디를 뒤늦게 따라간 기록입니다.

스터디할래 링크 >> https://github.com/whiteship/live-study

여기 없는내용은 스터디 할래 강의 내용 혹은 제가 java Doc보고작성하거나 예제를 만들어 추가했습니다.

그외는 같이 출처가 써있습니다. 

 

Error : A JNI error has occurred,   ....(중략)....   version of the Java Runtime (class file version 53.0), this version of the Java Runtime only recognizes class file versions up to 52.0 at java.lang

>> 컴파일버전과 실행버전이 다를때. 


JAVA

1995년 SUN에서 발표한 제임스 고슬링의 프로그램 언어, 컴퓨팅 플랫폼. 

OS에 독립적

JAVAC

javac Hello.java

java Hello.class

java -c Hello.class

더보기

C:\Program Files\Java\jdk1.8.0_144\bin>javac -version
javac 1.8.0_144

 

Client Compiler, Server Compiler >> JAVA 1.6  자바실행할때 쓰는 옵션 Client일수록 빠름

레이어드 >> JAVA 1.8 부터 알아서 실행해줌

 

Q. java 14 로 컴파일 후 java 8로 실행하면?

 

더보기

실행이 안된다. 

 

JAVA14  -> class file version 58

JAVA8  -> class file version 52

 

- 상위버전 클래스파일은 하위버전이 실행안됨.

해결방법 :  옵션을 준다. 

javac Hello.java -source 1.8 - target

C:\Program Files\Java\jdk1.8.0_144\bin>javac
Usage: javac <options> <source files>
where possible options include:
  -g                         Generate all debugging info
  -g:none                    Generate no debugging info
  -g:{lines,vars,source}     Generate only some debugging info
  -nowarn                    Generate no warnings
  -verbose                   Output messages about what the compiler is doing
  -deprecation               Output source locations where deprecated APIs are used
  -classpath <path>          Specify where to find user class files and annotation processors
  -cp <path>                 Specify where to find user class files and annotation processors
  -sourcepath <path>         Specify where to find input source files
  -bootclasspath <path>      Override location of bootstrap class files
  -extdirs <dirs>            Override location of installed extensions
  -endorseddirs <dirs>       Override location of endorsed standards path
  -proc:{none,only}          Control whether annotation processing and/or compilation is done.
  -processor <class1>[,<class2>,<class3>...] Names of the annotation processors to run; bypasses default discovery process
  -processorpath <path>      Specify where to find annotation processors
  -parameters                Generate metadata for reflection on method parameters
  -d <directory>             Specify where to place generated class files
  -s <directory>             Specify where to place generated source files
  -h <directory>             Specify where to place generated native header files
  -implicit:{none,class}     Specify whether or not to generate class files for implicitly referenced files
  -encoding <encoding>       Specify character encoding used by source files
  -source <release>          Provide source compatibility with specified release
  -target <release>          Generate class files for specific VM version
  -profile <profile>         Check that API used is available in the specified profile
  -version                   Version information
  -help                      Print a synopsis of standard options
  -Akey[=value]              Options to pass to annotation processors
  -X                         Print a synopsis of nonstandard options
  -J<flag>                   Pass <flag> directly to the runtime system
  -Werror                    Terminate compilation if warnings occur
  @<filename>                Read options and filenames from file
C:\Program Files\Java\jdk1.8.0_144\bin>java
사용법: java [-options] class [args...]
           (클래스 실행)
   또는  java [-options] -jar jarfile [args...]
           (jar 파일 실행)
여기서 options는 다음과 같습니다.
    -d32          사용 가능한 경우 32비트 데이터 모델을 사용합니다.
    -d64          사용 가능한 경우 64비트 데이터 모델을 사용합니다.
    -server       "server" VM을 선택합니다.
                  기본 VM은 server입니다..

    -cp <디렉토리 및 zip/jar 파일의 클래스 검색 경로>
    -classpath <디렉토리 및 zip/jar 파일의 클래스 검색 경로>
                  클래스 파일을 검색할 ;(으)로 구분된 디렉토리,
                  JAR 아카이브 및 ZIP 아카이브 목록입니다.
    -D<name>=<value>
                  시스템 속성을 설정합니다.
    -verbose:[class|gc|jni]
                  상세 정보 출력을 사용으로 설정합니다.
    -version      제품 버전을 인쇄한 후 종료합니다.
    -version:<value>
                  경고: 이 기능은 사용되지 않으며
                  이후 릴리스에서 제거됩니다.
                  실행할 버전을 지정해야 합니다.
    -showversion  제품 버전을 인쇄한 후 계속합니다.
    -jre-restrict-search | -no-jre-restrict-search
                  경고: 이 기능은 사용되지 않으며
                  이후 릴리스에서 제거됩니다.
                  버전 검색에서 사용자 전용 JRE를 포함/제외합니다.
    -? -help      이 도움말 메시지를 인쇄합니다.
    -X            비표준 옵션에 대한 도움말을 인쇄합니다.
    -ea[:<packagename>...|:<classname>]
    -enableassertions[:<packagename>...|:<classname>]
                  세분성이 지정된 검증을 사용으로 설정합니다.
    -da[:<packagename>...|:<classname>]
    -disableassertions[:<packagename>...|:<classname>]
                  세분성이 지정된 검증을 사용 안함으로 설정합니다.
    -esa | -enablesystemassertions
                  시스템 검증을 사용으로 설정합니다.
    -dsa | -disablesystemassertions
                  시스템 검증을 사용 안함으로 설정합니다.
    -agentlib:<libname>[=<options>]
                  <libname> 고유 에이전트 라이브러리를 로드합니다(예: -agentlib:hprof).
                  -agentlib:jdwp=help 및 -agentlib:hprof=help도 참조하십시오.
    -agentpath:<pathname>[=<options>]
                  전체 경로명을 사용하여 고유 에이전트 라이브러리를 로드합니다.
    -javaagent:<jarpath>[=<options>]
                  Java 프로그래밍 언어 에이전트를 로드합니다. java.lang.instrument를 참조하십시오.
    -splash:<imagepath>
                  이미지가 지정된 스플래시 화면을 표시합니다.
자세한 내용은 http://www.oracle.com/technetwork/java/javase/documentation/index.html을 참조하십시오.

바이트코드 Bytecode

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

클래스파일 안에 들어있음. 

컴파일러에 의해 변환되는 코드명령어(opcode, operator code) 크기가 1바이트

JIT Compiler(Just In Time Compiler)

JAVA 실행시 실행 : JIT Compiler + Interpreter 

JRE 안에 포함됨

얼마나 자주 수행되는지 체크하고 일정정도를 넘을 때만 컴파일 수행

JDK

JAVA 9 부터는 JRE가 더이상 없음.

JDK
JRE + javac, jar, debugging tools, javap
JVM + java, javaw, lib, rt.jar
Class Loader
Execution Engine
Runtime Data Area

 
Interpreter JIT Compiler Garbage
Collector

JVM(Java Virtual Machine)

1. Java 코드, 에플리케이션 구동 위한 실행환경 제공하는엔진

2. Java 바이트 코드를 기계언어로 변환

3. JAVA는 독립적이고 JVM은 OS버전마다 의존적임

JVM Architecture

JJVM 아키 출처 :  dzone.com/articles/jvm-architecture-explained

 

Hello.java

-- Compiler -->  Hello.class(자바 바이트 코드: JVM에서 실행됨)

----------------------------------------------JVM----------------------------------------------------

ClassLoader 

-------------------------------:로드, 연결, 초기화------------------------------------

- 로딩

부트 스트랩 클래스 로더

: <JAVA_HOME> / jre / lib 디렉토리에있는 핵심 Java 라이브러리 로드
확장 클래스 로더

: <JAVA_HOME> / jre / lib / ext 또는 java.ext.dirs 시스템특성에 지정된 라이브러리로드
시스템 클래스 로더

: CLASSPATH 환경 변수에 매핑되는 java.class.path에있는 코드를로드

- 링크 : 레퍼런스 연결 : 로딩이 끝나면 class 객체 생성  Heap 영역에 저장

Verfiy

: .class 파일 유효한지 확인, 바이트 코드가 조작될 경우 JVM 에러 발생

Prepare

: 메모리 준비 과정 클래스의 static 변수, 기본값에 필요한 메모리 준비

Resolve

:  Symbolic Memory Reference를 실제 Reference로 교체

- 초기화 : static 값 초기화, 변수 할당

JVM Memory (Runtime Data Area)

------------------- : 프로그램 실행 메모리------------------

1. Stack Area 

: LIFO: 호출 시마다 생성 수행 후 삭제, 메서드 작성값(매개번수, 지역변수, 리턴값, 연산시 임시값) 저장. 

2. Heap Area

: Heap Space = Young Generation + Old Generation

Young Generation = Eden + Survivor1, Survivor2 + (virtual, 가상공간)

Old Generation = Old + (virtual, 가상공간)

- young Generation: Minor GC 발생

- Eden : 새로 생성된 대부분 객체가 처음 위치하는 영역, GC 발생후 살아남은 객체는 Survivor1 or Survivor2 이동

- Old Generation : Major GC(Full GC)발생

- Old : Survivor에서 살아남은 객체만이 Old 영역이동, Old영역은 Young영역보다 크게 할 당. 

- Xms : 최소 힙공간(Eden+Survivor+Old), Xmx : 최대 Heap 공간(Eden+Survivor+Old+virtual)
- XX:NewSize : 최소 Young 공간(Eden+Survivor), XX:MaxNewSize : 최대 Young공간( Eden + suvivor +virtual)
- XX:SurvivorRatio : Eden(new)/Survivor 영역비율, XX: NewRatio : Young(Eden + Survivor)/Old

3. Method Area

(= class Area, code area, static area)  Permanent Generation , heap 영역에서 메타스페이스로 )

( Permanent Generation , heap 영역 JDK 1.8에서는 Metaspace로 대체됨, 최대를 지정하지 않으면 서버 메모리전체를 사용할수 있으니 주의 필요.)

Permanent Generation = Runtime Constant Pool + fild & Method Data + code +(virtual)

- 클래스, 인터페이스에 대한 런타임 상수, 멤버변수(필드), 클래스변수(Static), 생성자 메서드 저장

-XX:PermSize   초기 Perm크기 , -XX:MaxPermSize 
(XX:MaxMetaspaceSize  cf)JDK1.8이후 )

4. Native Area

: Code Cashe :JIT 방식 변환 시간 절약위해 많이 쓰는 코드 기계어로 변환시켜 저장해둠. 

5. PC Register

: 현재 수행중인 JVM 명령과 주소 저장, CPU 내의 기억장치, Thread가 생성될 때마다 생성

Execution Engine

------------------- (Runtime Engine) : 실행 엔진------------------

1. Interpreter

: 바이트 코드를 한줄씩 해석, 초기방식, 속도가 느림

2. JIT Compiler

: 같은 코드를 매번 해석하지 않고 실행할 때 컴파일을 하면서 해당 코드 캐싱 

3. Garbage Collector

: Heap 메모리 영역에 생성된 객체들 중에 참조되지 않은 객체들을 제거

------> 실행 완료. 

 


백기선님 1주차 강의 내용 :

JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가. #1

  • JVM이란 무엇인가
  • 컴파일 하는 방법
  • 실행하는 방법
  • 바이트코드란 무엇인가
  • JIT 컴파일러란 무엇이며 어떻게 동작하는지
  • JVM 구성 요소
  • JDK와 JRE의 차이

Java News : www.whiteship.me/java-news-2020-11-13/

1. Spring Boot 2.4.0 정식버전 출시

- 새로운  Java15 지원

- 스프링프레임워크 5.3

- 설정 파일 4가지 : 한파일안에서 여러 도큐먼트 설정가능.. 꼬이는 부분해결.. 

- 도커/빌드팩 : Publishing image, Authetication,

2. 스프링 인증 서버 0.0.3

 OAuth 2.0 Refresh token

 

PubSub 방식 

Publisher -> Redis PubSub 쌓아둠-> subscriber

Jokes api : jokeapi.dev/

 

카카오 컨퍼런스  : if(kakao)2020  : if.kakao.com/

 

네이버 컨퍼런스 : 네이버 데뷰 : deview.kr/2020

 

Java 16 EA 버전 출시

 

Project Loom : 프로젝트 Loom에서는 자바의 Thread를 개선해서 Virtual Thread라는 것을 제공할 것으로 보이며 Structured 동시성(Concurrency) (코드의 구조 자체가 컨커런시를 제어하는 시작과 끝을 나타내는 것) 를 제공하는게 목표라고 하네요.

 

LinkedIn에서 공개한 머신 러닝 Java 오픈 소스

 

JSON 자바 클래스 변환기 >> instantwebtools.net/json-to-java

 

www.reddit.com/r/java/<< 자바 뉴스 참고


 

교재 : java in a nutshell 

www.dblab.ntua.gr/~gtsat/collection/Java%20books/O%27Reilly%20-%20JAVA%20in%20a%20Nutshell.pdf

 

O'Reilly - JAVA in a Nutshell.pdf
4.58MB

lombok >> projectlombok.org/

the java 참고. 

 

현재 Java 8  80%.. 현재 .. 11로 넘어가고 있음.

 

피드백 >> 이미지는 직접 그릴것. 글은 이해한대로 적을것. 

 

 

설문조사.

strawpoll.com/create/

 

컴파일타임과 런타임의 구분하는걸 원했다. 

컴파일타임 : javac 실행시간

런타임: java 실행시간