CS/Programming Language

Heap Memory & Garbage Collection

WakaraNai 2022. 11. 24. 15:30
728x90
반응형

Java의 String과 String builder의 메모리에 있어 차이

String은 오래 걸리는데 StringBuilder는 빠르면서도 메모리도 적게 차지한다.

 

Dynamic Memory Allocation

로컬 변수는 스택에 올라가서 관리가 쉽지만

그 외 데이터는 힙에 올라가서 deallocation 시 많은 시간이 소요된다

 

static과 global,data는 loader에서 올라가지만

runtime에서 올라가는게 있다

- activation records, objects, explicit allocation, local allocation

 

Heap Memory Management

순서 없이 막 들어가서 데이터양이 방대해지면 가비지 컬렉션 처리하느라 오래 걸림

 

first fit - 첫번째로 들어가는데 넣겠다 (공간 낭비, 빠름)

best fit - 내 크기와 비슷한 곳에 (공간절약, 오래걸림)

worst fit- small gap을 줄일 수 있다는 장점

 

freeStart로 링크를 걸어둠

allocate로 필요한 공간을 차지함

deallocate로 차지한 공간을 비워둠

 

자 아래 예시에서 allocate(1)을 하게 된다면

best fit일 경우 8, 9에, first fit일 경우 ,2,3,4에 가게 된다

 

 

공간 낭비를 최소화하기 위해 듬성듬성 비어있는 부분을 한 곳으로 쫙 모으는 기법은

coalesce adjacent free blocks

마지막 allocate가 실패할 때 일어난다

 

Fragmentation 너무 많이 잘게 잘린 공간들이 많은 상황을 의미

 

Quick List

사람 20000만명이나 되는... 큰 데이터이지만 형태가 정해져있을 때 사용하는 자료구조

얘들은 coalescing할 필요가 없음.

크기가 일정하니깐

 

 

Other Heap Mechanism

Placement 

블록을 어떻게 배정할 지

first fit, best fit, next fit

Splitting

ㅂ르록을 크게 자를지 작게 자를지

• When and how to split large blocks

split to requested size

Coalescing

잘려진 블록들을 어떻게 붙일지

No coalescing

• Eager coalescing

• Delayed coalescing (as with quick lists) - 조금만 기다렷다가 청소하자

 

Current Heap Link

어디가 availiable 한 지

linked list의 link를 통해 다음을 찾아가는 방식을 이야기함

이 link를 따라가면서 필요없는 것을 제거한다

 

https://youtu.be/450maTzSIvA

 

Error in Current Heap Links

  • - exclusion error: memory location (=current heap link) is left out - 사용하고 있던 link를 잃어버림
  • - unused inclusion error: 힙 상에 안쓰는 메모리가 존재 - memory leak
  • - used inclusion error: fatal. 힙 링크를 따라갔는데 거기에 메모리 주소가 아닌 다른 데이터가 들어있는데 그걸 메모리 주소로 오인 -> 바이러스
    •  ex) Union in C: 같은 공간을 공유. 그래서 그 안의 값이 주소인지 값인지 알 수 없음
union {
	char *p;
    char tag[4];
}

 

Some common pointer Error

  • Dangling pointer: 메모리 할당으로 차지한 공간을 해제했는데 그 메모리 공간에 무슨 일을 또 하려고 할 때. 메모리를 가리키는 포인터가 삭제되어 그 메모리를 가지 못함
  • Memory Leak: 메모리 할당으로 만들었는데 그 이후로 단 한 번도 사용하지 않음. 메모리 낭비.

Heap Compaction

 

Garbage Collection

컴퓨터가 자동으로 할당하고 해제한다 - 프로그래머의 짐을 덜어주기 위해

 

객체 상태의 3가지

reachable: 사용하지 않는데 포인터로 접근은 가능한 상태 -> live or Dead 알기 어려움

allocated: 쓰레기가 된 데이터들.

 

3 Major approache in Garbage Collection

  • - Mark and sweep(JAVA): = mark and delete 
    • mark: live와 reachable 영역에 표시하고
    • sweep: 그 외 표시가 안된 allocated된 데이터를 삭제
  • - copying: 비어있는 공간에 스택에 올라간 포인터가 가리키는 데이터를 copying하면서, 안 닿은 대상에 대해서 reachable 영역을 비활성화. 카피하느라 걸리는 시간으로 렉이 걸릴 수 있음.
  • - reference counting(Python):
    • 장점 1개: 렉이 걸리지 않는다.  메모리마다 사용 여부를 숫자로 표시해두어 부지런하게 청소함. 0인 것만 삭제
    • 단점 2개: 서로를 가리키는 circle 관계는 삭제 못 한다. reference counter를 계속 업데이트해야하는 문제점

 

Generatinal collector(JAVA)

메모리를 세대 별로 분리하여 다룬다. 이는 오래된 메모리를 사용하지 않으리라 생각하고 우선순위로 두고 삭제한다

 

Incremental collector

- collect garbage a little at a time

- avoid the uneven performance of ordinary mark-and-sweep and copying collectors

 

 

Java Memory Pool

s3, s4는 Runtime constant Pool에 들어가서 공유가 된다. 

이는 코드만 보고 알 수 있는, 정적 데이터를 담는다

 

string: immutable  ,  StringBuilder: mutable

문자열 변경 시 원래 link를 삭제할 일 없이 그 자체를 바꾸고자 하여 StringBuilder를 따로 두고 있다.

원래 메모리에 뒤쪽에 이어 붙이는 식이라 memory leak도 줄어든다

 

 

 

Java Virtual Machine

가상메모리 시스템은 프로세스가 사용하는 메모리 주소를 실제 물리 주소와 구분한다

이로써 프로세스를 구분하고 디스크 스왑 처리를 사용하여 효과적으로 사용할 수 있는 램의 양을 늘릴 수 있게 된다

 

JVM은 Runtime data area에 있는 것들로 구성되어 있다

대표적으로 Stack Heap PC register에 저장된다.

클래스 데이터는 Method area에 할당 되고

객체는 heap에 할당된다

java는 thread를 써서 병렬 처리되기 때문에 각 쓰레드 별로 스택을 만든다

 

특히 Heap 공간은

generational 관리하기에

0세대 즉 Eden Space를 우선

s0 s1는 copy collection으로 왔다갔다 하면서 청소함

 

다만 지금까지 설명한 내용은 JAVA 7 JVM기반이라... 8 JVM은 Perm gen이 Metaspace로 전환됨

 

 

CPython Garbage Collection

Python: Everything is an object

2라는 숫자조차도 객체

다만 String은 immutable이라서 concat을 했을 때 주소가 바뀐다.

 

728x90
반응형

'CS > Programming Language' 카테고리의 다른 글

Parameter Passing  (0) 2022.11.25
ㄴㄹㄴㄹ  (0) 2022.11.22
Expression  (0) 2022.11.21
Stack Memory  (0) 2022.11.20
Semantic Analyzer: Polymorphism  (0) 2022.11.15