3rd June 2021 TIL

알파·2021년 6월 3일
0

TIL

목록 보기
12/18

To Do

  1. 배웠던 것 개념정리
  2. 면접 준비(1분 자기소개, 인성 예상질문 정리)
  3. IT 기사 찾고 유튜브도 찾고 개념 정리하기
  4. GSAT 풀기
  5. 알고리즘 풀기
  6. 시간 남으면 필사하기
    유튜브 끊자

JAVA 메모리 구조

배경

C/C++은 컴파일 플랫폼과 타겟 플랫폼이 다를 경우, 프로그램이 동작하지 않는다.
여기서 환경, 플랫폼은 = 운영체제 + CPU 아키텍처
동일한 플랫폼에서 컴파일과 실행을 같이 한다면, 프로그램은 아무 문제없이 도작한다.
타켓 플랫폼에 맞춰 컴파일하는 것은 '크로스 컴파일'이라 한다. (리눅스 -> 윈도우즈 호환 가능)

JVM?

자바 바이트코드는 타겟 플랫폼과 상관없이 JVM 위에서 동작한다.(클래스 파일이 된다.)
물론 JVM은 타겟 플랫폼에 의존한다.(윈도우를 사용한다면 윈도우형 JVM을 사용하고 리눅스에서 컴파일한 자바 바이트코드를 실행해도 아무 문제가 없다.)
JAVA source code -> Java compiler -> Java bytecode
JVM이 플랫폼과 관련된 작업을 해주기 때문에

  • "Write Once, Run Anywhere"
    -> 네가 짠 자바코드를 컴파일해서 배포하면, 어떤 플랫폼이든 다시 컴파일할 필요 없이 실행시킬 수 있다. 하지만 실행하려면 그 플랫폼에 맞는 JVM이 설치되어 있어야 한다.

굳이 JVM?

C/C++도 크로스 컴파일해서 배포하면 되는데, 굳이 JVM을 사용해야하나?
자바는 네트워크에 연결된 모든 디바이스에서 작동하는 것이 목적이었다.
디바이스마다 운영체제와 하드웨어가 다르기 때문에, 자연스럽게 플랫폼에 의존하지 않도록 언어를 설계했다. 그 결과가 Java Bytecode, JVM

  • 자바의 야심!
    웹서버에 클래스 파일이 있다. (클래스파일은 바이트코드를 담은 파일)
    브라우저에 JVM이 있으면 이걸 실행하기만 하면 된다. 를 목표로 하였으나,
    Javascript는 이렇게 동작하지만 Java는 이렇지 못하다.

자바코드가 실행되기까지

코드는 여러 과정을 거쳐 어셈블리 프로그램이 된다,, 이것은 다시 어셈블리어를 통해 기계화가 된다.
컴파일러에도 프론트엔드/ 백엔드가 있다.
컴파일러는 백엔드만 변화한다. 컴파일러는 우리의 코드를 해석하는 일을 하기 때문에,,
javac는 프론트엔드를 맡고 JVM은 백엔드를 맡았다

JVM 내부구조

Runtime Data Areas

  • JVM이 Java Bytecode를 실행하기 위해 사용하는 메모리 공간
    Method Area와 heap은 모든 스레드가 공유하는 Data Area이다.(Per JVM)
    Java Stack, Pc, stacks는 스레드마다 존재한다.(Per Thread)

Method Area

  • 클래스 로더가 클래스 파일을 읽어오면, 클래스 정보를 파싱해서 Method Area에 저장한다. (이것이 Static 메모리인가?)
    like 변수가 어떤 게 있지, 메소드가 어떤 게 있는가?

Heap

  • 프로그램을 실행하면서 생성한 모든 객체를 Heap에 저장한다.

Program Counter

각 스레드는 메소드를 실행하고 있고, pc는 그 메소드 안에서 몇번째 줄을 실행해야 하는지 나타내는 역할

Stack

자바 스택은 스레드 별로 1개만 존재하고, 스택 프레임은 메소드가 호출될 때마다 생성된다. 메소드 실행이 끝나면 스택 프레임은 pop되어 스택에서 제거된다.
맨 위에 있는 스택 프레임은 메인메소드 -> 그 밑에 있는 스택프레임은 메인메소드에서 호출한 어떤 메소드 -> 그 밑에 있는 스택프레임도 마찬가지

  • 스택 프레임은 메소드가 호출될 때마다 새로 생겨 스택에 push 된다.
  • 스택 프레임은 Local variables array, Operand stack, Frame Data를 갖는다.
  • Frame Data는 Constant Pool, 이전 스택 프레임에 대한 정보, 현재 메소드가 속한 클래스/ 객체에 대한 참조 등의 정보를 갖는다.
    쉽게 생각하면 바이트 코드를 실행하기 위해 당연히 필요한 것들

Native Method Stack

Java Bytecode가 아닌 다른 언어로 작성된 메소드를 의미한다.

Garbage Collector

WEB-WAS-DB

플러그인

Null Pointer

네트워크

profile
I am what I repeatedly do

0개의 댓글