ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [내일배움캠프] 11/30 수요일 TIL 회고록
    카테고리 없음 2022. 11. 30. 21:10

    스택 - 함수, 메서드

    힙 - 인스턴스

     

    JVM : 0과 1 실행 (Java Virtual Machine)

    JRE : 자바 실행에 필요한 라이브러리 파일들 (Java Runtime Environment)

    JDK: 통합 개발도구(컴파일러, 디버거)  (Java Development Kit)

    JDK > JRE > JVM 

    JDK는 버전과 종류가 있다.


    클래스 로더

    자바는 동적 로드 , 즉 컴파일 타임이 아니라 런타임(바이트 코드를 실행할 때)에 클래스 로드하고 링크하는

    특징이 있다. 이 동적 로드를 담당하는 부분이 JVM의 클래스 로더이다. 정리하자면, 클래스 로더는 런타임 중에 JVM의 

    메소드 영역에 동적으로 Java 크래스를 로드하는 역할을 한다. 클래스 로더에는 로딩,링크,초기화 단계로 나뉘어져 있다.


    로딩

    • 자바 바이트 코드(.class)를 메소드 영역에 저장한다.
    • 각 자바 바이트 코드(.class)는 JVM에 의해 메소드 영역에 다음 정보들을 저장한다.
    • 로드된 클래스를 비롯한 그의 부모 클래스의 정보
    • 클래스 파일과 Class, Interface,Enum의 관련 여부
    • 변수나 메소드 등의 정보

    링크

    • 검증: 읽어 들인 클래스가 자바 언어 명세 및 JVM 명세에 명시된 대로 잘 구성되어 있는지 검사한다.
    • 준비: 클래스가 필요로 하는 메모리를 할당하고, 클래스에서 정의된 필드,메소드,인터페이스를 나타내는 데이터 구조를 준비한다.
    • 분석: 심볼릭 메모리 레퍼런스를 메소드 영역에 있는 실제 레퍼런스로 교체한다.

    초기화

    • 클래스 변수들을 적절한 값으로 초기화한다. 즉, static 필드들이 설정된 값으로 초기화한다.

    클래스 로더는 아래 사이트를 보고 참고하였다.

    https://steady-coding.tistory.com/593

     

    [Java] JVM의 클래스 로더란?

    java-study에서 스터디를 진행하고 있습니다. 클래스 로더란? 자바는 동적 로드, 즉 컴파일 타임이 아니라 런타임(바이트 코드를 실행할 때)에 클래스 로드하고 링크하는 특징이 있다. 이 동적 로드

    steady-coding.tistory.com


    Enum = Enumeration

    • 상수 목록을 담을 수 있는 데이터 타입
    • 특정한 변수가 가질 수 있는 값을 제한할 수 있다. 타입-세이프티 (Type-Safety)를 보장할 수 있다.
    • 싱글톤 패턴을 구현할 때 사용하기도 한다.

    Enum은 대표적으로 3개의 메소드가 쓰인다. values(), ordinal(),valueOf()

     

    1. values() : enum의 요소들을 순서대로 enum 타입의 배열로 리턴
    2. ordinal() : 해당 값이 enum에 정의된 순서를 리턴
    3. valueOf(): String 값을 enum에서 가져옴. 값이 없으면 예외 발생

     

    Enum 함수의 사용법은 해당 블로그를 참조하면 더 좋을 거 같다.

    https://limkydev.tistory.com/66

     

    [Java] Enum의 사용법

    안녕하세요. 지난 시간엔 EnumClass가 무엇이고 어떤 장점들이 있는지 알아보았습니다. 2017/06/27 - [Java] - [Java] enum 이란? (enum 개념익히기) 이번 시간은 Enum 사용방법을 더 알아보면서 Enum에 대한 이

    limkydev.tistory.com


    static initializer : 정적 초기자

    정적 초기자 block은 클래스 body 어디에서 나타나도 되며, 하나의 클래스가 임의의 갯수의 static initializer block을

    가질 수 있다.

     

    정적 초기자 영역의 코드는 단 한번만 실행되는데 그 실행시점은 

    1. 해당 클래스의 객체를 생성할 때
    2. 해당 클래스의 static 멤버(변수 혹은 메소드)에 최초로 접근할 떄 한번 실행이 된다. 이 경우는 심지어 해당 클래스의 객체를 생성하지 않았을 지라도 해당 클래스의 멤버의 최초 접근시 정척 초기자가 실행이 된다.

    예시.

       static {
            for(int i=0; i<100; i++) {
                a = i;
            }

     

    자바 메모리 구조(Runtime Date Area)

     

    Runtime Data Area 는 JVM이 프로그램을 수행하기 위해 OS로부터 할당받는 메모리 영역이다.

    WAS의 성능에 문제가 발생했을 때, 대부분 이 영역들이 원인이 된다.

    (Memory Leak 혹은 GC)

    Runtime Data Area는 크게 5가지로 구분이 된다.

    PC Register, JVM Stack, Native Method stack, Heap, Method Area

    PC Register, JVM Stack, Native Method stack 는 Thread 별로 생성되고

    Heap, Method Area 는 모든 Thread 가 공유한다.


    ㆍPC Register (Thread별로 1개씩 존재)

       JAVA의 PC Register 는 CPU내의 기억장치인 레지스터와는 다르게 작동한다.

       (Register-Base 가 아닌 Stack-base로 작동)

     현재 수행 중인 JVM Instruction의 주소를 가진다.


    ㆍJVM stack (Thread별로 1개씩 존재)

       Thread의 Method가 호출될 때 수행 정보( 메소드 호출 주소, 매개 변수 , 지역 변수, 연산 스택)가 Frame 이라는 단위로

       JVM stack에 저장된다. 그리고 Method 호출이 종료될 때 stack에서 제거된다.


    ㆍ Native Method stack (Thread별로 1개씩 존재)

       Java 외의 언어로 작성된 네이티브 코드들을 위한 stack ( c / c++ 등등)


    ㆍ Heap (모든 Thread가 공유)

       인스턴스와 배열이 동적으로 생성되는 공간, 그리고 Garbage Collection의 대상이 되는 영역이다.

      개발자는 객체를 제거하기 위해 별도의 코드를 작성할 필요가 없다. 모든 Thread가 공유하기 때문에 동기화 문제가 발생    할 수 있다.


    ㆍMethod Area ( 모든 Thread가 공유)

      Class Loader가 적재한 클래스(또는 인터페이스)에 대한 메타데이터 정보가 저장된다.

      이 영역에 등록된 class만이 Heap에 생성될 수 있다.

      Method Area는 논리적으로 Heap에 포함된다. Heap의 PermGen 이라는 영역에 속한 영역인데

      Java 8 이후로는 Metaspace 라는 OS가 관리하는 영역으로 옮겨지게 된다.


    해당 블로그를 참조했다.

    https://jithub.tistory.com/40

     

    자바 메모리 구조(Runtime Data Area)

    ■Runtime Data Area Runtime Data Area는 JVM이 프로그램을 수행하기 위해 OS로부터 할당받는 메모리 영역이다. WAS의 성능에 문제가 발생했을 때, 대부분 이 영역들이 원인이 된다. (Memory Leak 혹은 GC) Runtime

    jithub.tistory.com


    가비지 컬렉터 (Garbage Collector)

    자바의 메모리 관리 방법 중의 하나로 JVM의 Heap 영역에서 동적으로 할당했던 메모리 영역 중 필요 없게 된 메모리

    영역을 주기적으로 삭제하는 프로세스이다.

    해당 유튜브를 참고하며 봤더니 이해가 정말 쉽게 됐다.

    https://www.youtube.com/watch?v=24f2-eJAeII 


    오늘은 10시에 실시간 강의를 해주신 것을 바탕으로 강의 노션에 키워드로 남겨주신 것들을 공부했다.

    아직 다 완벽하게 알지는 못했지만 그래도 다른 사람의 블로그나 유튜브를 보면서 꽤 많은 지식들을 쌓은 것 같다.

    내일부터는 팀 편성이 이루어져 오늘이 팀원들과의 마지막 날이었다. 정말 도움 많이 받았고 정말 좋았던 팀이었다.

    내일은 어떤 사람들과 팀이 될까 긴장된다 ㅋㅋㅋ..

Designed by Tistory.