자바 컴파일러에 의해 .java -> .class 로 변환된다
jvm은 .class를읽어서 어느 운영체제든 간에 자바를 실행할 수 있게 만들어준다
1) 클래스 로더 : 클래스 파일을 메모리에 JVM내에 로드하고 링크를 통해 배치한다.
2) 실행 엔진 : 클래스 로더를 통해 JVM의 Runtime Data Area에 배치된 바이트 코드들을 명령어 단위로 읽어서 실행
3) GC : 힙메모리 영역에 생성된 객체들 주엥서 참조되지 않은 객체들을 탐색 후 제거하는 역할을 한다
4) Runtime Data Area : JVM의 메모리영역, 자바 애플리케이션을 실행할때 사용되는 데이터들을 적재하는 영역이다
1) 메서드 영역 : 모든 스레드가 공유, 바이트 코드 보관
2) 힙영역 : 모든 스레드가 공유, new로 생성된 객체, 배열이 생성됨
3) 스택 영역: 메서드 호출마다 그 메서드만의 공간을 생성, 그 메서드안에서 사용되는 값들을 저장
4) pc레지스터: 쓰레드 마다 쓰레드 내 현재 실행할 스택 프레임을
가리키는 포인터가 생성된다.
5) native method stack: 자바외 언어로 작성된 코드를 위한 메모리 영역
Java Native Interface
자바 코드의 장점은 플랫폼으로부터 독립적이라는 것입니다. 쉽게 말해, 자바로 코딩한 소프트웨어는 리눅스에서도 동작하고, 윈도우에서도 동작합니다. 왜냐하면 두 OS 모두 JVM(Java Virtual Machine)을 사용할 수 있기 때문입니다. JVM은 플랫폼에 상관없이 자바 코드를 읽고 실행합니다. 구체적으로 말하면 자바 언어로 코딩해 만든 .java 파일을 컴파일한 .class 파일을 읽습니다.
그러나 자바로 개발한 소프트웨어일지라도 네이티브 코드(native code) 사용이 필요한 순간이 있습니다.
네이티브 코드란 C, C++처럼 (JVM 같은)인터프리터 없이 운영체제가 읽을 수 있는 형태로 컴파일해 사용 가능한 코드를 말합니다.
네이티브 코드가 사용되는 경우는 언제일까요? 예를 들면, 하드웨어 자체 기능을 동작시켜야 하는 경우, 프로세스의 성능을 향상해야 하는 경우, 이미 네이티브 코드로 작성된 라이브러리를 사용하고 싶은 경우 등이 있을 수 있습니다.
이런 필요를 충족시키기 위해 JVM은 자바 코드와 네이티브 코드를 연결할 수 있는 인터페이스를 제공하고 있습니다. 그게 바로 JNI입니다.
다른 언어들로 작성된 라이브러리들을 호출하거나 반대로 호출되는 것을 가능하게 하는 프로그래밍 프레임워크
Java로 다시 작성하는 대신 기존 라이브러리를 재사용하고 싶다
네이티브 메서드들은 항상 JNI를 통해서 사용해야한다
자바로 쓰인 코드는 바이트코드로 빌드되어, jvm 이 이해할 수 있는 명령어로 실행이 됩니다
런타임에는 클래스로더에서 이를 메모리에 올려서 실행하게 되죠
근데 네이티브 코드로 짜여지고 빌드된 공유 라이브러리는 바이트코드로 빌드되는게 아니고 jvm 위에서 동작하는 방식도 아니죠
다만 java 와 네이티브 코드 상호간에 호출할 수 있는 인터페이스 = JNI를 통해 콜을 떄리는겁니다
1) 로딩
출처
https://doozi0316.tistory.com/entry/1%EC%A3%BC%EC%B0%A8-JVM%EC%9D%80-%EB%AC%B4%EC%97%87%EC%9D%B4%EB%A9%B0-%EC%9E%90%EB%B0%94-%EC%BD%94%EB%93%9C%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%8B%A4%ED%96%89%ED%95%98%EB%8A%94-%EA%B2%83%EC%9D%B8%EA%B0%80
https://blog.wanzargen.me/16
https://steady-coding.tistory.com/305
https://mommoo.tistory.com/71
https://change-words.tistory.com/247
https://sas-study.tistory.com/262