[F-lab 모각코 챌린지 28일차] TIL

JeongheeKim·2023년 6월 28일

TIL

목록 보기
28/66

학습계획


  • JVM학습

Today I Learned


JVM, JRE, JDK

  • JVM
    • 자바 가상 머신, 바이트 코드를 OS에 맞는 기계어로 변환
    • JVM만 제공되지 않고 최소 단위인 JRE단위로 배포됨
  • JRE
    • 자바 어플리케이션을 실행할 수 있는 배포판
    • JVM과 자바 런타임 환경에서 사용하는 프로퍼티 셋팅이나 리소스 파일을 가지고 있음
    • javac는 존재하지 않음
  • JDK
    • JRE + 개발에 필요한 툴

.java 코드 작성 후 실행하기까지의 과정

동작 방식

  1. 프로그래머가 자바 .java파일 을 작성한다.

  2. javac compiler에 의해 .java.class 파일로 컴파일 된다. .class파일은 JVM이 이해할 수 있는 바이트 코드로 구성되어있다. 바이트 코드로만은 실행이 불가하다.

    • .java.class로 컴파일했다라는것은 문법검사는 마쳤다의 의미도 내포됨, 시간 단축
    • 하지만 소스코드 변경 시 마다 컴파일 필요하지만 java의 모토로 보면 한번 컴파일로 어디서나 실행 시킬 수 있다.(one compile, run every where)
  3. .class파일은 Class Loader에 의해 JVM의 메모리 영역인 Runtime Data Area로 로딩

  4. Execution Engine에 의해 .class파일 해석(로드된 클래스 파일의 바이트 코드를 실행)

    → 바이트 코드를 컴퓨터가 이해할 수 있게 기계어로 바꾸는 작업 필요

  5. Engine에 의해 기계어로 해석된 것들이 Runtime Data Area에 배치되어 쓰레드 동기화나 GC를 수행하게 됨

Runtime Data Area

모든 스레드가 공유스레드 마다 하나씩 생성
Method AreaStack
HeapPC Register
Native Method Stack

Method Area(PermGen or Metaspace)

  • JVM이 시작될때 생성되는 공간
  • 클래스와 관련된 메타정보 저장 됨
    • 바이트코드가 이 영역에 저장
    • 클래스 멤버변수, 데이터 타입, 접근제어자 등의 필드 정보
    • 메소드의 이름, 리턴타입, 파라미터등의 메소드 정보
    • Class, Interface여부, Super class 이름 등 타입정보
    • Method Constant Pool
      • 상수 자료형을 저장하여 참조하는 역할
    • GC의 관리 대상

Heap

  • GC의 대상이 되는곳
  • 자바객체 및 JRE클래스의 동적 할당이 이루어지는곳
  • heap영역은 전역으로 접근할 수 있다.

New generation = Eden + S0(Survival0), S1(Survival1) , old generation

  1. 새로운 객체가 Eden영역에 생성
  2. Eden영역의 메모리가 꽉 차면 살아있는 객체만 Survivor영역으로 복사. 다시 Eden영역을 채운다.
    1. 이때 발생하는 Garbage Collection?를 Minor GC(young GC)라 함.
    2. GC가 동작하면서 Mark, Sweap 동작이 발생하며?
  3. Survivor영역이 꽉차면 S1영역으로 객체가 복사된다.

이 과정을 반복하다가 오래 살아있는 객체는 Old 영역으로 이동한다. Old영역이 꽉차면 GC가 발생하는데 여기서는 MajorGC(Full GC)라고 한다.

❓YoungGC vs FullGC 어떤것이 더 빠른가?

YoungGC가 FullGC보다 빠르다. 더 작은 공간에 할당되고, 객체를 처리하는 방식도 다르다.

Stack(LIFO)

  • 구성
    • Call Stack
      • 메서드 호출에 대한 정보를 쌓는 영역, 하나의 단위를 스택 프레임이라고 함
      • 메서드가 종료되면 stack에서 제거됨
    • Stack Memory
      • Call Stack의 실제 데이터를 저장하는 영역
  • 지역변수, 메서드의 매개변수 등 임시적으로 사용되는 변수
  • new 키워드로 생성된 객체(heap에 저장된)를 가르키는 인스턴스 변수가 저장되는곳
  • 이 메모리 영역이 가득 차면 java.lang.StackOverFlowError 발생
  • thread마다 stack 영역이 생성되므로 이 메모리 영역은 thread-safe하다.

(프로그램 언어는 위에서부터 아래로 읽으면서 메소드등은 클래스 내부에서 호출되고 끝나기때문에 stack 자료구조를 사용한게 아닐까 생각한다. )

PC Register

스레드가 시작될 때 생성되며, 현재 수행 중인 JVM명령어 주소를 저장하는 공간

스레드가 어떤 부분을 어떤 명령어로 수행할 지 저장하는공간

Native Method Stack

C, C++ 의 네이티브 코드를 수행하기 위한 공간


  • f-string 표기법
print(f'{rate:.3f}%')
print(f'{x} x 2 = {x*2} 입니다.')
  • 문자열을 생성하는 따옴표 앞에 f를 붙인다. {}안에 변수를 삽입한다.
  • 뒤에 자릿수를 지정하여 소수점을 표현한다.
  • 문자열 -> 아스키 코드 변환
a = input()
print(ord(a))

소수 판별

  • 소수란?
    2보다 큰 자연수 중 1과 자기자신을 제외한 자연수로는 나누어 떨어지지 않는 수
  • 소수 판별
    x를 2부터 x-1까지 모든수로 나누어서 하나라도 나누어 떨어지는 수가 있으면 소수가 아니다.
  • 시간복잡도 O(X)
def is_prime_number(x):
	for i in range(2,x):
    if x % i == 0:
    	return False
    return True
    
print(is_prime_number(4))
print(is_prime_number(7))

소수 판별 알고리즘 시간복잡도 개선

16의 약수 1,2,4,8,16
1 16 = 16 / 16 1 = 16
2 8 = 16 / 8 2 = 16
4 * 4 = 16
가운데 약수 기준으로 대칭을 이루기때문에 x-1까지 모두 곱할 필요는 없다.
-> x의 제곱근까지만 곱하면 시간복잡도 개선 가능

import math
def is_prime_number(x):
    for i in range(2, int(math.sqrt(x)) + 1):
        if x % i == 0:
            return False
    return True

print(is_prime_number(4))
print(is_prime_number(7))

에라토스테네스의 체

여러개의 수가 소수인지 아닌지 판별할때 사용
N보다 작거나 같은 모든 소수를 찾을때 사용한다.
1. 2부터 N까지의 모든 자연수를 나열한다.
2. 남은 수 중에서 아직 처리하지 않은 가장 작은 수 i를 찾는다.(i는 제곱근까지만 확인)
3. 남은 수 중에서 i의 배수를 모두 제거한다.(i를 제거하지 않는다.)
4. 더 이상 반복할 수 없을때까지 2, 3 반복

-> 문제에 1이 소수인지 판별하는 경우가 있을 경우 array[1]의 값으로 False를 추가하자

  • N의 크기만큼 리스트를 할당해야하므로 N이 10억 정도이면 에라토스테네스의 체를 이용하기 어렵다.
import math

n = 1000
array = [True for i in range(n + 1)]

for i in range(2, int(math.sqrt(n)) + 1):
    if array[i] == True:
        j = 2
        while i * j <= n:
            array[i * j] = False
            j += 1

0개의 댓글