하루 배운것 정리.

William Parker·2022년 11월 30일
post-thumbnail

박정훈

주제:JVM구조

배운것:

!!! 이 모든 것들은 프로그램이 컴퓨터에서 실행되기 위하여 행해지는 것 들이다.

JVM

  1. 자바는 OS에 종속되지 않는다. 이로인해 OS에서 실행시킬 무언가가 필요한데 그것이 JVM이다.

  1. MyCode.java → JAVAC→ .class라는 자바 바이트코드로 변환해준다.→.class라는 파일을 JVM을 통해 컴퓨터 기계어로 바꾸어 컴퓨터에 전달해준다.
  2. 바이트코드란 : JVM이 이해 할 수 있는 언어로 변환한 자바 소스코드
  3. 클래스 로더(Class Loader) : —말 그대로 클래스 파일을 로더 하고 연결하는 곳!!

  • JVM .class라는 파일을 로드하고 →링크를 통해배치 하는 작업 수행 모듈

-클래스 로더가 데이터영역(RuntimeDataArea)에 .class를 배치 시킨다.

-클래스를 처음 참조할 때, 해당 클래스(.class)를 로드하고 링크하는 역할.

  1. 실행엔진(Execution Engine) : 클래스파일을 실행하는 곳!

-클래스(.class)를 실행시키는 역할 → 기계가 실행 할 수 있게 만드는 곳

  • 실행엔진 내부에 → 인터프리터 , JIT, GC가 있음
  • GC: 더이상 사용되지 않는 객체를 찾아 메모리에서 삭제함
  • 인터프리터: 자바 바이트코드(.class)를 명령어 단위로 한줄씩 수행함, 그래서 느림!

Runtime Data Area

프로그램을 구동하기 위해 OS에서 할당받는 메모리공간!!

  1. Method Area= Class Area = Static Area
  • 클래스 정보를 처음 메모리 공간에 올릴 때 초기화되는 대상을 저장하기 위한 메모리 공간
  • 프로그램 실행중에 클래스가 사용되면 JVM은 해당 클래스 파일을 읽어 분석후 변수,메소드,클래스변수 등을 저장한다. 모든 코드가 저장되는 것이 아닌 new 키워드를 통해 객체를 만든 것들만 저장된다. 객체만들고 실행하면 그 클래스 정보를 Method Area에 저장 한다.!
  • 저장되는 내역
    • 패키지명+클래스명
    • 하위클래스 이름
    • 클래스/인터페이스 여부
    • modifier(public/abstact/final)

Stack or Thread

메소드가 호출되면 이것이 실행된다!

CPU(Process)란? 단순히 실행중인 프로그램! →구글을 켰다→OS로부터 메모리공간 할당받음→그 안에 Thread가 나서서 일을 한다.! Process안에는 자원(데이터,메모리),스레드로 구성

Thread란? : 프로세스 내에서 실제로 작업을 수행하는 주체!!

Stack 영역과 === Thread 영역이 같은 말이다!! 이 Thread안에!! PC,jvm stack 이있다.

PC,JVM stack은 쓰레드별로 생성이 되고 1개씩, Heap과 Method Area는 공유되어 사용 된다.

  1. PC Register

현재 실행할 주소값을 저장하는 레지스터

  • 1개의 CPU는 여러개의 Thread를 가지고 있다!
  • 그 Thread가 시작될때 PC register가 생성되고, Thread마다 하나씩만 존재한다.
  • Thread가 어떤 부분을 어떤 명령으로 실행해야 할 지에 대한 기록을 하는 부분. 현재 수행 중인 JVM명령의 주소값을 가진다.!
  1. JVM 스택 영역
  • 임시로 할당 되었다가 메소드가 나가면 바로 소멸되는 특성의 데이터를 저장하기 위한 영역.
  • Thread제어를 위한 영역, 메소드가 호출되면 Stack에 쌓였다가 호출이 끝나면 Stack point에서 제거 된다.
  • 매개변수, 지역변수, 리턴 값 및 연산 시 일어나는 값,address를 저장하고 메소드 종료시 메모리과 함께 사라진다.
  • 이때 다수의 쓰레드가 존재하면 heap영역을 공유하므로 thread-safe 하지 않는 이슈에 주의!!, 객체를 생성할때 immutable(불변의)한 객체로 설계.
  • 하나씩만 존재
  1. Native method stack
  • 자바 이외의 언어가(c,c++) 있을시 제공되는 메소드 저장공간.
  • JAVA가 아닌 다른 언어로 작성된 코드를 위한 공간.
  • Java Native Interface를 통해 바이트 코드로 전환하여 저장하게 된다.

추가 공부자료!!!!

Block과 Scope

Scope : 함수내에 변수에 대한 접근이 어떻게 되는지를 나타내는 용어.

변수에 접근할 수 있는 범위

****Block Scope****: 블록 외부에서 내부로 접근할 수 없다는 뜻

https://javari492.tistory.com/m/108

if(true){
    let hi = "hi";
}
let hi = "hello";
--------------------------------------------------------
if (true) {
  let hi = "hi";
}
hi = "hello";
console.log(hi) //hi

**Autoboxing과 Unboxing**

AutoBoxing:

기본타입(int,long,double등)같은 타입을 WrapperClass(Interger,Long,Double 등)객체로 자동 형변환해주는 것.

int n1 = 10; →(AutoBoxing) Integer a1 = n1;

Unboxing:

Wrapper class 객체 타입을 기본타입으로 형변환 해주는 것.

Integer a1 = Interger.valueOf(10); →(Unboxing) int b1 = a1

Example

int num = 10;

ArrayList<Integer> list = new ArrayList<>();
list.add(num);

ArrayList에서 요소를 가져올 때도 마찬가지입니다. Integerint로 자동 변환됩니다.

ArrayList<Integer> list = new ArrayList<>();
list.add(10);

int num = list.get(0);
Primitive typeWrapper class
booleanBoolean
byteByte
charCharacter
floatFloat
intInteger
longLong
shortShort
doubleDouble
단순자료형객체타입자료형

CallByValue과 CallByReference

CallByValue: 함수 호출 시 전달되는 변수 값을 복사해서 함수 인자로 전달함. 이때 복사된 인자는 함수 안에서 지역적으로 사용되기 때문에 local value 속성을 가짐. 따라서, 함수 안에서 인자 값이 변경되더라도, 외부 변수 값은 변경안됨

CallByReference: 함수 호출 시 인자로 전달되는 변수의 참조값을 전달함

따라서 함수 안에서 인자 값이 변경되면, 아규먼트로 전달된 객체의 값도 변경됨

자바의 경우, 항상 call by value 로 값을 넘긴다.

JAVA에서 Call by reference는 해당 객체의 주소값을 직접 넘기는 게 아닌 객체를 보는 또 다른 주소값을 만들어서 넘기다는 사실을 기억

Mutable 과 Immutable

MutableImmutable
생성된 이후 수정 가능생성된 이후 수정 불가능
이미 존재하는 객체에 재할당(값 변경)이미 존재하는 객체이더라도 새로운 객체를 생성하여 재할당
값을 변경할 수 있는 메소드 제공값을 변경할 수 있는 메소드 제공 x
Mutable class일 경우 Getter와 Setter 존재Immutable class일 경우 Getter와 Setter 미존재
thread safe하지 않을 수 있음(병렬처리 시 값 보장할 수 없게 됨)thread safe(병렬처리 시 문제 없음)
StringBuffer, StringBuilder, java.util.Date 등이 해당Legacy classes, Wrapper classes, String class 등이 해당

정리하면 Mutable은 객체의 수정을 허용하나, Immutable인 경우 객체의 수정을 허용하지 않는다. 수정이 필요할 경우 Mutable 객체는 기존의 객체에 수정사항을 곧바로 반영한다. 하지만 Immutable 객체의 경우 기존의 객체는 그대로 두고 수정사항을 반영한 새로운 객체를 생성한다는 점에서 차이가 있다.

Mutable 속성 확인

public class Mutable {
    public static void main(String[] args) {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("abc");
        System.out.println(stringBuilder);//abc
        System.out.println(System.identityHashCode(stringBuilder));
				//1785210046
        stringBuilder.append("def");
        System.out.println(stringBuilder); //abcdef
        System.out.println(System.identityHashCode(stringBuilder));
    }   //1785210046
}

Immutable 속성 확인

public class Immutable {
    public static void main(String[] args) {
        String str = "abc";
        System.out.println(str); //abc
        System.out.println(System.identityHashCode(str));
        //1785210046
        str += "def";
        System.out.println(str); //abcdef
        System.out.println(System.identityHashCode(str));
        //1151020327
    }
}

Setter 메소드 제거

궁금한 것: JIT방식 인터프리터로 실행하다가 → 바이트 코드 전체를 컴파일하여 기계어로 변경하고, 이후에는 더이상 인터프리팅 하지 않고 기계어로 직접 실행하는 방식?..?

CallbyReference 랑 CallbyValue 아직 잘 모르겠다!!!!!!

32비트는 0101같은 숫자가 32개 있는 것

hdd.sdd→program실행되지 않은 것 - > process실행되고 있는 프로그램 → cpu pc에서 주소값을 가져다 사용함

ALU산술연산장치:더하기 빼기 하는 곳

CallByReference

profile
Developer who does not give up and keeps on going.

0개의 댓글