KR102453983B1 - 생존 경로 정보 기반 가비지 컬렉션 방법 - Google Patents

생존 경로 정보 기반 가비지 컬렉션 방법 Download PDF

Info

Publication number
KR102453983B1
KR102453983B1 KR1020210178596A KR20210178596A KR102453983B1 KR 102453983 B1 KR102453983 B1 KR 102453983B1 KR 1020210178596 A KR1020210178596 A KR 1020210178596A KR 20210178596 A KR20210178596 A KR 20210178596A KR 102453983 B1 KR102453983 B1 KR 102453983B1
Authority
KR
South Korea
Prior art keywords
path
information
garbage
survival path
survival
Prior art date
Application number
KR1020210178596A
Other languages
English (en)
Other versions
KR102453983B9 (ko
Inventor
지대훈
Original Assignee
인터와이즈 주식회사
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by 인터와이즈 주식회사 filed Critical 인터와이즈 주식회사
Priority to KR1020210178596A priority Critical patent/KR102453983B1/ko
Application granted granted Critical
Publication of KR102453983B1 publication Critical patent/KR102453983B1/ko
Priority to PCT/KR2022/018275 priority patent/WO2023113267A1/ko
Publication of KR102453983B9 publication Critical patent/KR102453983B9/ko

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/0223User address space allocation, e.g. contiguous or non contiguous base addressing
    • G06F12/023Free address space management
    • G06F12/0253Garbage collection, i.e. reclamation of unreferenced memory
    • G06F12/0261Garbage collection, i.e. reclamation of unreferenced memory using reference counting
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/0223User address space allocation, e.g. contiguous or non contiguous base addressing
    • G06F12/023Free address space management
    • G06F12/0253Garbage collection, i.e. reclamation of unreferenced memory
    • G06F12/0269Incremental or concurrent garbage collection, e.g. in real-time systems
    • G06F12/0276Generational garbage collection
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2212/00Indexing scheme relating to accessing, addressing or allocation within memory systems or architectures
    • G06F2212/72Details relating to flash memory management
    • G06F2212/7205Cleaning, compaction, garbage collection, erase control

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

본 발명은 생존 경로 탐색을 통해 가비지를 검출하는 가비지 컬렉션 방법에 관한 것으로, 발견된 생존 경로 정보를 저장하여, 후속적인 경로 추적 및 가비지 판별 과정을 더욱 효율적으로 처리할 수 있는 가비지 컬렉션 방법에 관한 것으로, 객체 참조 변수의 변경에 따라 각 객체의 참조 정보를 변경하는 단계, 생존 경로 존재 여부가 불확실한 객체를 분류하는 단계, 불안전 객체의 생존 경로를 탐색하고 생존 경로 정보를 저장하는 단계, 발견된 생존 경로를 축약하여 저장하는 단축 경로 생성 단계 및 생존 경로 탐색 실패 시 생존 경로 탐색 도중 추적한 모든 객체를 가비지로 판별하는 단계를 포함한다.

Description

생존 경로 정보 기반 가비지 컬렉션 방법 { method for garbage collection based on survival path information }
본 발명은 컴퓨터 프로그램 실행 시 자동화된 메모리 관리를 처리하기 위한 가비지 컬렉션 방법 및 이를 이용한 가비지 컬렉션 시스템에 관한 것이다.
컴퓨터 프로그램에서 더 이상 참조되지 않는 객체(unreachable object)를 가비지 객체라 하며, 이러한 가비지 객체를 검출하여 해당 객체에 할당된 메모리 공간을 해제하는 자동화된 메모리 관리 시스템을 가비지 컬렉션 시스템(garbage collection system) 또는 가비지 컬렉터(garbage collector)라 한다. 일반적으로 가비지 컬렉터는 경로 추적 방식과 참조수 계산 방식으로 구분할 수 있다.
경로 추적 방식(Tracing Garbage Collection)은 전역 변수와 로컬 변수 등에 그 주소가 저장된 객체에서부터 시작하여 객체의 멤버 변수를 통해 참조된객체를 연속적으로 추적하여 모두 마킹한 후, 마킹되지 않은 객체를 가비지 객체로 판별하는 방식이다. 메모리 관리를 완전히 자동화할 수 있으나, 가비지가 아닌 객체에 대한 추적을 완료한 이후에 비로소 가비지 객체의 판별이 가능하므로 작업 실행 시간이 긴 것이 단점이다.
참조수 계산 방식(Reference Counting Garbage Collector)은 특정 객체를 참조하는 변수의 수를 세는 방식으로, 객체의 주소가 변수에 저장될 때 해당 객체의 참조수를 증가시키고, 변수의 내용이 변경될 때 해당 객체의 참조수를 감소시켜, 객체의 참조수가 0이 되는 순간 해당 객체를 가비지로 판별하는 방식이다. 사용되지 않는 메모리를 즉각적으로 회수할 수 있으므로 메모리 재사용 효율성이 높다.
그러나, 참조수 계산 방식은 여러 개의 객체가 서로 참조하는 순환 참조가 발생하면, 해당 객체들 모두가 접근 불가능한 상태가 된 이후에도 해당 객체들의 참조수가 0이 되지 않아 가비지로 판별하지 못하는 문제가 있다.
언급된 선행 기술 문헌은 참조수 계산 방식과 더불어 보완적으로 경로 추적 방식을 사용하는 혼합형 가비지 컬렉션 방식에 관한 것이다. 혼합형 방식은 참조수 계산 방식을 사용하되, 추가적인 경로 탐색을 통해 순환 가비지를 검출한다. 혼합형 가비지 컬렉션 방식은 구현의 복잡성에도 불구하고, 큰 성능 차이를 보여주지 못하여 널리 사용되지 않고 있다.
가비지 컬렉션 실행으로 인한 응용프로그램의 속도 저하 및 뒤늦은 가비지 처리에 따른 메모리 사용 효율성 감소 문제에 대한 개선이 계속적으로 필요한 상황이다.
David F. Bacon et al. (2001). A Pure Reference Counting Garbage Collector M. Schoettner, R. Goeckelmann, S. Frenz, M. Fakler, P. Schulthess (2006). Incremental Distributed Garbage Collection Using Reverse Reference Tracking
본 발명은 상기와 같은 종래의 가비지 컬렉션 기술의 문제점을 해소하기 위한 것으로, 생존 경로 정보를 이용하여 가비지 컬렉션 수행 속도를 높임으로써 메모리 사용 효율성 및 컴퓨터 프로그램 수행 속도를 향상시킬 수 있는 가비지 컬렉션 방법 및 시스템을 제공하는 것을 목적으로 한다.
본 발명의 가비지 컬렉션 방법은 객체 참조 변수의 변경에 따라 각 객체의 기반 참조수, 참조자 객체 목록 및 생존 경로에 대한 정보를 변경하는 참조 정보 변경 단계(S100), 기반 참조수가 0인 객체 중 상기 생존 경로 정보가 존재하지 않는 객체를 가비지 판별이 필요한 불안전 객체로 분류하는 불안전 객체 분류 단계(S200), 상기 불안전 객체와 기반 객체를 연결하는 생존 경로를 역방향으로 탐색하여 가비지 객체를 검출하는 생존 경로 기반 가비지 검출 단계(S300), 상기 생존 경로 기반 가비지 검출 단계에서 검출된 가비지 객체들을 처리하는 가비지 처리 단계(S500)를 포함한다.
일 실시예에 있어서, 상기 참조 정보 변경 단계(S100)는, 기반 변수에 한 객체의 주소값이 저장되면, 상기 객체의 기반 참조수 값을 증가시키는 단계; 및 기반 변수에 저장된 한 객체의 주소값이 지워지면, 상기 객체의 기반 참조수 값을 감소시키는 단계를 포함할 수 있다.
일 실시예에 있어서, 상기 참조 정보 변경 단계(S100)는, 상기 객체를 참조하는 객체를 참조자 객체라고 하고, 상기 객체를 피참조자 객체라고 할 때에, 상기 참조자 객체의 멤버 변수에 상기 피참조자 객체의 주소값이 저장되면, 상기 피참조자 객체의 참조자 목록에 참조자 객체에 대한 정보를 추가하는 단계; 및 상기 참조자 객체의 멤버 변수에 저장된 상기 피참조자 객체의 주소값이 지워지면, 상기 피참조자 객체의 참조자 목록에서 참조자 객체에 대한 정보를 삭제하는 단계;를 포함하는 것을 특징으로 할 수 있다.
일 실시예에 있어서, 상기 생존 경로 기반 가비지 검출 단계(S300)는 객체의 참조자 중 생존 경로가 존재하는 안전 참조자에 대한 정보를 각 객체 별로 저장함으로써 상기 객체의 생존 경로 정보를 저장하는 단계;를 포함할 수 있다.
일 실시예에 있어서, 상기 참조 정보 변경 단계(S100)는, 상기 객체와 상기 객체의 안전 참조자간 참조 연결이 끊어지면, 상기 객체의 안전 참조자 정보를 소거하는 단계;를 포함하는 것을 특징으로 할 수 있다.
일 실시예에 있어서, 상기 불안전 객체 분류 단계(S200)는, 기반 참조수가 0인 객체 중 상기 안전 참조자가 지정되지 않은 객체를 상기 불안전 객체로 분류하는 것을 특징으로 할 수 있다.
일 실시예에 있어서, 상기 불안전 객체 분류 단계(S200)는, 객체 참조 변수 변경 직후, 기반 참조수가 0인 객체 중 상기 안전 참조자가 지정되지 않은 객체를 불안정 객체 목록에 저장하는 단계, 주기적으로 응용 프로그램의 스택에 포함된 로컬 변수를 조사하여 로컬 변수에 의해 참조된 객체의 기반 참조수를 변경하는 단계, 불안정 객체 목록에 포함된 객체 중 기반 참조수가 0이고, 상기 안전 참조자가 지정되지 않은 객체를 상기 불안전 객체로 판별하는 단계를 포함하는 것을 특징으로 할 수 있다.
일 실시예에 있어서, 상기 생존 경로 기반 가비지 검출 단계(S300)는 상기 불안전 객체의 생존 경로를 역방향으로 탐색하는 동안 추적한 모든 객체를 방문 객체 목록에 저장하는 단계를 더 포함하는 것을 특징으로 할 수 있다.
일 실시예에 있어서, 상기 생존 경로 기반 가비지 검출 단계(S300)는 상기 불안전 객체의 생존 경로 탐색 실패 시, 상기 방문 객체 목록에 포함된 모든 객체를 가비지로 판별하는 것을 특징으로 할 수 있다.
일 실시예에 있어서, 상기 생존 경로 기반 가비지 검출 단계(S300)는 상기 불안전 객체의 생존 경로 탐색 성공 시, 발견된 생존 경로를 하나 또는 다수의 구간으로 나누어 각 구간 별로 시작점 객체를 포함하는 단축 경로 정보를 생성하고 저장하는 단축 경로 생성 단계(S400); 를 더 포함 할 수 있다.
일 실시예에 있어서, 상기 단축 경로 정보를 생성하는 단계(S400)는 상기 불안전 객체의 생존 경로에 포함된 객체 중 단축 경로 정보를 가지지 않은 객체들로 연이어 연결된 미단축 구간을 추출하는 단계;와 상기 미단축 구간의 시작점 객체 정보를 포함하는 새로운 단축 경로 정보를 생성하는 단계; 상기 미단축 구간의 시작점 객체를 제외한 상기 미단축 구간에 속한 객체들의 단축 경로 정보를 상기 생성된 단축 경로 정보로 설정하는 단계를 포함하는 것을 특징으로 할 수 있다.
일 실시예에 있어서, 상기 생존 경로 기반 가비지 검출 단계(S300)는 상기 단축 경로 정보를 가진 객체의 생존 경로를 탐색하고자 하는 경우, 상기 객체 대신에 상기 단축 경로의 시작점 객체의 생존 경로를 탐색하는 단계;와 상기 단축 경로의 시작점 객체의 생존 경로가 존재하면, 상기 단축 경로에 속한 모든 객체의 생존 경로 또한 존재하는 것으로 판단하는 단계;와 상기 상기 단축 경로의 시작점 객체의 생존 경로 탐색에 실패하면, 상기 단축 경로 정보를 더 이상 사용하지 못하도록 무효화하는 단계;를 더 포함 할 수 있다.
일 실시예에 있어서, 상기 참조 정보 변경 단계(S100)는, 한 객체와 상기 객체의 생존 경로에 포함된 안전 참조자 간의 참조 연결이 끊어지면, 상기 객체가 포함된 단축 경로 정보를 더 이상 사용하지 못하도록 무효화하는 단계;를 더 포함하는 것을 특징으로 할 수 있다.
본 발명은 가비지 판별 속도를 높여 가비지 컬렉션 실행으로 인한 응용 프로그램 실행 속도 감소를 최소화한다.
본 발명은 보다 빠르게 가비지 객체의 메모리를 회수하여 메모리 활용성을 높임으로써 메모리 용량이 작은 시스템에서도 응용 프로그램을 보다 원활히 수행할 수 있도록 한다.
도 1 은 본 발명의 일 실시예에 따른 가비지 컬렉션 방법을 나타내는 순서도이다.
도 2 는 본 발명의 일 실시예에 따른 변수 변경 정보를 나타내는 구성도이다.
도 3 은 본 발명의 일 실시예에 따른 객체 참조 정보를 나타내는 구성도이다.
도 4 는 본 발명의 일 실시예에 따른 단축 경로 정보를 나타내는 구성도이다.
도 5 는 일 실시예에 따른 가비지 컬렉터를 사용하는 컴퓨터 시스템의 구성도이다.
도 6 은 본 발명의 일 실시예에 따른 참조 정보 변경 단계(S100) 를 나타내는 순서도이다.
도 7 은 본 발명의 일 실시예에 불안전 객체 분류 단계(S200)을 설명하기 위한 순서도이다.
도 8 은 본 발명의 일 실시예에 따른 생존 경로 기반 가비지 검출 단계(S300)를 나타내는 순서도이다.
도 9 는 본 발명의 일 실시예에 따른 생존 경로 탐색 단계(S340)를 설명하기 위한 순서도이다.
도 10 은 객체의 생존 경로를 설명하기 위한 도면이다.
도 11 은 객체의 안전 참조자 정보를 이용하여 생존 경로 정보를 저장한 상태를 나타내는 도면이다.
도 12 는 생존 경로 탐색 과정을 설명하기 위한 도면이다.
도 13 는 생존 경로 탐색을 통해 순환 가비지를 판별하는 과정을 설명하기 위한 도면이다
도 14 는 단축 경로를 설명하기 위한 도면이다.
이하, 첨부된 도면들을 참조하여 바람직한 실시예를 첨부된 도면을 참조하여 설명한다. 이 과정에서 도면에 도시된 선들의 두께나 구성요소의 크기 등은 설명의 명료성과 편의상 과장되게 도시되어 있을 수 있다. 또한, 후술되는 용어들은 본 발명에서의 기능을 고려하여 정의된 용어들로써 이는 사용자, 운용자의 의도 또는 관례에 따라 달라질 수 있다. 그러므로, 이러한 용어들에 대한 정의는 본 명세서 전반에 걸친 내용을 토대로 내려져야 할 것이다.
또한, 하기 실시예는 본 발명의 권리범위를 한정하는 것이 아니라 단지 예시로 제시하는 것이며, 본 기술 사상을 통해 구현되는 다양한 실시예가 있을 수 있다.
기본 용어의 정리
객체, 객체 참조 변수
본 실시예는 자동화된 메모리 관리가 가능한 '가비지 자동 수집 가능 구조체'를 '객체'라 정의한다.
객체의 주소값을 저장할 수 있는 변수, 즉 가비지 자동 수집 가능 구조체의 주소를 저장할 수 있는 변수를 '객체 참조 변수'라 정의한다.
기반 참조수, 기반 객체, 줄기 객체
객체에 포함되지 않은 객체 참조 변수를 '기반 변수'라 정의한다. 로컬 변수와 전역 변수 및 가비지 자동 수집이 불가능한 정보 구조체에 포함된 멤버 변수들이 기반 변수에 해당한다.
객체 X를 참조하는 기반 변수의 수를 X의 '기반 참조수'라 정의한다.
기반 참조수가 1 이상인 객체를 '기반 객체'라 정의하고, 기반 참조수가 0인 객체를 '줄기 객체'라 정의한다.
도 10을 참조하면, 전역 변수 1 과 2, 로컬변수 1 등 3 개가 기반 변수에 해당한다. 객체 1은 전역 변수 1 에 의해 참조된 기반 객체이며, 기반 참조수는 1 이다. 객체 2는 로컬 변수 1 과 전역 변수 2 등 2 개의 기반 변수에 의해 참조된 기반 객체이며, 기반 참조수는 2 이다. 객체 1 과 2를 제외한 나머지 객체는 모두 기반 참조수가 0인 줄기 객체에 해당한다.
본 실시예에서는 기반 객체 여부를 판별하기 위하여 기반 참조수 정보를 사용한다. 이에, 기반 객체 판별만 가능하다면, 기반 참조수 값이 기반 변수의 개수와 일치하지 않아도 무관하며, 기반 참조수를 증감하는 하는 단위 및 방법에 대한 제약은 없다. 단지, 객체의 기반 참조수 값을 0과 비교하여 기반 객체 여부를 판별할 수 있어야 한다.
참조 연결
객체 X의 멤버 변수에 객체 Y의 주소를 저장한 경우, X는 Y를 참조하고, Y는 X에 의해 참조된다고 표현한다. 이 때, X를 Y의 '참조자(referrer)'라 하고, Y를 X의 '피참조자(referent)'라 정의한다.
참조자-피참조자 관계를 가진 두 객체를 잇는 가상의 연결선을 '참조 연결'이라 정의한다.
참조 연결은 방향성을 가진다. 참조자에서 피참조자로 향하는 것을 '순방향'이라 정의하고, 피참조자에서 참조자로 향하는 것을 '역방향'이라 정의한다.
도 10을 참조하면, 도면의 화살표 방향이 순방향에 해당한다. 화살표의 출발점에 해당하는 객체가 참조자이고, 화살표가 가리키는 객체가 피참조자에 해당한다.
본 실시예에서는, 한 객체가 그 자신을 참조하는 경우, 즉 한 객체의 멤버 변수에 객체 자신의 주소값이 저장된 경우는 참조 연결로 취급하지 않는다. 즉, 객체는 그 자신의 참조자나 피참조자가 될 수 없다.
경로 탐색
두 객체 X와 Y를 연결하는 가상의 경로를 객체 X와 Y의 '연결 경로'라 정의한다. 두 객체 간의 연결 경로는 1개 이상 존재하거나 없을 수 있다.
두 객체 간의 연결 경로를 탐색하는 것을 '경로 탐색'이라 정의한다.
순방향으로 참조 연결을 추적하여 연결 경로를 찾는 것을 '순방향 경로 탐색'이라 정의하고, 역방향으로 참조 연결을 추적하여 연결 경로를 찾는 것을 '역방향 경로 탐색'이라 정의한다.
도 10를 참조하면, 객체 1과 객체 7과의 연결 경로 탐색 시, 화살표를 따라 객체 1, 3, 4, 7 의 순서로 객체를 추적하는 것이 순방향 경로 탐색에 해당하고, 화살표의 역방향인 객체 7, 4, 3, 1 순서로 객체를 추적하는 것이 역방향 경로 탐색에 해당한다.
순환 참조와 순환 가비지
한 객체에서 출발하여 다른 객체를 하나 이상 경유하여 출발점으로 되돌아오는 폐곡선 연결 경로를 '순환 경로'라 정의한다. 두 객체를 경유하는 순환 경로는 하나도 없거나 1개 이상일 수 있다.
순환 경로에 속한 모든 객체는 서로 '순환 연결'되었다고 정의한다.
가비지 객체 중 다른 가비지 객체와 순환 연결된 객체를 '순환 가비지'라 정의한다. 기존의 참조수 계산 방식은 순환 가비지를 검출하지 못하는 문제가 있다.
생존 경로
객체 X와 기반 객체를 연결하는 외줄 연결 경로를 객체 X의 '생존 경로'라 정의한다.
도 10를 참조하면, 객체 9의 생존 경로는 총 2개이다. 첫번째는 객체 2, 8, 9 를 포함하는 경로이고, 두번째는 객체 1, 3, 4, 7, 8, 9 를 포함하는 경로이다.
기반 객체는 항상 생존 경로를 가진 것으로 간주한다. 즉, 기반 객체 X의 생존 경로는 X가 출발점이자 종료점인 경로에 해당한다.
기반 객체와 연결되지 않은 줄기 객체, 즉 생존 경로가 존재하지 않는 줄기 객체는 가비지 객체에 해당한다.
불안전 객체
가비지 판별이 필요한 객체 즉, 생존 경로 존재 여부가 확인되지 않은 줄기 객체를 '불안전 객체'라 정의한다.
안전 참조자
객체의 참조자 중 생존 경로가 존재하는 것이 확인된 참조자를 '안전 참조자(safe referrer)'라 정의 한다. 경로 탐색을 통해 확인된 객체 X의 생존 경로에 포함된 X의 참조자가 X의 '안전 참조자'에 해당한다.
생존 경로 발견 시, 발견된 생존 경로에 포함된 각 객체의 안전 참조자 정보를 저장함으로써, 각 객체의 생존 경로 정보를 저장할 수 있다.
도 11은 각 객체 당 1 개의 안전 참조자 정보를 저장하여 각 객체 당 1 개의 생존 경로 정보를 저장한 상태를 나타내는 도면이다. 도면 상의 모든 줄기 객체마다 1 개의 안전 참조자를 지정하고, 안전 참조자를 통해 연결된 생존 경로를 실선으로 표시하였다. 화살표의 출발점에 있는 객체가 화살표가 가리키는 객체의 안전 참조자에 해당한다.
도 11을 참조하면, 객체 9의 생존 경로 중 객체 9, 8, 2 를 연결하는 생존 경로 정보가 저장된 상태임을 알 수 있다. 즉, 객체 9의 안전 참조자는 객체 8 이고, 객체 8의 안전 참조자는 객체 2 이다.
단축 경로
생존 경로 발견 시 발견된 생존 경로를 하나 또는 다수의 구간으로 나누고, 각 구간 별로 시작점 객체 및 종료점 객체의 정보를 저장한 것을 '단축 경로(safe shortcut)' 라 정의한다.
도 14 는 도 13 에 도시된 생존 경로를 다수의 구간으로 나눠 단축 경로를 생성한 상태를 나타낸 것으로 각각의 단축 경로를 구분하기 위하여 실선과 점선을 번갈아 사용하였다.
도 14 를 참조하면, 단축 경로 1은 객체 1에서 시작하여 객체 3, 4, 7 을 연결하는 실선에 해당하고, 단축 경로 2는 객체 4에서 시작하여 객체 5, 6 을 연결하는 점선에 해당한다. 단축 경로 3은 객체 2에서 시작하여 객체 8, 9, 10, 11 을 연결하는 실선으로, 단축 경로 4는 객체 10에서 시작하여 객체 12, 13을 연결하는 점선으로 표시하였다.
가비지 컬렉션 시스템 및 정보 구조
도 2는 본 발명의 일 실시예에 따른 변수 변경 정보를 나타내는 구성도이다.
도 2에 도시된 바와 같이, 변수 변경 정보(210) 에는 새로이 변수에 저장된 객체의 주소인 참조 증가 객체(211)와 해당 변수가 변경되기 직전에 해당 변수에 그 주소값이 저장되어 있던 참조 감소 객체(212)에 대한 정보를 포함한다.
객체의 멤버 변수를 변경하는 경우에는 해당 멤버 변수를 소유한 참조자 객체(213)에 대한 정보도 추가적으로 포함한다.
도 3은 본 발명의 일 실시예에 따른 객체 참조 정보를 나타내는 구성도이다.
도 3을 참조하면, 각 객체의 참조 정보(220)는 기반 객체 여부를 판별하기 위한 기반 참조수(221) 정보, 해당 객체를 참조하는 참조자 객체들에 대한 정보를 저장하는 참조자 목록(222) 정보를 포함할 수 있다.
이에 더하여, 객체 참조 정보(220)는 해당 객체의 생존 경로에 포함된 참조자 정보를 저장하는 안전 참조자(223), 해당 객체를 경유하는 단축 경로 정보 구조체를 가리키는 단축 경로(224)를 포함할 수 있다.
도 4는 본 발명의 일 실시예에 따른 단축 경로 정보를 나타내는 구성도이다.
도 4를 참조하면, 단축 경로 정보(230)에는 단축 경로의 시작점 객체(231)와 단축 경로의 종료점 객체(232), 단축 경로 추적 상태를 저장하기 위한 추적 상태(233) 정보를 포함할 수 있다.
추적 상태(233)가 true이면, 해당 단축 경로를 경유하는 경로를 '추적 중' 임을 나타내고, false 이면, '추적 종료' 된 상태임을 나타낸다.
참고로, 상기 구조체는 본 실시예를 설명하기 위해 필요한 정보의 내용을 나열한 것이다. 본 발명을 구현하는 실제 자료 구조는 다양한 형태로 정보를 축약해서 저장할 수 있으며, 상기 구성도와 구조가 상이할 수 있다.
상기 객체와 구조체를 Java 언어의 표현법을 이용하여 수도 코드로 표현하면 아래와 같다. 참고로, 객체 참조 정보(220)의 일부 또는 전부를 객체 외부에 저장할 수도 있으나, 설명의 용이성을 위해 아래의 수도 코드는 객체 참조 정보(220) 모두를 각 객체 별로 내장하는 형식을 취하였다.
/* 객체 및 객체 참조 정보(220) */
abstract class GCObject {
static final SafeShortcut INVALID_SHORTCUT = new SafeShortcut();
static Vector<GCObect> earlyDetectedUnsafeObjects = new Vector<>()
/* 기반 참조수 정보(221) */
int rootReference;
/* 참조자 목록 정보(222) */
Vector<GCObject> referrerList = new Vector<>();
/* 안전 참조자 정보(223) */
GCObject safeReferrer;
/* 단축 경로 정보(224) */
SafeShortcut safeShortcut = INVALID_SHORTCUT;
}
/* 단축 경로 정보(230) */
class SafeShortcut {
/* 시작 객체 정보(231) */
GCObject startObj;
/* 종료 객체 정보(232) */
GCObject endObj;
/* 추적 상태(233) */
boolean inTracing;
/*단축 경로 무효화 */
void invalidate() { startObj = null; }
/*단축 경로 유효성 검증 */
boolean isValid() { return startObj != null; }
}
/* 응용 프로그램 언어별 런타임. (120) */
class LangRuntime {
/* 실시간 가비지 컬렉션 가능 여부*/
static final boolean ENABLE_REALTIME_GC;
/* 가비지 객체를 메모리에서 삭제한다. */
static void deallocObject(GCObject garbage) {...}
/* 지정된 객체의 피참조자 객체 목록 반환 */
static List<GCObject> getReferents(GCObject referrer) {...}
}
본 발명에서는 이해를 용이하기 위하여 다수의 수도코드를 기재하였다. 기재된 수도 코드는 구현되는 언어에 따라 다양하게 변형될 수 있고, 본 실시예에서 설명하는 것은 발명의 내용을 구현하는 하나의 형태에 해당하며, 실질적으로 코드 자체의 내용이 발명의 전체 내용 또는 청구항의 내용을 제한하는 데에 사용되어서는 안된다.
전체적인 가비지 컬렉션 과정
도 1은 본 발명의 일 실시예에 따른 가비지 컬렉션 방법을 나타내는 순서도이다.
본 발명은 생존 경로 존재 여부를 검사하여 가비지 객체를 검출하는 가비지 컬렉션 방법에 관한 것으로 생존 경로 정보를 저장하고 관리함으로써 생존 경로 탐색 횟수를 최소화하고 생존 경로 탐색을 더욱 빠르게 처리하는 것이 특징이다.
도 1을 참조하면, 본 실시예에 따른 가비지 컬렉션 방법은 참조 정보 변경 단계(S100), 불안전 객체 분류 단계(S200), 생존 경로 기반 가비지 검출 단계(S300), 단축 경로 생성 단계(S400), 가비지 처리 단계(S500)를 포함한다.
참조 정보 변경 단계(S100)는 변경된 객체 참조 변수와 관련된 객체들의 참조 정보를 변경한다. 기반 변수가 변경된 경우에는 객체의 기반 참조수(221)를 변경하고, 객체의 멤버 변수가 변경된 경우에는 객체의 참조자 목록(222) 및 안전 참조자(223) 정보를 변경한다.
기반 참조수(221)는 기반 객체 여부를 판별하기 위하여 사용되고, 참조자 목록(222)은 역방향 생존 경로 탐색을 위하여 사용된다.
불안전 객체 분류 단계(S200)는 가비지 판별이 필요한 객체를 분류한다. 본 발명은 각 객체의 생존 경로 정보를 저장하는 과정과, 생존 경로 정보가 없는 줄기 객체를 불안전 객체로 분류하는 과정을 특징적으로 수행한다.
생존 경로 기반 가비지 검출 단계(S300)는 불안전 객체의 생존 경로 탐색과 동시에 가비지 객체를 검출하는 단계이다.
객체 X의 참조자 중 1 개라도 생존 경로가 존재하는 참조자가 있는 경우, X는 가비지 객체가 아니다. 즉, X가 가비지라면, 객체 X의 모든 참조자들도 가비지이다. 본 발명은 이러한 원리를 이용하여 생존 경로 탐색과 가비지 객체 선별 과정을 동시에 처리하는 과정을 특징적으로 수행한다.
보다 구체적으로, 생존 경로 기반 가비지 검출 단계(S300) 내에서 수행하는 생존 경로 탐색 단계(S340)는 불안전 객체의 생존 경로를 역방향으로 탐색하면서, 경로 탐색 동안 추적한 모든 객체를 방문 객체 목록에 저장하고, 발견된 생존 경로 정보를 저장한다.
불안전 객체의 생존 경로 탐색에 실패하면, 방문 객체 목록에 포함된 모든 객체를 가비지로 판명하고, 가비지 처리 단계(S500)로 이행하여 가비지 처리 과정을 수행한다.
불안전 객체의 생존 경로 탐색에 성공한 경우엔, 단축 경로 생성 단계(S400)로 이행하여 해당 생존 경로에 대한 단축 경로 정보(230)를 생성한다.
단축 경로 정보(230) 는 각 객체의 생존 경로 탐색을 보다 빠르게 수행하기 위하여 사용된다, 각 객체의 생존 경로를 하나 또는 다수의 구간으로 나누어, 해당 구간의 시작점 객체(231)와 종료점 객체(232) 정보 등을 저장한 단축 경로 정보(230)를 생성하고, 해당 단축 경로를 경유하는 경로를 탐색할 때, 단축 경로에 속한 객체들을 건너 뛰고 해당 단축 경로에 연결된 다른 단축 경로(230) 또는 객체를 추적할 수 있게 함으로써 경로 탐색 시간을 줄일 수 있다.
가비지 컬렉터 구성
도 5는 본 발명의 일 실시예에 따른 가비지 컬렉터를 사용하는 컴퓨터 시스템의 구성도이다.
도 5를 참조하면, 본 발명의 실시예에 따른 가비지 컬렉터를 사용하는 컴퓨터 시스템은 가비지 컬렉터(110), 런타임 시스템(120), OS(130) 및 실행 코드(140)를 포함한다.
실행 코드(140)는 프로그래머가 작성한 코드를 가리키며, 런타임 시스템(120)은 응용 프로그램 생성시 기본으로 탑재되는 기반 프로그램을 가리키는 것으로 OS 종속적인 메모리 관리 시스템과 인터프리터 등을 포함한다.
본 발명에 따른 가비지 컬렉터를 사용하는 컴퓨터 시스템이 구동되는 순서를 개략적으로 설명하면, 먼저 실행 코드(140)에서 변수 변경 요청을 런타임 시스템(120)으로 전달한다. 런타임 시스템(120)은 변수의 변경 직전 또는 직후에 변수 변경과 관련된 객체들의 정보를 모은 변수 변경 정보(210)를 가비지 컬렉터(110)로 전달한다. 가비지 컬렉터(110)는 변수 변경 정보를 분석하여 객체 참조 정보(220)를 변경하고, 객체 참조 정보(220)를 바탕으로 가비지 객체를 검출하여 런타임 시스템(120)에 가비지 객체 해제를 요청한다.
런타임 시스템(120)은 OS(130)를 통하여 블록 단위로 메모리(131)를 할당 받고 이를 다시 반환하는 처리를 한다. 실행 코드(140) 및 런타임 시스템(120)은 CPU를 통하여 메모리를 참조하고 변경하는데, 이때 CPU는 메모리의 일부를 내부의 캐시 메모리(132)로 복사하여 보다 빠르게 메모리를 참조할 수 있도록 한다. 런타임 시스템이 사용하는 메모리 블록의 총량을 줄일 수록, 메모리(131) 사용 효율성 및 CPU 캐시 메모리(132) 사용 효율성을 높여 응용 프로그램의 실행 속도를 향상시킬 수 있다.
(a) 참조 정보 변경 단계(S100)
도 6 은 본 발명의 일 실시예에 따른 참조 정보 변경 단계(S100)에서 수행하는 변수 변경 정보 처리 과정을 나타내는 순서도이다
참조 정보 변경 단계(S100)에서는 참조 증가 객체(211) 정보와 참조 감소 객체(212) 정보의 유효성을 판단한 후, 각각 참조 추가 단계(S120~S122)와 참조 삭제 단계(S140~S144)를 실행한다.
본 실시예에서는 참조 증가 객체(211)와 참조 감소 객체(212)가 null 이 아니고, 참조자 객체(213)와 동일하지 않은 경우, 해당 객체를 유효한 것으로 판단한다.
아래는 본 발명의 실시예에 따른 참조 정보 변경 단계(S100)에서 변수 변경 정보(210)를 처리하는 과정을 나타내는 수도 코드이다.
/* 참조 정보 변경 단계(S100) */
static void processVariableReplacement(
GCObject assigned, /* 참조 증가 객체(211) */
GCObject deassigned, /* 참조 감소 객체(212) */
GCObject referrer /* 참조자 객체(213) */
) {
if (assigned != null && assigned != referrer) {
/* 참조 추가 단계(S120) 수행 */
addReference(assigned, referrer);
}
if (deassigned != null && deassigned != referrer) {
/* 참조 삭제 단계(S140) 수행 */
removeReference(deassigned, referrer);
}
}
도 6을 참조하면, 참조 추가 단계(S120~S122)는 참조 증가 객체(211)의 참조 정보(220) 를 변경하는 단계이다.
참조자 객체(213) 정보가 없는 경우에는 기반 참조 증가 단계(S121)를 수행하고, 참조자 객체(213) 정보가 유효하면 참조 연결 추가 단계(S122)를 수행한다.
기반 참조 증가 단계(S121)는 참조 증가 객체의 기반 참조수 (311) 값을 증가시킨다.
참조 연결 추가 단계(S122)는 참조 증가 객체(211)의 참조자 목록(222)에 참조자 객체(213) 정보를 추가한다.
아래는 참조 추가 단계(S120~S122)를 나타내는 수도 코드이다.
static void addReference(
GCObject assigned, /* 참조 증가 객체(211) */
GCObject referrer /* 참조자 객체(213) */
) {
if (referrer == null) {
/* 기반 참조 증가 단계(S121) */
assigned.rootReference++;
}
else {
/* 참조 연결 추가 단계(S122) */
assigned.referrerList.add(referrer);
}
}
도 6을 참조하면, 참조 삭제 단계(S140~S144)는 참조 감소 객체(212)의 참조 정보(220) 를 변경하는 단계이다.
참조자 객체(213) 정보가 없는 경우에는 기반 참조 감소 단계(S121)로 이행하고, 참조자 객체(213) 정보가 유효하면 참조 연결 삭제 단계(S122)로 이행한다.
기반 참조 감소 단계(S141)는 참조 감소객체(212)의 기반 참조수(311) 값을 감소시키고, 참조 삭제 단계를 종료한다.
참조 연결 삭제 단계(S142)는 참조 감소 객체(212)의 참조자 목록(222)에서 참조자 객체(213) 정보를 삭제한다.
참조 감소 객체(212)와 참조 감소 객체(212)의 안전 참조자(223) 간 참조 연결이 단절된 경우, 생존 경로 정보 소거 단계(S144) 를 실행한다.
생존 경로 정보 소거 단계(S144) 에서는 참조 감소 객체(212)의 안전 참조자 정보(223)를 소거하고, 참조 감소 객체(212)가 포함된 단축 경로 정보(224)를 무효화한다.
단축 경로 무효화란 단절된 단축 경로 정보(230)를 더 이상 사용하지 않도록 표시하는 것을 의미한다. 본 실시예에서는 참조 감소 객체(212)가 포함된 단축 경로(224) 의 시작 객체(231) 의 값을 null 로 변경함으로써 해당 단축 경로(230)를 무효화한다.
참조 감소 객체(212)의 참조 정보 변경을 완료한 후, 불안전 객체 분류 단계(S200)로 이행한다.
아래는 참조 삭제 단계(S140~S144)를 나타내는 수도 코드이다.
static void removeReference(
GCObject deassigned, /* 참조 감소 객체(212) */
GCObject referrer /* 참조자 객체(213) */
) {
if (referrer == null) {
/* 기반 참조 감소 단계(S141) */
deassigned.rootReference--;
}
else {
/* 참조 연결 삭제 단계(S142) */
deassigned.referrerList.remove(referrer);
if (deassigned.safeReferrer == referrer) /* S143*/ {
/* 생존 경로 정보 소거 단계(S144) */
deassigned.safeReferrer = null;
deassigned.safeShortcut.invalidate();
}
}
/* 불안전 객체 분류 단계(S200)로 이행 */
detectUnsafeObject(deassigned);
}
(b) 불안전 객체 분류 단계(S200)
도 7 은 불안전 객체 분류 단계(S200)의 수행과정을 나타내는 순서도이다.
불안전 객체 분류(S200) 단계에서는 생존 경로 존재 여부가 불확실한 객체, 즉 가비지 판별이 필요한 객체를 분류한다.
본 발명은 생존 경로 발견 시 각 객체의 생존 경로를 구성하는 안전 참조자(223) 정보를 저장하는 과정과, 안전 참조자(223) 정보가 없는 줄기 객체, 즉 생존 경로 정보가 없는 줄기객체를 불안전 객체로 분류하는 과정을 특징적으로 수행한다. 본 발명은 생존 경로를 정보가 가진 객체의 생존 경로를 재탐색하지 않음으로써, 생존 경로 탐색 횟수를 최소화한다.
본 실시예 따른 불안전 객체 분류(S200) 단계는 객체의 기반 참조수(221)의 값이 0이고, 안전 참조자(223)가 NULL인 경우, 해당 객체를 불안전 객체로 판별한다.
모든 변수의 변경 정보를 실시간으로 수집할 수 있는 경우에는 불안전 객체 판별과 동시에 생존 경로 기반 가비지 검출 단계(S300) 로 수행함으로써, 실시간으로 가비지를 검출하는 가비지 컬렉션 시스템을 구성할 수 있다.
단, 일부 런타임 시스템(120)은 로컬 변수의 변경 사항에 대한 정보를 실시간으로 가비지 컬렉터(110)에 전달하지 않을 수 있다. 이러한 경우에는, 응응 프로그램의 스택을 스캔하여 로컬 변수에 의해 참조된 모든 객체를 마킹한 후에 비동기적으로 가비지 컬렉션 처리를 하여야 한다.
비동기적 가비지 컬렉션을 실행하는 경우에는 불안전 객체 분류 단계(S200)를 두 단계로 나누어 처리한다. 먼저, 변수 변경과 동시에 불안전 객체를 판별(S220)하여 불안정 객체 목록에 저장(S222)함으로써 1차적으로 불안정 객체를 분류한다.
이후, 런타임 시스템(120) 또는 가비지 컬렉터(110) 는 주기적으로 기반 객체 마킹 단계(S240)를 수행하여 응응 프로그램의 스택 내에 있는 로컬 변수에 의해 참조된 객체들의 기반 참조수(221)를 변경하여 기반 객체임을 알 수 있도록 마킹 한다.
2차 불안전 객체 분류 단계(S260)는 불안정 객체 목록에 저장된 객체들에 대해서 최종적으로 불안전 객체 여부를 판별하여 생존 경로 기반 가비지 검출 단계(S300)를 수행한다.
아래는 불안전 객체 분류 단계(S200)에 해당하는 수도 코드이다. 참고로, 스택을 스캔하여 로컬 변수에 의해 참조된 객체를 마킹 하는 방식은 경로 추적 방식에서 일반적으로 사용되는 방식이므로 이에 대한 별도 설명과 예시는 생략한다.
/* 불안전 객체 판별 */
static boolean isUnsafeObject(
GCObject obj
) {
return obj.rootReference == 0 && obj.safeReferrer == null;
}
static void earlyDetectUnsafeObject(
GCObject deassigned /* 참조 감소 객체(212) */
) {
/* 불안전 객체 판별 */
if (isUnsafeObject(deassigned)) /* (S220) */ {
if (LangRuntime.ENABLE_REALTIME_GC) /* (S221) */ {
/* 생존 경로 기반 가비지 검출 단계(S300)로 이행*/
processGarbageDetection(deassigned);
}
else {
/* 불안전 객체 목록 추가(S222)*/
earlyDetectedUnsafeObjects.add(deassigned);
}
}
}
/* 비동기적 가비지 컬렉션 함수 */
static void processAsyncGarbageCollection() {
/* 기반 객체 마킹 단계 (S240) */
markLocalRootObjects();
/* 불안전 객체 2차 분류 단계(S260) */
for (GCObject obj : earlyDetectedUnsafeObjects) {
/* 불안전 객체 재판별 */
if (isUnsafeObject(obj)) /* S261 */ {
/* 생존 경로 기반 가비지 검출 단계(S300) 수행 */
processGarbageDetection(obj);
}
}
}
(d) 생존 경로 기반 가비지 검출 단계(S300)
도 8은 생존 경로 기반 가비지 검출 단계(S300)를 나타내는 순서도이다. 생존 경로 기반 가비지 검출 단계(S300)는 생존 경로 탐색 준비 단계(S320) 와 생존 경로 탐색 단계(S340), 생존 경로 탐색 결과 처리 단계(S360)를 수행한다.
생존 경로 탐색 준비 단계(S320)는 생존 경로 탐색 단계(S340) 에서 사용할 방문 객체 목록을 생성한다. 방문 객체 목록은 생존 경로 탐색 단계(S340) 수행 도중 동일 객체에 대한 생존 경로 탐색을 중복 수행하는 것을 방지함과 동시에, 생존 경로 탐색 실패 시 가비지 객체의 목록을 파악하기 위한 용도로 사용된다.
생존 경로 탐색 단계(S340)는 불안전 객체의 생존 경로를 탐색하는 단계이다. 생존 경로 탐색 시 상기 방문 객체 목록에 추적하는 모든 객체의 목록을 저장하고, 생존 경로 발견 시 객체의 안전 참조자(223)를 통해 생존 경로 정보를 저장한다..
생존 경로 탐색 결과 처리 단계(S360)는 생존 경로 탐색 결과에 따라 단축 경로 생성 단계(S400) 또는 가비지 처리 단계(S500)를 수행하는 단계이다.
불안전 객체의 생존 경로 탐색(S340)에 실패하면, 생존 경로 탐색 결과 처리 단계(S360)는 상기 방문 객체 목록에 포함된 모든 객체를 가비지로 판별하고, 가비지 처리 단계(S500)로 이행한다.
불안전 객체의 생존 경로 탐색(S340)에 성공하면, 생존 경로 탐색 결과 처리 단계(S360)는 단축 경로 생성 단계(S400)로 이행하여 불안전 객체를 기점으로 하는 생존 경로에 대한 단축 경로 정보를 생성한다.
생존 경로 기반 가비지 검출 단계(S300)를 수도 코드로 표현하면 아래와 같다.
static void processGarbageDetection(
GCObject unsafeObj) {
/* 생존 경로 탐색 준비 단계(S320) */
Vector<GCObject> visitedNodes = new Vector(); // 방문 객체 목록
/* 생존 경로 탐색 단계(S340) 수행 */
boolean hasSurvivalPath = findSurvivalPath(unsafeObj, visitedNodes);
/* 생존 경로 탐색 결과 처리 단계(S360) */
if (hasSurvivalPath) {
/* 단축 경로 생성 단계(S400) 로 이행 */
constructShortcut(unsafeObj);
} else {
/* 가비지 처리 단계(S500)로 이행 */
deallocGarbageObjects(visitedNodes);
}
}
(e) 생존 경로 탐색 단계(S340)
도 9 는 생존 경로 탐색 단계(S340)를 나타내는 순서도이다. 생존 경로 탐색 단계(S340)는 기반 객체 여부 확인 단계(S341), 방문 객체 목록 추가 단계(S342), 단축 경로 추적 단계(S344~S347), 역방향 경로 추적 단계(S348~S351) 및 생존 경로 정보 저장 단계(S352) 를 포함할 수 있다.
기반 객체 여부 확인 단계(S341)는 추적 객체가 기반 객체인 경우 생존 경로 탐색 성공값을 반환한다. 본 실시예에 따르면, 기반 객체는 기반 객체 하나만으로 이루어진 생존 경로를 가지는 것으로 간주하므로, 기반 객체에 대한 생존 경로 탐색은 항상 성공한다.
방문 객체 목록 추가 단계(S342)는 방문 객체 목록에 추적 객체를 추가한다.
추적 객체의 단축 경로(224) S의 유효성을 판단(S343)하여, 단축 경로 S가 유효한 경우, 단축 경로 추적 단계(S344~S347)를 수행하여 상기 단축 경로 S를 경유하는 생존 경로를 먼저 탐색한다.
단축 경로 추적 상태 확인 단계(S344) 는 단축 경로 S의 추적 상태(233) 값을 검사하여 단축 경로 S 가 현재 추적 중인 상태인가를 확인한다. 단축 경로 S가 현재 추적 중인 상태인 경우, 즉 해당 단축 경로를 경유하는 순환 경로가 형성된 경우, 해당 단축 경로를 경유하는 생존 경로 정보가 유효하지 않은 것이므로, 단축 경로 정보 소거 단계(S347) 로 이행한다.
단축 경로 시작점 객체의 생존 경로 탐색 단계(S345)는, 추적 객체가 속한 단축 경로 S의 시작점 객체(231)에 대한 생존 경로 탐색 단계(S340)를 재귀적으로 수행하는 단계이다. 단축 경로 S의 추적 상태(233) 값을 추적 중(true)인 상태로 변경한 후, 시작점 객체(231)의 생존 경로를 탐색한다. 시작점 객체(231)의 생존 경로 탐색 완료 후 단축 경로의 추적 상태(233)추적 종료(false) 상태로 변경한다..
단축 경로 시작점 객체의 생존 경로 탐색 결과를 검사하여(S346), 성공한 경우 성공값을 반환하고, 실패한 경우 단축 경로 정보 소거 단계(S347) 로 이행한다. 시작점 객체(231)의 생존 경로 탐색 성공 시, 단축 경로에 포함된 모든 객체의 생존 경로도 존재하는 것이므로, 경로 탐색을 빠르게 처리할 수 있다.
단축 경로 정보 소거 단계(S347) 는 해당 단축 경로 정보가 더 이상 사용되지 않도록 단축 경로 S를 무효화하고, 역방향 경로 추적 단계(S348~S351)로 이행한다.
단축 경로 정보가 유효하지 않거나, 단축 경로를 통한 생존 경로 탐색에 실패한 경우, 역방향 경로 추적 단계(S348~S351)를 수행한다.
역방향 경로 추적 단계(S348~S351)는 추적 객체의 참조자 목록(222)에 포함된 참조자 R을 순차적으로 취하여(S348), 중복 추적 회피 단계(S349)와 참조자 생존 경로 탐색 단계(S350) 및 참조자 생존 경로 탐색 결과 검사 단계(S351) 를 반복적으로 실행한다.
중복 추적 회피 단계(S349) 는 참조자 R 이 방문 객체 목록에 포함되었는가를 검사하고, 방문 객체 목록에 포함된 경우 참조자 R에 대한 생존 경로 탐색 단계(S350)을 실행하지 않음으로써, 동일 객체를 두 번 이상 추적하는 것을 방지한다.
참조자 R의 생존 경로 탐색 단계(S350)는 참조자 R 에 대한 생존 경로 탐색 단계(S340)를 재귀적으로 수행하는 단계이다. 참조자 R의 생존 경로 탐색 결과를 검사하여(S351), 생존 경로 탐색에 성공한 경우, 생존 경로 정보 저장 단계(S352)로 이행하여 추적 객체의 안전 참조자(223)를 R로 변경하고, 성공값을 반환한다.
상기 역방향 경로 추적 단계(S348~S351)를 통해 생존 경로가 존재하는 참조자를 발견하지 못한 경우, 실패값을 반환한다.
아래는 생존 경로 탐색 단계(S340)를 나타내는 수도 코드이다.
static boolean findSurvivalPath(
GCObject tracingNode, // 추적 객체
Vector<GCObject> visitedNodes // 방문 객체 목록
) {
/* 기반 객체 확인 단계(S341) */
if (tracingNode.rootReference > 0) /* S341*/ {
/* 생존 경로 탐색 성공값 반환 */
return true;
}
/* 방문 객체 목록 추가 단계(S342). */
visitedNodes.add(tracingNode);
SafeShortcut S = tracingNode.safeShortcut;
if (S.isValid()) /* (S343) */ {
/* 단축 경로 추적 단계(S344~S347) */
if (!S.inTracing) /* (S344) */{
/* 단축 경로 시작점 객체의 생존 경로 탐색(S345) */
S.inTracing = true;
boolean survivalPathFound = findSurvivalPath(S.startObj, visitedNodes);
S.inTracing = false;
if (survivalPathFound) /* (S346) */{
/* 생존 경로 탐색 성공값 반환 */
return true;
}
}
/* 단축 경로 무효화(S347) */
S.invalidate();
}
/* 역방향 경로 추적 단계(S348~S351) */
for (GCObject R : tracingNode.referrerList) /* (S348) */ {
/* 중복 추적 회피 단계(S349) */
if (visitedNodes.contains(R)) {
continue;
}
/* 참조자 R의 생존 경로 탐색 단계 (S350) */
boolean survivalPathFound = findSurvivalPath(R, visitedNodes);
if (survivalPathFound) /* (S351) */ {
/* 생존 경로 정보 저장 단계 (S352) */
tracingNode.safeReferrer = R;
/* 생존 경로 탐색 성공값 반환 */
return true;
}
}
/* 실패값 반환 */
return false;
}
도 12는 생존 경로 탐색 과정을 설명하기 위한 도면이다.
생존 경로 탐색 단계(S340)는 추적 객체의 참조자에 대한 생존 경로 탐색 단계(S340)을 재귀적으로 실행하여 생존 경로 탐색에 성공한 참조자를 안전 참조자로 선택하는 재귀적 과정이다. 이에 생존 경로 탐색 단계(S340)는 함수 내부에서 자신을 호출하는 재귀적 함수로 구현된다.
도 12는 도 11에 도시된 객체 8과 객체 2의 참조 연결이 끊어진 경우, 객체 8의 생존 경로를 탐색하여 객체 8과 객체 9등 객체 8의 후미에 연결된 객체들의 생존 경로를 재설정한 결과를 도시한 것이다.
도 12를 참조하면, 객체 8의 생존 경로 탐색 과정은, 객체 8의 참조자인 객체 7의 생존 경로를 탐색하는 T1, 객체 7의 참조자인 객체 4의 생존 경로를 탐색하는 T2, 객체 4의 참조자인 객체 3의 생존 경로를 탐색하는 T3, 객체 3의 참조자인 객체 6의 생존 경로를 탐색하는 T4, 객체 6의 참조자인 객체 5의 생존 경로를 탐색하는 T5 순서로 생존 경로 탐색 함수가 실행된다
이어, 객체 5의 유일한 참조자인 객체 4가 방문 객체 목록에 포함되었으므로 실패값을 반환하는 R6, 객체 6의 유일한참조자인 객체 5의 생존 경로 탐색에 실패하였으므로 실패값을 반환하는 R7가 실행된다.
이어, 객체 3의 다른 참조자인 객체 1의 생존 경로를 탐색하는 T8이 실행되고, 객체 1은 기반 객체이므로 성공값을 반환하는 R9가 실행된다.
이어, 생존 경로가 존재하는 참조자를 안전 참조자(223)로 지정하고, 성공값을 반환하는 과정이 R10, R11, R12 순서로 실행되어, 객체 8의 새로운 생존 경로인 객체 1, 3, 4, 7, 8을 포함하는 생존 경로 정보를 안전 참조자(223)을 통해 저장하고, 생존 경로 탐색 과정을 완료한다.
도 13은 생존 경로 기반 가비지 검출 단계(S300)을 통해 순환 가비지를 검출하는 과정을 설명하기 위한 도면이다.
도 13은 도 11 에 게시된 객체 8 과 9 의 연결이 끊어진 상태를 보여주는 것으로, 객체 9 부터 13까지 5개 객체 모두 기반 객체와 연결하는 생존 경로가 없는 가비지 객체임을 알 수 있다. 상기 객체 중 객체 9, 10, 12, 13 은 서로 순환 연결된 순환 가비지에 해당한다.
도 13을 참조하면, 본 발명은 객체 8과 9의 연결이 끊어지면, 안전 참조자인 객체 8과 연결이 끊어진 객체 9를 불안전 객체로 분류하고, 객체 9를 기점으로 객체의 참조 연결을 역방향으로 탐색하여 기반 객체와 연결된 생존 경로를 탐색한다.
본 발명은 생존 경로를 탐색하는 동안 추적한 모든 객체를 방문 객체 목록에 저장하고, 갑지 객체의 참조자 또한 가비지 객체라는 원리를 이용하여 생존 경로 탐색과 동시에 가비지 객체를 검출하는 과정을 특징적으로 수행한다.
구체적으로, 객체 9의 생존 경로 탐색 과정은 객체 9의 참조자인 객체 13, 객체 13의 참조자인 객체 12, 객체 12의 참조자인 10 순서로 진행되며, 각 과정에서 추적하는 객체를 방문 객체 목록에 저장한다. 마지막으로 객체 10의 유일한 참조자인 객체 9는 이미 방문 객체 목록에 저장되어 있으므로, 기반 객체에 도달하지 못한 채 생존 경로 탐색이 실패하게 된다.
불안전 객체인 객체 9의 모든 참조자에 대한 생존 경로 탐색이 실패하면, 방문 객체 목록에 저장된 객체 9, 13, 12, 10 을 가비지로 판별하여 가비지 처리 단계(S500)를 실행한다. 객체 10을 가비지 처리하는 과정에서 객체 10과 11의 참조 연결 정보가 삭제되며, 이에 따라 객체 11 또한 가비지로 판별되어 가비지 처리 단계(S500)가 연쇄적으로 수행된다.
(f) 단축 경로 생성 단계(S400)
도 14는 단축 경로 정보 생성 과정을 설명하기 위한 도면이다.
단축 경로 생성 단계(S400)는 생존 경로 탐색 단계(S340)에서 발견된 생존 경로를 하나 또는 다수의 구간으로 나누어 단축 경로 정보를 생성한다.
본 실시예에서는 생존 경로 탐색 단계(S340)에서 발견된 생존 경로에 포함된 객체 중 유효한 단축 경로 정보(230)을 가지지 않는 객체들을 모아 새로운 단축 경로 정보(220)를 생성하고, 해당 단축 경로에 포함된 객체 중 시작점 객체(231)를 제외한 다른 객체들의 단축 경로(224)에 해당 단축 경로 정보(220)의 주소를 저장한다.한다.
도 14를 참조하면, 객체 7에서 부터 역방향으로 객체 1에 이르는 생존 경로가 최초로 발견된 경우, 해당 생존 경로에 속한 객체 7, 4, 3, 1 은 모두 유효한 단축 경로 정보가 없으므로, 객체 1을 시작점 객체(231)로 하는 새로운 단축 경로 1을 생성하고, 시작 객체인 객체 1을 제외한 상기 객체들의 단축 경로(224)에 단축 경로 1의 주소값을 저장한다. 이후 객체 6과 객체 1을 연결하는 생존경로가 발견된 경우, 해당 경로에 속한 객체 6, 5, 4, 3, 1 객체 중 단축 경로에 포함되지 않은 객체 6과 5를 하나의 단축 경로 2로 묶고, 단축 경로 2의 시작점 객체(231)을 객체 4로 설정하고, 객체 5와 6의 단축 경로(224)에 단축 경로 2의 주소값을 저장한다.
본 실시예에 따르면, 새로이 생성된 단축 경로의 시작점 객체(231)는 다른 단축 경로에 포함된 객체이거나, 기반 객체이다. 도 14를 참조하면, 단축 경로 2의 시작점 객체(231)인 객체 4는 단축 경로 2가 아닌, 단축 경로 1에 포함된 객체이고, 단축 경로 4의 시작점 객체(231)인 객체 10은 단축 경로 3에 포함된 객체이다.
단축 경로는 단축 경로 내의 다른 객체에 대한 추적을 생략하고, 단축 경로의 시작점 또는 종료점 객체만을 추적하여 생존 경로를 빠르게 탐색하기 위하여 사용된다.
본 발명의 일 실시예에 따른 단축 경로는 안전 참조자를 통해 연결된 생존 경로의 일부 구간에 해당하므로, 단축 경로의 시작점 객체의 생존 경로가 존재하면 단축 경로에 포함된 모든 객체의 생존 경로 또한 존재하게 된다. 본 발명은 이러한 원리를 이용하여 단축 경로 내의 다른 객체에 대한 추적을 생략하고, 단축 경로의 시작점 또는 종료점 객체만을 추적하여 단축 경로에 포함된 객체의 생존 경로를 빠르게 탐색하는 과정을 특징적으로 수행한다.
도 14를 참조하면, 객체 13의 생존 경로 존재 여부를 확인하는 경우, 객체 13이 속한 단축 경로 4의 시작점인 객체 10, 객체 10이 속한 단축 경로 2의 시작점인 객체-2를 추적하여 객체 13과 기반 객체 2를 연결하는 생존 경로를 빠르게 탐색할 수 있다.
단축 경로 정보를 이용하면 도 12에 도시된 불안전 객체 8의 생존 경로 탐색 과정을 더욱 빠르게 처리할 수 있다. 도 14를 참조하면 객체 8의 참조자인 객체 7은 단축 경로 1에 포함되어 있음을 알 수 있다. 도 12를 다시 참조하면, 객체 8은 객체 7 대신에 객체 7인 속한 단축 경로의 시작점 객체인 객체 1의 생존 경로를 탐색하여 객체 7의 생존 경로 존재 여부를 빠르게 확인할 수 있다. 객체 1은 기반 객체이므로, 객체 1과 연결된 단축 경로 1에 속한 객체 7 또한 생존 경로를 가지고 있음을 확인할 수 있다. 이어 객체 7을 객체 8의 안전 참조자로 지정함으로써 객체 8의 생존 경로 탐색 과정을 빠르게 종료할 수 있다.
본 발명의 일 실시예에 따른 단축 경로 생성 단계는 발견된 생존 경로 중 단축 경로(224) 정보를 가지지 않은 객체들로 연이어 이어진 미단축 구간을 추출하는 단계, 미단축 구간의 시작점 객체 정보를 가진 단축 경로 정보를 생성하는 단계, 시작점 객체를 제외한 미단축 구간에 속한 객체들의 단축 경로(224) 에 새로 생성된 단축 경로 정보를 저장하는 단계로 이루어진다.아래는 단축 경로 생성 단계(S400)에 해당하는 수도 코드이다. 안전 참조자로 이어진 객체의 생존 경로를 역방향으로 추적하면서, 단축 경로 정보가 유효하지 않은 객체들로 연이어 연결된 구간을 찾아내어 새로운 단축 경로 정보(230)를 생성한다.
static void constructShortcut(
GCObject obj
) {
SafeShortcut newShortcut = null;
while (obj.rootReference == 0) {
if (!obj.safeShortcut.isValid()) {
if (newShortcut == null) {
newShortcut = new SafeShortcut();
}
obj.safeShortcut = newShortcut;
obj = obj.safeReferrer;
} else {
if (newShortcut != null) {
newShortcut.startObj = obj;
newShortcut = null;
}
obj = obj.safeShortcut.startObj;
}
}
}
(g) 가비지 처리 단계(S500)
가비지 처리 단계(S500)는 생존 경로 탐색 기반 가비지 판별 단계(S500)에서 판별한 가비지 객체들에 대한 가비지 처리 절차를 수행하는 단계이다.
가비지 처리 단계(S500)는 가비지 객체를 삭제하기 전에 가비지 객체와 가비지 객체의 피참조자 객체들 간의 참조 연결 정보를 삭제한 후, 런타임 시스템(120)에 객체 해제를 요청한다. 피참조자들의 참조 연결 정보를 삭제하는 과정에서 가비지 객체의 피참조자 중 일부가 연쇄적으로 가비지 객체로 변경되어 처리될 수 있다.
아래는 가비지 처리 단계(S500)의 처리 과정을 예시한 수도 코드이다. static void deallocGarbageObjects(Vector<GCObject> garbageList) {
for (GCObject garbage : garbageList) {
deallocGarbage(garbage);
}
}
static void deallocGarbage(GCObject garbage) {
for (GCObject referent : LangRuntime.getReferents(garbage)) {
/* 가비지 객체와 피참조 객체의 참조 연결 정보를 삭제한다 */
removeReference(referent, garbage);
}
/* 런타임 시스템(120)에 객체 해제를 요청 */
LangRuntime.deallocObject(garbage);
}
실제 적용되는 예시 다이어그램
이상에서 설명된 본 발명의 일 실시 예는 예시적인 것에 불과하며, 본 발명이 속한 기술분야의 통상의 지식을 가진 자라면 이로부터 다양한 변형 및 균등한 타 실시 예가 가능하다는 점을 잘 알 수 있을 것이다. 그러므로 본 발명은 상기의 상세한 설명에서 언급되는 형태로만 한정되는 것은 아님을 잘 이해할 수 있을 것이다. 따라서 본 발명의 진정한 기술적 보호 범위는 첨부된 특허청구범위의 기술적 사상에 의해 정해져야 할 것이다. 또한, 본 발명은 첨부된 청구범위에 의해 정의되는 본 발명의 정신과 그 범위 내에 있는 모든 변형물과 균등물 및 대체물을 포함하는 것으로 이해되어야 한다.
110 : 가비지 컬렉터
120 : 런타임 시스템
130 : OS
131 : 메모리
132 : 캐시 메모리
140 : 실행코드

Claims (13)

  1. 객체 참조 변수의 변경에 따라 각 객체의 기반 참조수, 참조자 객체 목록 및 생존 경로에 대한 정보를 변경하는 참조 정보 변경 단계(S100);
    기반 참조수가 0인 객체 중 상기 생존 경로 정보가 존재하지 않는 객체를 가비지 판별이 필요한 불안전 객체로 분류하는 불안전 객체 분류 단계(S200);
    상기 불안전 객체와 기반 객체를 연결하는 생존 경로를 역방향으로 탐색하여 가비지 객체를 검출하는 생존 경로 기반 가비지 검출 단계(S300);
    상기 생존 경로 기반 가비지 검출 단계에서 검출된 가비지 객체들을 처리하는 가비지 처리 단계(S500);
    를 포함하는 가비지 컬렉션 방법.
  2. 제1항에 있어서,
    상기 참조 정보 변경 단계(S100)는,
    기반 변수에 한 객체의 주소값이 저장되면, 상기 객체의 기반 참조수 값을 증가시키는 단계;
    기반 변수에 저장된 한 객체의 주소값이 지워지면, 상기 객체의 기반 참조수 값을 감소시키는 단계;
    를 포함하는 가비지 컬렉션 방법
  3. 제1항에 있어서,
    상기 참조 정보 변경 단계(S100)는,
    상기 객체를 참조하는 객체를 참조자 객체라고 하고, 상기 객체를 피참조자 객체라고 할 때에,
    상기 참조자 객체의 멤버 변수에 상기 피참조자 객체의 주소값이 저장되면, 상기 피참조자 객체의 참조자 목록에 참조자 객체에 대한 정보를 추가하는 단계;
    상기 참조자 객체의 멤버 변수에 저장된 상기 피참조자 객체의 주소값이 지워지면, 상기 피참조자 객체의 참조자 목록에서 참조자 객체에 대한 정보를 삭제하는 단계;
    를 포함하는 것을 특징으로 하는 가비지 컬렉션 방법
  4. 제1항에 있어서,
    상기 생존 경로 기반 가비지 검출 단계(S300)는
    객체의 참조자 중 생존 경로가 존재하는 안전 참조자에 대한 정보를 각 객체 별로 저장함으로써 상기 객체의 생존 경로 정보를 저장하는 단계;
    를 포함하는 가비지 컬렉션 방법
  5. 제1항에 있어서,
    상기 참조 정보 변경 단계(S100)는,
    상기 객체와 상기 객체의 안전 참조자간 참조 연결이 끊어지면, 상기 객체의 안전 참조자 정보를 소거하는 단계;
    를 포함하는 것을 특징으로 하는 가비지 컬렉션 방법

  6. 제 5항에 있어서
    상기 불안전 객체 분류 단계(S200)는,
    기반 참조수가 0인 객체 중 상기 안전 참조자가 지정되지 않은 객체를 상기 불안전 객체로 분류하는 것을 특징으로 하는 가비지 컬렉션 방법
  7. 제 5항에 있어서,
    상기 불안전 객체 분류 단계(S200)는,
    객체 참조 변수 변경 직후, 기반 참조수가 0인 객체 중 상기 안전 참조자가 지정되지 않은 객체를 불안정 객체 목록에 저장하는 단계;
    주기적으로 응용 프로그램의 스택에 포함된 로컬 변수를 조사하여 로컬 변수에 의해 참조된 객체의 기반 참조수를 변경하는 단계;
    상기 불안정 객체 목록에 포함된 객체 중 기반 참조수가 0이고, 상기 안전 참조자가 지정되지 않은 객체를 상기 불안전 객체로 판별하는 단계;
    를 포함하는 것을 특징으로 하는 가비지 컬렉션 방법.

  8. 제1항에 있어서,
    상기 생존 경로 기반 가비지 검출 단계(S300)는
    상기 불안전 객체의 생존 경로를 역방향으로 탐색하는 동안 추적한 모든 객체를 방문 객체 목록에 저장하는 단계;
    더 포함하는 것을 특징으로 하는 가비지 컬렉션 방법
  9. 제 8항에 있어서
    상기 생존 경로 기반 가비지 검출 단계(S300)는
    상기 불안전 객체의 생존 경로 탐색 실패 시, 상기 방문 객체 목록에 포함된 모든 객체를 가비지로 판별하는 것을 특징으로 하는 가비지 컬렉션 방법.

  10. 제 1항에 있어서,
    상기 생존 경로 기반 가비지 검출 단계(S300)는
    상기 불안전 객체의 생존 경로 탐색 성공 시, 발견된 생존 경로를 하나 또는 다수의 구간으로 나누어 각 구간 별로 시작점 객체를 포함하는 단축 경로 정보를 생성하고 저장하는 단축 경로 생성 단계(S400);
    를 더욱 포함하는 가비지 컬렉션 방법.
  11. 제 10항에 있어서,
    상기 단축 경로 생성 단계(S400)는
    상기 불안전 객체의 생존 경로 중 단축 경로 정보를 가지지 않은 객체들로 연이어 연결된 미단축 구간을 추출하는 단계;
    상기 미단축 구간의 시작점 객체 정보를 포함하는 새로운 단축 경로 정보를 생성하는 단계;
    상기 미단축 구간의 시작점 객체를 제외한 상기 미단축 구간에 속한 객체들의 단축 경로 정보를 상기 생성된 새로운 단축 경로 정보로 설정하는 단계
    를 포함하는 것을 특징으로 하는 가비지 컬렉션 방법.
  12. 제 10 항에 있어서,
    상기 생존 경로 기반 가비지 검출 단계(S300)는
    상기 단축 경로 정보를 가진 객체의 생존 경로를 탐색하고자 하는 경우, 상기 객체 대신에 상기 단축 경로의 시작점 객체의 생존 경로를 탐색하는 단계;와
    상기 단축 경로의 시작점 객체의 생존 경로가 존재하면, 상기 단축 경로에 속한 모든 객체의 생존 경로 또한 존재하는 것으로 판단하는 단계;
    상기 단축 경로의 시작점 객체의 생존 경로 탐색에 실패하면, 상기 단축 경로 정보를 더 이상 사용하지 못하도록 무효화하는 단계;
    를 더 포함하는 가비지 컬렉션 방법.
  13. 제 10항에 있어서,
    상기 참조 정보 변경 단계(S100)는,
    한 객체와 상기 객체의 생존 경로에 포함된 안전 참조자 간의 참조 연결이 끊어지면, 상기 객체가 포함된 단축 경로 정보를 더 이상 사용하지 못하도록 무효화하는 단계;
    를 더 포함하는 것을 특징으로 하는 가비지 컬렉션 방법.


KR1020210178596A 2021-12-14 2021-12-14 생존 경로 정보 기반 가비지 컬렉션 방법 KR102453983B1 (ko)

Priority Applications (2)

Application Number Priority Date Filing Date Title
KR1020210178596A KR102453983B1 (ko) 2021-12-14 2021-12-14 생존 경로 정보 기반 가비지 컬렉션 방법
PCT/KR2022/018275 WO2023113267A1 (ko) 2021-12-14 2022-11-18 생존 경로 정보 기반 가비지 컬렉션 방법

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
KR1020210178596A KR102453983B1 (ko) 2021-12-14 2021-12-14 생존 경로 정보 기반 가비지 컬렉션 방법

Publications (2)

Publication Number Publication Date
KR102453983B1 true KR102453983B1 (ko) 2022-10-31
KR102453983B9 KR102453983B9 (ko) 2023-06-19

Family

ID=83802805

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020210178596A KR102453983B1 (ko) 2021-12-14 2021-12-14 생존 경로 정보 기반 가비지 컬렉션 방법

Country Status (2)

Country Link
KR (1) KR102453983B1 (ko)
WO (1) WO2023113267A1 (ko)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2023113267A1 (ko) * 2021-12-14 2023-06-22 인터와이즈(주) 생존 경로 정보 기반 가비지 컬렉션 방법

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR20140131978A (ko) * 2012-07-27 2014-11-14 인텔 코오퍼레이션 메모리 관리를 위한 시스템 및 방법
KR20150089746A (ko) * 2014-01-28 2015-08-05 한국전자통신연구원 자바스크립트의 메모리 관리 장치 및 그 방법
JP2016526717A (ja) * 2013-06-12 2016-09-05 エグザブロックス・コーポレーション ハイブリッドガベージコレクション
KR20190058706A (ko) * 2011-09-09 2019-05-29 마이크로소프트 테크놀로지 라이센싱, 엘엘씨 사이클 그래프에서 객체 수명을 관리하는 기법
KR102194413B1 (ko) * 2020-06-18 2020-12-23 인터와이즈 주식회사 역방향 경로 탐색을 이용한 혼합형 가비지 컬렉션 방법 및 이를 이용하는 가비지 컬렉션 시스템

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR102453983B1 (ko) * 2021-12-14 2022-10-31 인터와이즈 주식회사 생존 경로 정보 기반 가비지 컬렉션 방법

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR20190058706A (ko) * 2011-09-09 2019-05-29 마이크로소프트 테크놀로지 라이센싱, 엘엘씨 사이클 그래프에서 객체 수명을 관리하는 기법
KR20140131978A (ko) * 2012-07-27 2014-11-14 인텔 코오퍼레이션 메모리 관리를 위한 시스템 및 방법
JP2016526717A (ja) * 2013-06-12 2016-09-05 エグザブロックス・コーポレーション ハイブリッドガベージコレクション
KR20150089746A (ko) * 2014-01-28 2015-08-05 한국전자통신연구원 자바스크립트의 메모리 관리 장치 및 그 방법
KR102194413B1 (ko) * 2020-06-18 2020-12-23 인터와이즈 주식회사 역방향 경로 탐색을 이용한 혼합형 가비지 컬렉션 방법 및 이를 이용하는 가비지 컬렉션 시스템

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
David F. Bacon et al. (2001). A Pure Reference Counting Garbage Collector
M. Schoettner, R. Goeckelmann, S. Frenz, M. Fakler, P. Schulthess (2006). Incremental Distributed Garbage Collection Using Reverse Reference Tracking

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2023113267A1 (ko) * 2021-12-14 2023-06-22 인터와이즈(주) 생존 경로 정보 기반 가비지 컬렉션 방법

Also Published As

Publication number Publication date
WO2023113267A1 (ko) 2023-06-22
KR102453983B9 (ko) 2023-06-19

Similar Documents

Publication Publication Date Title
US6560619B1 (en) Using atomic compare-and-swap operations for forwarding-pointer installation
JP5284103B2 (ja) ソフトウェアトランザクショナルメモリ動作の最適化
US7716258B2 (en) Method and system for multiprocessor garbage collection
US6823351B1 (en) Work-stealing queues for parallel garbage collection
US6826583B1 (en) Local allocation buffers for parallel garbage collection
US6442751B1 (en) Determination of local variable type and precision in the presence of subroutines
EP1202172A1 (en) Topological, on-the-fly classification of objects into a global set and local sets
Bender et al. Concurrent cache-oblivious B-trees
US20110264712A1 (en) Copy planning in a concurrent garbage collector
Attiya et al. An adaptive collect algorithm with applications
US8032568B2 (en) Method for performing memory leak analysis inside a virtual machine
KR102453983B1 (ko) 생존 경로 정보 기반 가비지 컬렉션 방법
JP2003519834A (ja) メモリ管理によって参照の局所性を改善するための方法および装置
JP5244421B2 (ja) 情報処理装置およびプログラム分割方法
Prokopec Cache-tries: concurrent lock-free hash tries with constant-time operations
US8176286B2 (en) Memory recycling in computer systems
Bender et al. A new approach to incremental topological ordering
Iosif et al. Using garbage collection in model checking
KR102194413B1 (ko) 역방향 경로 탐색을 이용한 혼합형 가비지 컬렉션 방법 및 이를 이용하는 가비지 컬렉션 시스템
Jung et al. Applying hazard pointers to more concurrent data structures
KR20140009422A (ko) 메모리 관리를 위한 동시 마킹 및 동시 스위핑을 이용한 보존적인 불용 정보 수집
CN114527963A (zh) C++二进制文件中的类继承关系识别方法及电子装置
JP5199975B2 (ja) メモリ管理方法、メモリ管理プログラム、及び、情報処理装置
Ramanujam et al. Analysis of event synchronization in parallel programs
CN109711167A (zh) 一种基于多级指针的uaf漏洞防御方法

Legal Events

Date Code Title Description
E701 Decision to grant or registration of patent right
GRNT Written decision to grant
J301 Trial decision

Free format text: TRIAL NUMBER: 2023105000018; TRIAL DECISION FOR CORRECTION REQUESTED 20230227

Effective date: 20230525