프로그래머가 자바 .java파일 을 작성한다.
javac compiler에 의해 .java → .class 파일로 컴파일 된다. .class파일은 JVM이 이해할 수 있는 바이트 코드로 구성되어있다. 바이트 코드로만은 실행이 불가하다.
.java → .class로 컴파일했다라는것은 문법검사는 마쳤다의 의미도 내포됨, 시간 단축.class파일은 Class Loader에 의해 JVM의 메모리 영역인 Runtime Data Area로 로딩
Execution Engine에 의해 .class파일 해석(로드된 클래스 파일의 바이트 코드를 실행)
→ 바이트 코드를 컴퓨터가 이해할 수 있게 기계어로 바꾸는 작업 필요
Engine에 의해 기계어로 해석된 것들이 Runtime Data Area에 배치되어 쓰레드 동기화나 GC를 수행하게 됨
| 모든 스레드가 공유 | 스레드 마다 하나씩 생성 |
|---|---|
| Method Area | Stack |
| Heap | PC Register |
| Native Method Stack |
New generation = Eden + S0(Survival0), S1(Survival1) , old generation
이 과정을 반복하다가 오래 살아있는 객체는 Old 영역으로 이동한다. Old영역이 꽉차면 GC가 발생하는데 여기서는 MajorGC(Full GC)라고 한다.
❓YoungGC vs FullGC 어떤것이 더 빠른가?
YoungGC가 FullGC보다 빠르다. 더 작은 공간에 할당되고, 객체를 처리하는 방식도 다르다.
(프로그램 언어는 위에서부터 아래로 읽으면서 메소드등은 클래스 내부에서 호출되고 끝나기때문에 stack 자료구조를 사용한게 아닐까 생각한다. )
스레드가 시작될 때 생성되며, 현재 수행 중인 JVM명령어 주소를 저장하는 공간
스레드가 어떤 부분을 어떤 명령어로 수행할 지 저장하는공간
C, C++ 의 네이티브 코드를 수행하기 위한 공간
print(f'{rate:.3f}%')
print(f'{x} x 2 = {x*2} 입니다.')
a = input()
print(ord(a))
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를 추가하자
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