KR102194413B1 - 역방향 경로 탐색을 이용한 혼합형 가비지 컬렉션 방법 및 이를 이용하는 가비지 컬렉션 시스템 - Google Patents

역방향 경로 탐색을 이용한 혼합형 가비지 컬렉션 방법 및 이를 이용하는 가비지 컬렉션 시스템 Download PDF

Info

Publication number
KR102194413B1
KR102194413B1 KR1020200074473A KR20200074473A KR102194413B1 KR 102194413 B1 KR102194413 B1 KR 102194413B1 KR 1020200074473 A KR1020200074473 A KR 1020200074473A KR 20200074473 A KR20200074473 A KR 20200074473A KR 102194413 B1 KR102194413 B1 KR 102194413B1
Authority
KR
South Korea
Prior art keywords
circular
node
garbage
reference node
objects
Prior art date
Application number
KR1020200074473A
Other languages
English (en)
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 KR1020200074473A priority Critical patent/KR102194413B1/ko
Application granted granted Critical
Publication of KR102194413B1 publication Critical patent/KR102194413B1/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
    • 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 HYBRID GARBAGE COLLECTION USING REVERSE REFERENCE TRACING AND GARBAGE COLLECTION SYSTEM FOR USING THE SAME METHOD}
본 발명은 역방향 경로 탐색을 이용한 혼합형 가비지 컬렉션 방법 및 이를 이용한 가비지 컬렉션 시스템에 관한 것으로, 보다 효율화 된 메모리 관리 자동화 시스템에 관한 것이다.
컴퓨터 프로그램에서 더 이상 참조되지 않는 객체(unreachable object)를 가비지 객체라 하며, 이러한 가비지 객체를 추적하여 해당 객체에 할당된 메모리 공간을 해제하는 자동화된 메모리 관리 시스템을 가비지 컬렉션 시스템(garbage collection system) 또는 가비지 컬렉터(garbage collector)라 한다.
일반적으로 가비지 컬렉터는 객체의 주소값이 저장된 변수의 내용을 추적하는 참조 변수 추적 방식과, 특정 객체를 참조하는 변수의 개수를 세는 참조수 계산 방식으로 구분된다.
참조 변수 추적 방식(Tracing Garbage Collection)은 전역 변수와 로컬 변수 등 기반 변수에 그 주소가 저장된 객체에서부터 시작하여 해당 객체의 멤버 변수(member field)에 대입된 객체의 주소를 연속적으로 추적하면서 마킹한 후, 마킹 되지 않은 객체를 가비지 객체로 판별하는 방식이다.
참조 변수 추적 방식은 메모리 관리를 완전히 자동화할 수 있기 때문에, 가비지 컬렉션을 지원하는 언어들이 일반적으로 사용하는 방식이다. 그러나, 참조 변수 추적 방식은 참조 가능한 모든 객체에 대한 추적을 완료한 이후에 비로소 가비지 객체 판별이 가능하므로 작업 실행 시간이 길다.
이로 인해 가비지 회수가 늦어져 메모리 사용 효율성이 떨어지는 문제가 있으며, 가비지 컬렉션을 실행하기 위해 응용 프로그램이 잠시 멈추는 문제도 발생할 수 있다.
반면, 참조수 계산 방식(Reference Counting Garbage Collector)은 특정 객체를 참조하는 변수의 수를 세는 방식으로, 객체의 주소가 변수에 저장될 때 해당 객체의 참조수를 증가시키고, 변수의 내용이 변경될 때 해당 객체의 참조수를 감소시켜, 해당 객체의 참조수가 0이 되는 순간 해당 객체를 가비지로 판별하는 방식이다. 사용되지 않는 메모리를 즉각적으로 회수할 수 있으므로 메모리 재사용 효율성이 높다.
그러나, 참조수 계산 방식은 여러 개의 객체가 서로 참조하는 순환 참조가 발생하면, 해당 객체들 모두가 접근 불가능한 상태가 된 이후에도 해당 객체들의 참조수가 0이 되지 않아 가비지로 판별하지 못하는 문제가 있다.
이로 인해 순환 참조를 이루는 객체 뿐 아니라 해당 객체들로부터 참조 관계로 연결된 다른 객체들까지도 메모리에서 해제되지 않아 메모리 누수가 발생하게 된다. 최악의 경우, 메모리를 차지하는 가비지 객체의 양이 계속 증가하여 프로그램 실행이 불가능한 상황이 발생할 수 있다.
이에, Python, Kotlin 등의 언어는 참조수 계산 방식과 더불어 참조 변수 추적 방식을 추가적으로 사용하는 혼합형 방식을 사용하여 참조수 계산 방식의 결함을 해결하고 있다.
현재의 혼합형 가비지 컬렉션 기술은 참조 변수 추적 방식을 추가적으로 실행함과 동시에 순환 참조 여부를 사후에 검사하는 방법을 사용하고 있다. 이로 인해 참조수 계산 방식만으로도 가비지 판별이 가능한 객체, 즉 순환 참조가 발생하지 않은 객체들도 불필요하게 추적하는 단점이 있다. 기존의 혼합형 가비지 컬렉션 기술은 상이한 두 가지 가비지 컬렉션 방식을 중복적으로 수행함으로써 전체적인 실행 속도나, 메모리 사용 효율성 면에서 한 가지 방식을 사용할 때보다 뛰어나지 않아 그 이용 사례가 매우 적은 편이다.
David F. Bacon et al. (2001). A Pure Reference Counting Garbage Collector
본 발명은 상기와 같은 종래의 가비지 컬렉션 기술의 문제점을 해소하기 위한 것으로, 아래와 같이 혼합형 가비지 컬렉션 방식을 개선하여 메모리 관리의 효율성과 안정성을 최대화할 수 있는 가비지 컬렉션 방법을 제공하는 것을 목적으로 한다.
상기한 목적에 따라 제공되는 본 발명의 가비지 컬렉션 방법은 객체 참조 변수(object reference variable)의 값이 변경된 경우에, 상기 변경과 관련된 객체 및 참조 노드의 참조수 정보와 역방향 참조 경로 탐색을 위한 정보를 변경하는 참조 정보 변경 단계, 참조수 계산법을 기반으로 상기 객체 및 참조 노드의 가비지 여부를 판별하는 참조수 기반 가비지 판별 단계, 순환 참조 노드에 속한 객체들에 한정하여 참조 변수 추적 방식으로 가비지 객체를 판별하여 처리하는 순환 참조 노드 내부 가비지 컬렉션 단계, 객체 또는 참조 노드의 역방향 참조 경로를 추적하여, 순환 참조 관계로 연결된 둘 이상의 객체를 포함하는 순환 참조 노드를 탐지하는 순환 참조 탐지 단계를 포함한다.
일 실시예에 있어서, 상기 참조 정보 변경 단계에서, 역방향 경로 탐색을 위한 정보는 외부 참조자 목록을 포함할 수 있다.
일 실시예에 있어서, 상기 참조 정보 변경 단계에서, 상기 변수 변경에 의하여 새로운 객체 간 참조 관계가 생성된 경우, 피참조자 객체 또는 피참조자 객체가 속한 참조 노드의 외부 참조자 목록에 참조자 객체를 추가하고, 상기 변수 변경에 의하여 객체 간 참조 관계가 해지된 경우, 피참조자 객체 또는 피참조자 객체가 속한 참조 노드의 외부 참조자 목록에서 참조자 객체를 삭제하는 것을 특징으로 할 수 있다.
일 실시예에 있어서, 상기 참조 정보 변경 단계에서 상기 객체 및 참조 노드의 참조수 정보는 기반 참조수, 외부 객체 참조수 를 포함하는 것을 특징으로 할 수 있다.
일 실시예에 있어서, 상기 참조 정보 변경 단계는, 상기 변수 변경과 관련하여 순환 참조 노드에 속한 객체의 참조수 정보를 변경하는 경우, 순환 참조 노드의 외부 참조자 목록, 기반 객체수를 관리하는 단계를 더 포함하고, 상기 참조수 기반 가비지 판별 단계는 상기 순환 참조 노드의 상기 외부 참조자 목록의 개수와 상기 기반 객체수가 모두 0인 경우 가비지로 판별하는 것을 특징으로 할 수 있다.
일 실시예에 있어서, 상기 참조 정보 변경 단계에서 순환 참조 노드 내부의 객체 간 참조 관계가 해지된 순환 참조 노드를 선별하여 훼손된 순환 참조 노드 목록에 추가하는 단계를 더 포함하고, 상기 순환 참조 노드 내부 가비지 컬렉션 단계는 상기 훼손된 순환 참조 노드 목록에 포함된 순환 참조 노드에 대해서만 한정적으로 실시하는 것을 특징으로 할 수 있다.
일 실시예에 있어서, 상기 순환 참조 노드 내부 가비지 컬렉션 단계는, 상기 순환 참조 노드의 외부 참조자 목록에 포함된 각 객체들의 참조 경로를 따라 상기 선택된 순환 참조 노드에 속한 객체를 추적하여 마킹 하는 단계, 상기 순환 참조 노드의 가비지 검사 객체 목록에 포함된 객체 중 기반 참조수가 1 이상인 객체들의 참조 경로를 따라 상기 선택된 순환 참조 노드에 속한 객체를 추적하여 마킹하는 단계를 포함하는 것을 특징으로 할 수 있다.
일 실시예에 있어서, 상기 참조 정보 변경 단계는, 동일한 순환 참조 노드에 속한 두 객체의 연결을 해지하는 변경이 발생한 경우, 상기 두 객체 중 피참조자에 대한 정보를 상기 동일한 순환 참조 노드의 가비지 검사 객체 목록에 추가하는 단계를 더 포함하고, 상기 순환 참조 노드 가비지 컬렉션 단계는, 상기 순환 참조 노드의 가비지 검사 객체 목록에 포함된 각 객체를 기점으로 하는 참조자-피참조자 경로 중, 상기 순환 참조 노드에 속한 기반 참조수가 1이상인 각 객체들의 참조 경로를 탐색하여 해당 순환 참조 노드에 속한 객체를 추적하여 마킹 하는 단계; 및 상기 순환 참조 노드의 가비지 검사 객체 목록에 포함된 각 객체를 기점으로 하는 참조자-피참조자 경로 중, 순환 참조 노드에 속한 마킹 되지 않은 객체를 추적하여 가비지 처리하는 단계를 포함하는 것을 특징으로 할 수 있다.
일 실시예에 있어서, 상기 참조정보 변경 단계는, 서로 다른 참조 노드에 속한 두 객체 간 참조 관계가 생성되는 경우, 피참조자 객체가 속한 참조 노드의 외부 참조자 목록의 크기가 0이고, 참조자 객체가 속한 참조 노드의 외부 참조자 목록의 크기가 1인 경우와, 서로 다른 참조 노드에 속한 두 객체 간 참조 관계가 소멸되는 경우, 피참조자 객체가 속한 참조 노드의 외부 참조자 목록의 크기가 1이상인 경우에 관련 피참조자 객체를 경로 검사 객체 목록에 추가할 수 있다. 또한, 상기 순환 참조 노드 탐지 단계는, 상기 경로 검사 객체 목록에 포함된 객체를 기점으로 역방향 참조 경로 탐색하여 순환 참조 여부를 확인하는 것을 특징으로 할 수 있다.
일 실시예에 있어서, 순환 참조 노드 탐지 단계는 순환 참조 발생이 의심되는 객체를 기점으로 역방향 참조 경로 추적을 통해 순환 참조 노드를 탐지하는 단계 및 상기 탐지된 순환 참조 노드가 가비지 노드인가를 판별하고 가비지인 경우 가비지 처리하는 단계를 포함하는 것을 특징으로 할 수 있다.
일 실시예에 있어서, 상기 순환 참조 노드를 탐지하는 단계는, 새로이 추적을 개시한 객체를 포함하는 참조 노드를 추적 중 상태로 변경하는 단계, 상기 추적 중 상태인 상기 참조 노드의 외부 참조자 목록에 포함된 객체를 다음 추적 객체로 선택하는 단계, 상기 다음 추적 객체가 이미 추적 중 상태인 경우, 상기 다음 추적 객체가 포함된 참조 노드 및 상기 참조 노드 이후에 추적 중 상태로 변경된 모든 참조 노드들에 속한 객체들이 하나의 순환 참조 노드에 포함되도록 소속 참조 노드를 변경하는 단계를 포함하는 것을 특징으로 할 수 있다.
본 발명의 다른 목적에 따라 제공되는 가비지 컬렉션 시스템은, 객체 참조 변수의 변경 으로 인해 발생되는 가비지를 판별 및 처리하는 가비지 컬렉터는, 상기 변경과 관련된 객체 및 참조 노드의 참조수 정보 및 역방향 참조 경로 탐색을 위한 정보를 변경하고, 상기 참조수 정보에 기반하여 객체 및 참조 노드의 가비지 여부를 판단하는 참조 정보 관리부, 순환 참조 노드에 속한 객체들에 한정하여 가비지를 판별하는 순환 참조 노드 내부 가비지 컬렉션 및 역방향 참조 경로를 추적하여 순환 참조 탐지를 진행하는 참조 노드 관리부 및 가비지 처리부를 포함한다.
일 실시예에 있어서, 역방향 경로 탐색을 위한 정보는 외부 참조자 목록을 포함하는 것을 특징으로 할 수 있다.
일 실시예에 있어서, 상기 변수 변경에 의하여 새로운 객체 간 참조 관계가 생성된 경우, 피참조자 객체 또는 피참조자 객체가 속한 참조 노드의 외부 참조자 목록에 참조자 객체를 추가하고, 상기 변수 변경에 의하여 객체 간 참조 관계가 해지된 경우, 피참조자 객체 또는 피참조자 객체가 속한 참조 노드의 외부 참조자 목록에서 참조자 객체를 삭제하는 것을 특징으로 할 수 있다.
일 실시예에 있어서, 상기 참조 노드 관리부의 순환 참조 탐지 방법은, 순환 참조 발생이 의심되는 객체를 기점으로 역방향 참조 경로 추적을 통해 순환 참조 노드를 탐지하고, 상기 탐지된 순환 참조 노드가 가비지 노드인가를 판별하는 것을 특징으로 할 수 있다.
본 발명에 의하면, 객체 간 참조 관계 변경 시 역방향 경로 탐색용 정보를 구성하고, 해당 역방향 탐색 정보를 이용하여 순환 참조 관계로 연결된 객체들을 빠르게 탐지할 수 있다.
또한, 순환 참조 관계를 가진 객체들을 순환 참조 노드로 구분하고, 참조 노드 단위로 참조수를 검사하여 참조 노드에 속한 모든 객체의 가비지 여부를 실시간으로 판별할 수 있다.
또한, 순환 참조 노드 내부에 대한 가비지 컬렉션 수행 시 탐색 범위를 해당 순환 참조 노드 내부로 한정하여 최소화함으로써 보다 효율적으로 가비지 컬렉션을 실행할 수 있다.
또한, 순환 참조 노드 내부에 대한 가비지 컬렉션 실행 필요성 여부를 보다 정교하게 판단하여 그 실행 회수를 최소화함으로써 보다 효율적으로 가비지 컬렉션을 실행할 수 있다.
결과적으로 가비지 컬렉션 처리 과정의 속도를 향상시켜 가비지 컬렉션 시스템으로 인한 컴퓨터 프로그램의 처리 속도 감소를 최소화하고, 컴퓨터 기기의 에너지 소비를 줄일 수 있다.
또한, 가비지 컬렉션 시스템의 실행 속도 및 메모리 사용 효율성을 향상 시킴으로써, 보다 적은 메모리를 갖춘 컴퓨터 환경에서도 응용 프로그램을 원활히 실행되도록 할 수 있다.
도 1은 본 발명의 일 실시예에 따른 가비지 컬렉션 시스템의 구성을 나타내는 도면이다.
도 2은 본 발명의 다른 실시예에 따른 변수 변경 정보를 나타내는 구성도이다.
도 3a 및 도 3b는 본 발명의 다른 실시예에 따른 객체 참조 정보 및 참조 노드 보정 정보를 나타내는 구성도이다.
도 4a 내지 도 4c는 본 발명의 다른 실시예에 따른 참조 노드, 단방향 참조 노드, 순환 참조 노드를 나타내는 구성도이다.
도 5a 내지 도 5d는 본 발명의 다른 실시예에 따른 가비지 판별 및 처리 프로세스를 설명하기 위한 도면이다.
도 6은 본 발명의 다른 실시예에 따른 가비지 판별 및 처리 프로세스를 나타내는 순서도이다.
도 7은 본 발명의 다른 실시예에 따른 참조 정보 변경 단계를 나타내는 순서도이다.
도 8은 본 발명의 다른 실시예에 따른 참조수 기반 가비지 판별 단계를 나타내는 순서도이다.
도 9는 도 8의 실시예에 따른 참조수 기반 가비지 판별이 가능한 가비지 객체 및 가비지 참조 노드 발생의 예를 나타내는 도면이다.
도 10은 본 발명의 다른 실시예에 따른 참조 노드 관리부의 순환 참조 노드 내부 가비지 컬렉션 단계 및 순환 참조 노드 탐지 단계를 나타내는 순서도이다.
도 11은 도 10의 실시예에 따른 순환 참조 노드 내부 가비지 컬렉션이 필요한 가비지 객체 발생의 예를 나타내는 도면이다.
본 명세서에서 사용되는 용어에 대해 간략히 설명하고, 본 발명에 대해 구체적으로 설명하기로 한다.
본 발명에서 사용되는 용어는 본 발명에서의 기능을 고려하면서 가능한 현재 널리 사용되는 일반적인 용어들을 선택하였다. 이러한 용어들은 당 분야에 종사하는 기술자의 다른 의도나 새로운 기술의 출현에 따라 달라질 수 있다.
또한, 특정한 경우 발명의 설명을 위해 임의로 선정한 용어도 있으며, 이 경우 해당되는 발명의 설명 부분에서 상세히 그 의미를 기재할 것이다. 따라서 본 발명에서 사용되는 용어는 단순한 용어의 명칭이 아닌, 그 용어가 가지는 의미를 본 발명의 전반에 걸친 내용을 이해하며, 정의되어야 한다.
아래에서는 첨부한 도면을 참고하여 본 발명의 실시예에 대하여 본 발명이 속하는 기술 분야에서 통상의 지식을 가진 자가 용이하게 실시할 수 있도록 상세히 설명한다. 그러나 본 발명은 여러 가지 상이한 형태로 구현될 수 있으며 여기에서 설명하는 실시예에 한정되지 않는다. 그리고 도면에서 본 발명을 명확하게 설명하기 위해서 설명과 관계없는 부분은 생략하였으며, 명세서 전체를 통하여 유사한 부분에 대해서는 유사한 도면 부호를 붙였다.
명세서 전체에서 어떤 부분이 어떤 구성요소를 "포함"한다고 할 때, 이는 특별히 반대되는 기재가 없는 한 다른 구성요소를 제외하는 것이 아니라 다른 구성요소를 더 포함할 수 있음을 의미한다. 또한, 명세서에 기재된 "...수단", "...부", "모듈" 등의 용어는 적어도 하나의 기능이나 동작을 처리하는 단위를 의미하며, 이는 하드웨어 또는 소프트웨어로 구현되거나 하드웨어와 소프트웨어의 결합으로 구현될 수 있다.
본 발명에서 사용되는 용어들은 통상적인 개념과 동일 또는 유사하게 사용되었으나, 일반적인 정의와 일부 다르게 사용된 용어도 있는 바 이하에서 구체적으로 설명하기로 한다.
용어 및 개념의 정의
본 발명의 실시예에서 사용하는 용어는 아래와 같다. 일반적으로 사용되는 용어 및 본 발명의 실시예들을 설명하기 위한 용어의 정의에 대해 설명한다.
(a) 객체의 정의
객체(object)란 객체지향 언어적 특성을 가진 프로그램 구조체를 가리킨다. C++ 언어를 제외한 대부분의 고급 언어는 객체에 대한 가비지 컬렉션 기능을 기본적으로 내장하고 있다. 객체를 일반 객체와 가비지 컬렉션 대상이 되는 객체로 세분할 수도 있으나, 본 발명은 자바(Java), 파이썬(Python), 자바스크립트(Javascript) 등 모든 객체에 대해 가비지 컬렉션을 자동 수행하는 컴퓨터 언어를 주대상으로 하므로, 객체를 가비지 컬렉션 대상이 되는 구조체를 가리키는 의미로 사용한다. 그 외의 경우에는 구조체라 구별하여 표기한다.
(b) 변수의 종류와 정의
변수는 그 위치에 따라 전역 변수, 로컬 변수, 멤버 변수 등 3가지 유형으로 구분할 수 있다. 본 실시예에서는 이 중 특정 객체에 종속되지 않는 변수, 즉 로컬 변수와 전역 변수를 통칭하여 '기반 변수'라 정의한다.
또한 변수는 그 내용물에 따라 값 변수(value variable)와 참조 변수(reference variable)로 나뉠 수 있다. 참조 변수 중 객체의 주소를 저장하기 위한 변수를 객체 참조 변수(object reference variable)라 한다. 본 발명의 실시예에서는 문맥상 객체 참조 변수임을 명확히 유추할 수 있는 경우, 단순히 변수 또는 멤버 변수등으로 줄여 표기한다.
(c) 참조 관계
객체 A의 멤버 변수에 객체 B의 주소가 저장된 경우, 객체 A는 객체 B를 참조하고, 객체 B는 객체 A에 의하여 참조된다고 표현한다. 이때, 객체 A 와 B는 '참조 관계(referrer-referent relationship)'를 가지며, 객체 A를 객체 B의 '참조자(referrer)'라 하고, 객체 B를 객체 A의 '피참조자(referent)'라 한다.
객체 A의 멤버 변수에 객체 B의 주소가 저장된 상태에서 객체 B의 멤버 변수에 객체 C의 주소가 저장되면, 객체 B는 객체 A의 피참조자인 동시에 객체 C의 참조자가 될 수 있다. 즉 하나의 객체는 참조 관계를 형성하는 다른 객체의 관점에 따라 참조자가 될 수도 있고, 피참조자로 취급될 수도 있다.
(d) 총 외부 참조수
특정 객체의 주소를 저장하고 있는 모든 기반 변수의 수를 해당 객체의 '기반 참조수'라 정의한다. 또한 기반 참조수가 1 이상인 객체를 '기반 객체'라 정의한다.
특정 객체 A의 주소를 저장하고 있는 멤버 변수 중 A에 속한 멤버 변수를 제외한 변수의 총 개수를 객체 A의 '외부 객체 참조수'라 정의한다.
기반 참조수와 외부 객체 참조수의 합을 '총 외부 참조수'라 정의한다. 참고로, '총 외부 참조수'가 0인 객체는 가비지 객체이다.
(e) 참조 연결과 경로 탐색
참조자-피참조자 관계를 가진 두 객체를 잇는 가상의 연결선을 '참조 연결'(reference link')이라 정의하고, 참조 연결을 통해 객체들이 연이어 연결된 가상의 경로를 '참조 경로 (reference graph)'라 정의한다. 두 객체 A와 B를 연결하는 경로를 객체 A와 B의 '연결 경로'라 정의한다. 두 객체 간의 연결 경로는 1개 이상 존재하거나, 아예 없을 수 있다.
임의의 두 객체 간의 연결 경로를 탐색하는 것을 '연결 경로 탐색' 또는 '경로 탐색'이라 정의한다. 연결 경로 탐색 시 참조자에서 피참조자로 향하는 방향으로 탐색하는 것을 '참조자-피참조자 경로 탐색(referrer-referent path search)' 또는 '순방향 참조 경로 탐색'이라 정의하고, 피참조자에서 참조자로 향하는 방향으로 탐색하는 것을 '피참조자-참조자 경로 탐색(referent-referrer path search)' 또는 '역방향 참조 경로 탐색'이라 정의한다.
(f) 순환 참조와 순환 경로
다른 두 객체가 각 객체를 출발점으로 상대 객체에 연결할 수 있는 연결 경로가 모두 존재하는 경우, 두 객체는 '순환 참조 관계'를 가진다고 정의하고 해당 연결 경로를 '순환 참조 경로' 또는 줄여서 '순환 경로'라 정의한다.
순환 참조 관계를 가진 두 객체를 경유하는 순환 경로는 1개 이상일 수 있다. 이론적으로는 자기 자신을 참조하는 객체 하나만으로 순환 경로를 구성하는 것도 가능할 수 있으나 본 발명의 실시 예에서는 객체 자신에 대한 참조는 순환 참조로 분류하지 않는다.
도 6a를 참조하면, 참조 경로 상에 3개의 순환 경로가 존재한다. 구체적으로 객체-2에서 출발하여 객체-3, 4, 5, 6 등을 거쳐 객체-2로 되돌아오는 경로, 객체-10에서 출발하여 객체-11을 거쳐 객체-10으로 되돌아오는 경로, 객체-5에서 출발하여 객체-6을 경유하여 객체-5로 되돌아오는 순환 경로 등 3개의 순환 경로가 존재한다
(g) 순환 참조 가능/불가능 객체
순환 참조 발생이 가능한 객체를 '순환 참조 가능 객체'라 정의하고, 순환 참조 발생이 불가능한 객체를 '순환 참조 불가능 객체'라 정의 한다
객체 참조 변수를 가지지 않는 객체는 해당 객체를 경유하는 순환 경로 발생이 불가능하므로 순환 참조 불가능 객체이다. 또한 특정 객체가 객체 참조 변수를 가지는 경우에도 해당 객체가 가진 모든 객체 참조 변수가 모두 순환 참조 불가능 객체의 주소만을 가진 경우에는 해당 객체 또한 순환 참조 불가능 객체이다.
(h) 참조 노드
하나 또는 다수의 객체를 모아 가상의 한 객체로 치환한 것을 '참조 노드 (reference node)'라 정의한다. 일반 객체와 마찬가지로, 참조 노드 R에 속한 객체를 가리키는 기반 변수의 수를 R의 '기반 참조수'라 하고, 참조 노드 R에 속한 객체를 가리키는 R 외부 객체의 멤버 변수의 수를 R의 '외부 객체 참조수'라 하고, R의 기반 참조수와 외부 객체 참조수를 R의 '총 외부 참조수'라 한다.
일반 객체와 동일하게 참조 노드 또한 총 외부 참조수를 기반으로 가비지 여부를 판별할 수 있다. 구체적으로, 참조 노드의 기반 참조수와 외부 객체 참조수가 모두 0이면, 해당 참조 노드를 가비지로 판별할 수 있다. 즉, 해당 노드에 속한 모든 객체는 가비지 객체이다.
본 발명의 실시예에서는 순환 참조 관계로 연결된 객체로 구성된 '순환 참조 노드'와 순환 참조가 발생하지 않은 객체들로 구성된 '단방향 참조 노드' 두 가지로 형태로 참조 노드의 유형을 구분한다. 본 실시예에서는 용이한 설명을 위하여, 단방향 참조 노드는 항상 하나의 객체만을 포함하도록 한정하였으나, 참조 노드 유형 및 구성 방법은 본 실시 예에 한정되지 않는다.
순환 참조 노드는 순환 참조 관계로 서로 연결된 2개 이상의 객체들로 이루어진 참조 노드이다. 순환 참조 노드는 단일한 순환 경로만으로 구성될 수도 있고, 다수의 순환 경로가 결합되어 하나의 순환 노드를 구성할 수도 있다. 동일한 순환 참조 노드에 속한 임의의 두 객체는 서로 순환 참조 관계를 가진다. 즉, 동일한 순환 참조 노드에 속한 임의의 두 객체는 각 객체를 출발점으로 상대 객체에 연결할 수 있는 경로가 모두 존재한다.
도 6a를 참조하면, 속이 채워진 원은 순환 참조 노드에 속하는 객체를 나타내고, 속이 비워진 원은 단방향 참조 노드에 속하는 객체를 나타낸다. 점선 원 모양은 객체가 소속된 참조 노드를 나타낸다.
도 6a를 참조하면, 객체-5와 객체-6을 경유하는 순환 경로는 2 개이나, 서로 결합되어 있으므로 하나의 순환 참조 노드로 구분한다. 이에 도 6a에 나타난 순환 경로는 3개이나 순환 참조 노드는 2개로 분리된다. 객체-2, 3, 4, 5, 6 등을 포함한 순환 참조 노드-1과, 객체-10 과 객체-11을 포함하는 순환 참조 노드-2 등 2개의 순환 참조 노드와, 그 외 각 객체마다 각각 생성된 다수의 단방향 참조 노드를 포함하고 있다.
도 6b 는 참조 노드 단위로 참조 경로를 단순화한 결과를 보여주는 것이다. 객체와 마찬가지로 특정 노드로 향하는 화살표의 수가 0이면 해당 노드에 포함된 모든 객체를 가비지로 판별할 수 있다.
(i) 외부 참조자 목록
객체 또는 참조 노드를 참조하는 외부 객체를 '외부 참조자'라 정의한다. 구체적으로, 임의의 객체 A를 참조하는 참조자 객체 중 객체 A를 제외한 객체를 A의 외부 참조자라하고, 임의의 참조 노드 R에 속한 객체를 참조하는 객체 중 R에 속하지 않은 객체를 R의 외부 참조자라한다.
객체 또는 참조 노드를 참조하는 외부 참조자의 목록을 '외부 참조자 목록'이라 정의한다.
외부 참조자 목록에는 동일한 참조자에 대한 정보가 2회 이상 등록될 수 있다. 예를 들어, 객체 A의 여러 멤버 변수에 객체 B의 주소가 저장된 경우, 객체 B 또는 객체 B가 속한 외부 참조자 목록에는 객체 A에 대한 정보가 해당 멤버 변수의 개수만큼 저장될 수 있다.
가비지 컬렉터 구성
도 1은 본 발명의 일 실시예에 따른 가비지 컬렉션 시스템의 구성을 나타내는 도면이다.
도 1을 먼저 참조하면, 본 발명의 일 실시예에 따른 가비지 컬렉션 처리 방법을 채택한 응용 프로그램은 가비지 컬렉터(110), 언어별 런타임 시스템(120) 및 실행 코드(140)를 포함한다.
참고로, 런타임 시스템은 응용 프로그램 빌드 시, 기본으로 탑재되는 기반 프로그램을 가리키는 것으로 OS별 메모리 관리 시스템과 인터프리터 등을 포함한다.
구동되는 순서를 개략적으로 설명하면, 먼저 실행 코드(140)에서 변수 변경 요청 사항을 런타임 시스템(120)으로 전달한다. 런타임 시스템(120)은 요청된 변수를 변경한 직후, 변경된 변수와 관련된 객체들의 정보를 모은 변수 변경 정보를 가비지 컬렉터(110)로 전달한다. 가비지 컬렉터(110)는 변수 변경 정보를 분석하여, 가비지로 판단되는 대상들을 판별하고 런타임 시스템(120)을 통하여 가비지 객체를 메모리에서 해제 한다.
가비지 컬렉터(110)는 응용 프로그램 수행 과정에서 생성된 객체 중 가비지 객체들을 선별하여 사용하지 않는 객체의 메모리를 해제함으로써 자동화된 메모리 관리 기능을 수행한다.
도 1을 다시 참조하면, 가비지 컬렉터(110)는 참조 정보 관리부(111), 참조 노드 관리부(112) 및 가비지 처리부(113)를 포함한다.
참조 정보 관리부(111)는 변수 변경 정보(210)에 따라 관련 객체와 참조 노드의 참조 정보를 변경한다. 또한, 참조 정보 변경 결과에 따라 참조수 정보를 기반으로 특정 객체 또는 참조 노드가 가비지로 판정될 경우 가비지 처리부(113)에 해당 객체 또는 참조 노드에 대한 가비지 처리를 요청한다.
참조 노드 관리부(112)는 객체의 참조 정보의 변경에 따라 순환 참조 노드를 생성하거나 병합하고, 순환 참조 노드 내부의 가비지 객체를 참조 변수 추적 방식으로 판별하여 가비지 처리부(113)에 해당 객체들에 대한 처리를 요청한다.
가비지 처리부(113)는 가비지로 판별된 객체들에 대한 메모리 삭제 절차를 실행한다. 가비지 객체의 피참조자 및 해당 객체가 속한 참조 노드의 참조 정보에 대한 변경 절차를 마무리한 후 해당 객체가 점유한 메모리를 해제하여 다른 용도로 사용 가능하도록 한다.
가비지 판별 및 처리에 사용되는 정보 구조
도 2은 본 발명의 다른 실시예에 따른 변수 변경 정보를 나타내는 구성도이다. 도 3a 및 도 3b는 본 발명의 다른 실시예에 따른 객체 참조 정보 및 참조 노드 보정 정보를 나타내는 구성도이다. 도 4a 내지 도 4c는 본 발명의 다른 실시예에 따른 참조 노드, 단방향 참조 노드, 순환 참조 노드를 나타내는 구성도이다.
도 2에 도시된 바와 같이, 변수 변경 정보(210) 에는 새로이 변수에 저장된 객체의 주소인 참조 증가 객체(211) 정보와 해당 변수가 변경되기 직전에 해당 변수에 저장되어 있던 참조 감소 객체(212)에 대한 정보를 포함한다.
멤버 변수를 변경하는 경우에는, 해당 멤버 변수를 소유한 참조자 객체(213)에 대한 정보도 추가적으로 포함한다.
도 3a 및 3b는 본 발명의 다른 실시예에 따른 객체 및 참조 노드의 구조를 설명하기 위한 도면이다. 이는 컴퓨터 프로그램 구조체의 내부 구조에 대한 예시가 아니라, 가비지 컬렉터 수행에 필요한 정보를 논리적인 단위로 그룹화한 것이다. 이를 물리적으로 표현한 컴퓨터 프로그램 구조체는 본 실시예와 다를 수 있다.
각 객체의 참조 정보(310)는 해당 객체를 참조하는 기반 변수의 수를 저장하기 위한 기반 참조수(311), 해당 객체를 참조하는 멤버 변수의 수를 저장하기 위한 외부 객체 참조수(312), 해당 객체가 소속된 참조 노드(313)에 대한 정보를 포함할 수 있다.
본 실시예에 따르면, 객체 생성 시, 각 객체의 기반 참조수(311), 외부 객체 참조수(312)는 0 으로 초기화하고, 소속 참조 노드(313)는 ISOLATED_NODE 의 주소값으로 설정한다. ISOLATED_NODE 는 해당 객체와 참조 관계로 연결된 객체가 전혀 없는 새로 생성된 객체임을 표시하기 위한 가상 노드이다.
도 3b를 참조하면, 참조 노드 보정 정보(320)는 참조 정보 관리부(111)에서 객체 및 참조 노드의 참조 정보를 변경한 후, 해당 객체 및 해당 객체의 참조 노드의 변경사항을 사후 보정하기 위한 정보 들을 포함한다.
참조 노드 보정 정보(320)는 참조 정보 관리부(111)와 참조 노드 관리부(112) 를 비동기적으로 연동하기 위하여 임시로 저장하는 정보들의 집합이다. 순환 참조 여부에 대한 검사가 필요한 객체들의 목록을 저장하기 위한 경로 검사 객체 목록(321), 가비지 검사 및 참조 노드 재구성이 필요한 순환 참조 노드들을 선별하여 모은 훼손된 순환 참조 노드 목록(322)을 포함할 수 있다.
참고로, 순환 참조 검사 및 순환 참조 노드 내부의 가비지 컬렉션 과정은 참조 정보 변경 과정에 비해 오랜 시간이 걸린다. 이에 참조 노드 관리부(112) 의 실행을 참조 정보 관리부(111)와 별도로 분리된 쓰레드에 실행하는 것이 바람직하다. 참조 정보 관리부(111) 실행 시 참조 노드 관리부(112)가 필요로 하는 정보를 참조 노드 보정 정보(320)에 임시 저장한 후, 적절한 시점에 참조 노드 관리부(113)를 실행하여 저장된 정보를 한꺼번에 처리함으로써, 변수 변경과 참조 정보 변경 과정에 지연이 발생하는 것을 최소화하는 것이 바람직하다.
도 4a 내지 4c를 참조하면, 참조 노드(410)는 모든 유형의 참조 노드 구조체가 공통적으로 제공해야 하는 정보를 나타내는 추상적인 상위 구조체이다. 모든 유형의 참조 노드는 공통적으로 외부 참조자 목록(411) 정보를 포함할 수 있다.
단방향 참조 노드(420)는 해당 단방향 참조 노드에 대한 외부 참조자 목록(411)정보를 포함할 수 있다.
순환 참조 노드(430)는 해당 순환 참조 노드에 대한 외부 참조자 목록(411), 해당 순환 노드에 속한 기반 객체의 수를 저장하기 위한 기반 객체 수(431), 해당 순환 노드 소속 객체 중 가비지 판별이 필요한 가비지 검사 객체 목록(432) 등의 정보가 포함될 수 있다.
상기 객체와 구조체를 Java 언어의 표현법을 이용하여 수도 코드로 표현하면 아래와 같다. 아래의 수도 코드는 단지 실시예의 용이한 설명을 위하여 작성한 것으로, 실제 가비지 컬렉터 구현 시에는 C나 C++ 등의 언어로 작성하여야 한다.
abstact class GCNode {
/* 외부 참조자 목록(411) */
Vector<GCObject> externalReferrerList = new Vector<>();
/* 추적 상태(412) */
TraceState traceState = TraceState.NOT_TRACED;
/* 순환 참조 노드 여부 확인 */
abstract boolean isCyclic();
}
class OneWayNode extends GCNode {
boolean isCyclic() { return false; }
}
class CyclicNode extends GCNode {
/* 기반 객체 수(431) */
int rootObjectCount;
/* 가비지 검사 객체 목록(432) */
Set<GCObject> garbageTestObjectSet = new HashSet<>();
/* 추적 완료 노드 목록(433) */
Vector<GCNode> tracedNodeList = new Vector<>();
boolean isCyclic() { return true; }
}
class GCObject {
/* 기반 참조수(311) */
int rootRefCount;
/* 외부 객체 참조수 (312) */
int externalMemberRefCount;
/* 소속 참조 노드(313) */
GCNode refNode = ISOLATED_NODE;
/* 참조 관계로 연결된 객체가 없는 새로 생성된 객체를 표시하기 위한 가상 노드 */
static final GCNode ISOLATED_NODE = new OneWayNode();
/* 가비지 처리 중인 객체를 표시하기 위한 가상 노드 */
static final GCNode GARBAGE_NODE = new OneWayNode();
/* 추적 중인 객체를 표시하기 위한 가상 노드 */
static final GCNode TRACING_NODE = new OneWayNode();
/* 경로 검사 객체 목록(321) */
static Set<GCObject> gCyclicTestObjectSet = new HashSet<>();
/* 훼손된 순환 참조 노드 목록(322) */
static Set<CyclicNode> gDamagedCyclicNodeSet = new HashSet<>();
}
/* 응용 프로그램 언어별 런타임. 아래 함수의 실제 구현은 응용 프로그램이 사용한 언어, 컴파일러와 인터프리터에 의해 달라질 수 있다. 그 구현 내용은 생략한다.*/
class Runtime {
/* 가비지 객체 삭제 전 준비 작업을 수행한다. 참고) Java 언어의 finalize() 함수 수행 */
static boolean prepareReclaimObject(GCObject garbage)
/* 가비지 객체를 메모리에서 삭제한다. */
static void deallocObject(GCObject garbage);
/* 객체의 피참조자 객체 목록, 즉 지정된 객체의 객체 참조 멤버 변수에
저장된 피참조자 객체의 목록을 반환한다. */
static List<GCObject> getReferents(GCObject referrer);
}
객체 및 참조 노드에 대한 참조수 기반 가비지 판별
도 5a 내지 도 5d는 본 발명의 다른 실시예에 따른 가비지 판별 및 처리 프로세스를 설명하기 위한 도면이다. 도 9는 본 발명의 실시예에 따른 참조수 기반 가비지 판별이 가능한 가비지 객체 및 가비지 참조 노드 발생의 예를 나타내는 도면이다.
먼저 도 9를 참조하면, 도면 상에서 객체-9는 해당 객체를 가리키는 화살표의 수, 즉 총 외부 참조수가 0이므로 가비지 객체이다. 또한 순환 참조 노드-2에 속한 객체-10과 객체-11은 객체의 총 외부 참조수는 0이 아니나, 해당 참조 노드에 속한 객체를 가리키는 화살표의 수, 즉 해당 노드의 총 외부 참조수가 0이다. 따라서, 해당 노드에 속한 객체에 대한 기반 변수 또는 외부 객체의 멤버 변수로부터의 참조가 전혀 없으므로, 해당 노드에 속한 모든 객체가 가비지 처리되어야 한다.
순환 참조가 발생하지 않은 객체는 해당 객체의 총 외부 참조수, 즉 해당 객체의 기반 참조수와 외부 객체 참조수가 0인가를 검사하여 가비지 여부를 판별할 수 있다. 그러나, 순환 참조 노드에 속한 객체는 해당 객체의 총 외부 참조수 가 0이 아니더라도 해당 노드에 속한 모든 객체의 기반 참조수가 0이고, 노드의 외부 참조자 존재 여부를 검사하여 해당 노드에 속한 모든 객체의 가비지 여부를 한꺼번에 판별하는 추가적 과정이 필요하다. 구체적으로, 해당 순환 참조 노드에 속한 객체 중 기반 참조수가 1 이상인 객체의 수인 기반 객체수(431)와 해당 순환 참조에 속한 객체를 참조하는 외부 참조자의 수인 외부 참조자 목록(411)의 크기가 모두 0인 경우, 해당 노드에 대한 외부 참조가 전혀 없으므로 해당 노드에 속한 모든 객체를 가비지로 판별할 수 있다.
본 발명은 순환 참조 노드에 속한 객체의 참조수 정보 변경 시 해당 순환 참조 노드의 참조 정보도 함께 변경하고, 해당 순환 참조 노드의 참조수 관련 정보를 기반으로 순환 참조 노드에 속한 모든 객체의 가비지 여부를 한꺼번에 판별하는 것을 한 특징으로 한다.
역방향 참조 경로 탐색과 순환 참조 판별
도 5a 내지 도 5d는 본 발명의 다른 실시예에 따른 참조 노드의 구성과 이를 이용한 경로 탐색 방법을 설명하기 위한 도면이다.
도 5a를 참조하면, 객체-1과 객체-8의 연결 경로 탐색 시, 객체-1을 출발점으로 하여 참조자-피참조자 경로를 탐색하는 경우에는 객체-8이 포함되지 않은 다른 경로도 탐색할 가능성이 있다. 이에 최악의 경우, 객체-9를 제외한 도 5a에 포함된 모든 객체를 경유하는 경로를 탐색한 후에 객체-1에서 객체-8로 향하는 경로를 발견하게 될 수 있다. 실제 응용 프로그램 내부의 객체 간 참조 경로는 도 5a의 예시보다 훨씬 더 복잡하고 객체의 수도 많으므로 참조자-피참조자 경로 탐색은 많은 시간을 허비하는 단점이 있다.
나무의 뿌리에서 그 가지 끝을 향하는 경로를 탐색하는 참조자-피참조자 경로 탐색에 비해서, 나무의 가지에서 뿌리로 향하는 경로를 탐색하는 피참조자-참조자 탐색은 훨씬 작은 횟수의 추적으로 탐색 대상 객체가 경로 내에 포함되는가를 판단할 수 있다. 기반 변수를 뿌리라 하고, 객체 간 참조 연결을 가지라고 할 때, 일반적인 컴퓨터 응용 프로그램 실행 시 생성되는 참조 연결 가지의 수는 그 뿌리인 기반 변수의 수에 비해 수백~수천 배 더 많이 생성된다. 따라서, 역방향 경로 탐색 방식을 사용하면 기존의 참조자-피참조자 탐색 방식에 비해 탐색 효율성을 크게 높일 수 있다.
도 5a를 참조하면, 객체-8에서부터 객체를 가리키는 화살표를 역방향으로 탐색하여 객체-1과의 연결 경로를 탐색하는 경우, 5번의 과정만으로 마무리할 수 있음을 알 수 있다.
또한 각 객체 단위로 경로 탐색을 하는 것보다 다수의 객체들을 모아 참조 노드를 구성하고, 참조 노드 단위로 역방향 경로를 탐색하면 객체간 연결 경로 탐색을 더욱 효율적으로 수행할 수 있다.
도 5c를 참조하면, 참조 노드 간 역방향 경로 탐색 정보를 이용하여 객체-1과 객체-8 간의 연결 경로를 탐색하는 과정은, 객체-8이 속한 단방향 참조 노드의 외부 참조자인 객체-7, 객체-7이 속한 단방향 참조 노드의 외부 참조자인 객체-3, 객체-3인 속한 순환 참조 노드-1의 외부 참조자인 객체-1을 순차적으로 탐색함으로써, 객체-1과 객체-8간의 연결 경로 존재 여부를 3회의 과정만에 판별할 수 있다.
또한 도 5d를 참조하면, 객체-1과 객체-11간의 연결 경로 존재 여부를 판별하는 과정은, 객체-11이 속한 순환 참조 노드-2의 외부 참조자인 객체-4, 객체-4가 속한 순환 참조 노드-1의 외부 참조자인 객체-1을 순차적으로 탐색함으로써, 순환 참조 노드 내부의 다른 객체에 대한 검사를 생략하고 객체-1과 객체-11간의 연결 경로 존재 여부를 2회의 과정만으로 판별하는 것이 가능하다.
만약 객체-11의 멤버 변수에 객체-1의 주소를 저장한 경우, 순환 참조 노드-1 과 순환 참조 노드-2를 경유하는 새로운 순환 참조 경로가 발생하게 된다. 이 때, 참조 노드 기반 역방향 경로 탐색을 이용하면, 3회의 추적만으로 순환 참조 여부를 파악할 수 있을 뿐 아니라 해당 경로를 구성하는 노드를 모두 파악할 수 있다. 다수의 참조 노드를 연결하는 순환 참조가 발생하면 해당 노드들에 포함된 모든 객체가 순환 참조 관계를 가지게 된다. 이에, 해당 노드들에 속한 모든 객체의 소속 참조 노드(313)를 모두 동일한 순환 참조 노드로 변경함으로써, 해당 노드들을 손쉽게 하나의 순환 참조 노드로 병합할 수 있다.
본 발명의 실시예들은 참조수 계산 방식을 사용하되, 참조수 계산 방식만으로 가비지 객체를 판별할 수 없는 객체들, 즉 순환 참조가 발생한 객체들에 한정하여 선택적으로 참조 변수 추적 방식을 사용하는 혼합형 가비지 컬렉션 방법에 관한 것으로, 이를 실현하기 위해선 순환 참조가 발생한 객체들을 빠르고 판별하고, 순환 참조 노드로 정확하게 분리해 내는 것이 중요하다.
본 발명의 바람직한 실시예에 따르면, 객체 또는 참조 노드 단위로 역방향 탐색 정보를 구성하고 역방향 참조 경로 탐색을 통해 객체 및 참조 노드 간 연결 경로 존재 여부를 빠르게 판별함으로써, 순환 참조 발생 여부를 빠르게 판별할 수 있다.
도 6은 본 발명의 다른 실시예에 따른 가비지 판별 및 처리 프로세스를 나타내는 순서도이다. 도 6을 참조하면, 본 실시예에 따른 가비지 판별 및 처리 프로세스는, 참조 정보 관리부가 수행하는 참조 정보 변경 단계(S310), 참조수 기반 가비지 판별 단계(S320)와 참조 노드 관리부가 수행하는 순환 참조 노드 내부 가비지 컬렉션 단계(S330) 및 순환 참조 노드 탐지 및 처리 단계(S340)를 포함한다. 각 단계별로 상세히 설명한다.
(a) 참조 정보 변경 단계 (S310)
도 7은 본 발명의 다른 실시예에 따른 참조 정보 변경 단계를 나타내는 순서도이다. 참조 정보 변경 단계(S310)에서는, 언어별 런타임으로부터 변경된 변수에 대한 변수 변경 정보(210)를 접수하여, 관련 객체의 참조 정보(310)와 참조 노드의 참조 정보(420, 430) 및 역방향 탐색 정보(411)를 변경한다.
참조 정보 변경 단계는 참조 변수의 유형에 따라 기반 변수와 멤버 변수를 구별하여 처리한다. 런타임 시스템에서 해당 유형에 따라 적절한 함수를 구별하여 호출하는 것이 보다 바람직하나, 본 실시예에서는 아래의 수도 코드와 같이 하나의 함수를 통해 변경 정보(210)를 일괄 접수하여 처리하는 것으로 가정하였다.
static void onReplaceVariable( // 단계 S310
GCObject assigned, /* 참조 증가 객체(211) */
GCObject erased, /* 참조 감소 객체(212) */
GCObject owner /* 참조자 객체(213) */
) {
if (owner == null) {
// 로컬 변수 변경 정보 처리(S311)를 수행.
onReplaceRootVariable(assigned, erased)
}
else {
// 멤버 변수 변경 정보 처리(S312)를 수행
onReplaceMemberVariable(assigned, erased, owner)
}
if (erased != null) {
/* 참조수 기반 가비지 판별 단계(S320)로 이행 */
checkGarbage(erased, null);
}
}
기반 변수 변경 정보처리(S311)
본 발명의 실시예에 따른 기반 변수 변경 처리 단계(S311)에서는, 아래의 수도 코드와 같이 관련 객체의 기반 참조수를 변경한다. 또한, 관련 객체 중 순환 참조 노드에 속한 객체가 있는 경우, 해당 객체의 기반 참조수가 0 이상인가를 검사하여 해당 순환 참조 노드의 기반 객체수를 변경한다.
참조 증가 객체(211)의 기반 참조수(311)가 0에서 1로 증가하고, 참조 증가 객체(211)가 순환 참조 노드에 소속된 경우, 해당 순환 참조 노드(430)의 기반 객체수(431)를 증가한다.
또한, 참조 감소 객체(212)의 기반 참조수(311)를 감소하고, 참조 감소 객체(212)가 순환 참조 노드에 소속된 경우, 해당 순환 참조 노드(430)의 기반 객체수(431)를 감소한다.
이를 수도 코드로 구체적으로 표현하면 아래와 같다.
static void onReplaceRootVariable(
GCObject assigned, /* 참조 증가 객체(211) */
GCObject erased /* 참조 감소 객체(212) */
) {
if (assigned != null) {
if (assigned.rootRefCount++ == 0 && assigned.refNode.isCyclic()) {
/* 순환 참조 노드의 기반 객체수(431) 변경 */
((CyclicNode) assigned.refNode).rootObjectCount++;
}
}
if (erased != null) {
if (--erased.rootRefCount == 0 && erased.refNode.isCyclic()) {
/* 순환 참조 노드의 기반 객체수(431) 변경 */
((CyclicNode) erased.refNode).rootObjectCount--;
}
}
}
멤버 변수 변경 정보 처리(S312)
본 발명의 실시예에 따른 멤버 변수 변경 처리 단계(S312)에서는 아래의 수도 코드와 같이 관련 객체의 외부 객체 참조수(312)와 관련 객체가 속한 참조 노드(313)의 외부 참조자 목록(411)을 변경한다. 또한 순환 참조 검사가 필요한 객체를 선별하여 참조 노드 정보(320)의 경로 검사 객체 목록(321)에 추가한다. 순환 참조 검사는 비교적 시간이 오래 걸리는 작업이므로, 그 실행 회수를 꼭 필요한 경우에 한정하여 실행하는 것이 바람직하다. 본 실시예는 순환 참조 여부 검사 회수를 최소화하기 위하여 아래와 같이 특정 조건을 검사하여 이에 해당하는 경우에만 참조 노드 보정 정보(320)의 경로 검사 객체 목록(321)에 추가한다.
1) 객체가 속한 참조 노드의 외부 참조자수가 감소하였으나, 그 결과 값이 0보다 큰 경우에는 다른 참조 객체가 존재하는 것이므로, 해당 객체를 참조 노드 보정 정보(320)의 경로 검사 객체 목록(321)에 추가한다.
2) 외부 참조자 목록(411)의 크기가 0인 참조 노드에 속한 객체 A를 외부 참조자 목록(411)의 크기가 0보다 큰 참조 노드에 속한 객체 B의 멤버 변수에 저장할 때, 객체 A를 경로 검사 객체 목록(321)에 추가한다. 더욱 바람직하게는 상기 객체 A가 하나 이상의 순환 참조 가능 객체를 참조하고 있을 가능성이 있는 경우에 한하여 객체 A를 참조 노드 보정 정보(320)의 경로 검사 객체 목록(321)에 추가한다
상기 조건에 의해 선별하여 경로 검사 객체 목록에(321)에 추가된 객체들은, 이 후 참조 노드 관리부(112)를 비동기적으로 수행하는 과정에서 순환 참조 노드를 탐지(S340)하기 위하여 사용된다.
참고로, 기존의 혼합형 방식은 외부 객체 참조수 뿐 아니라 기반 참조수 감소 시에도 순환 참조 검사 및 가비지 검사를 요청하는 것과 달리 본 실시예에서는 상기와 같이 특정 조건에 맞는 객체 간 참조 관계 변경 시에만 순환 참조 검사를 요청함으로써 순환 참조 검사를 더 적은 회수로 실행할 수 있다. 순환 참조 검사 필요성을 판단하는 조건은 본 예시에 한정되지 않으며, 보다 정교한 조건을 통해 순환 참조 검사가 필요한 객체나 참조 노드를 선별함으로써 가비지 컬렉터의 실행 효율성을 높일 수 있다.
본 실시예에 따른 단계 S312를 수도코드로 표현하면 아래와 같다.
static void onReplaceMemberVariable(
GCObject assigned, /* 참조 증가 객체(211) */
GCObject erased, /* 참조 감소 객체(212) */
GCObject owner /* 참조자 객체(213) */
) {
if (assigned != null && assigned != owner) {
assigned.exteranlM emberRefCount++;
if (owner.refNode == ISOLATED_NODE) {
// 참조자 객체(213)가 새로 생성된 객체이면, 단방향 참조 노드를 할당한다.
owner.refNode = new OneWayNode();
}
// 참조자 객체(213)와 참조 증가 객체(211)가 서로 다른 참조 노드에 속한 경우,
if (assigned.refNode != owner.refNode) {
if (assigned.refNode == ISOLATED_NODE) {
/* 참조 증가 객체(211)가 새로 생성된 객체이면, 단방향 참조 노드를 할당한다.*/
assigned.refNode = new OneWayNode();
} else if (assigned.refNode.externalReferrerList.size() == 0 &&
owner.refNode.externalReferrerList.size() > 0) {
/* 순환 참조 검사가 필요한 객체를 선별하여 경로 검사 객체 목록(321)에 추가 */
gCyclicTestObjectSet.add(assigned);
}
/* 참조 증가 객체(211)가 속한 참조 노드(313)의 외부 참조자 목록(411)에
* 참조자 객체(213)을 추가한다. */
assigned.refNode.externalReferrerList.add(owner);
}
}
if (erased != null && erased != owner) {
erased.externalM emberRefCount--;
if (erased.refNode != owner.refNode) {
/* 참조자 객체(213)와 참조 감소 객체(212)가 서로 다른 참조 노드에 속한 경우,
* 참조 감소 객체(211)가 속한 참조 노드(313)의 외부 참조자 목록(411)에서
* 참조자 객체(213)을 삭제한다. */
erased.refNode.externalReferrerList.remove(owner);
if (erased.refNode.externalReferrerList.size() > 0) {
/* 순환 참조 검사가 필요한 객체를 선별하여 경로 검사 객체 목록(321)에 추가 */
gCyclicTestObjectSet.add(erased);
}
}
}
}
(b) 참조수 기반 가비지 판별 단계(S320)
도 8은 본 발명의 다른 실시예에 따른 참조수 기반 가비지 판별 단계를 나타내는 순서도이다. 도 9는 도 8의 실시예에 따른 참조수 기반 가비지 판별이 가능한 가비지 객체 및 가비지 참조 노드 발생의 예를 나타내는 도면이다.
도 8을 참조하면, 참조수 기반 가비지 판별 단계(S320)는 가비지 객체 판별 단계(S321), 가비지 참조 노드 판별 단계(S322), 순환 참조 노드 내부 가비지 검사 필요성 판별 단계(S323), 순환 참조 내부 가비지 검사를 위한 정보 생성 단계(S324) 및 가비지 처리 요청 단계(S325)를 포함한다. 각 단계에 대해 상세히 설명한다.
본 실시예에 따른 가비지 객체 판별 단계(S321)에서는, 참조 감소 객체(213)의 총 외부 참조수가 0인가를 검사하여 가비지 여부를 판별한다. 구체적으로 참조 감소 객체(213)의 기반 참조수(311)와 외부 객체 참조수(312)의 크기가 모두 0인 경우, 참조 감소 객체(213)를 가비지로 판별한다. 참조 감소 객체(213)가 가비지로 판별될 시 가비지 처리 요청 단계 (S325)로 이행하여 가비지 처리부에 해당 객체에 대한 가비지 처리를 요청한다.
본 실시예에 따른 가비지 참조 노드 판별 단계(S322)에서는, 참조 감소 객체(213)가 속한 참조 노드의 총 외부 참조수 정보를 검사하여 가비지 여부를 판단한다. 구체적으로, 참조 감소 객체(213)가 순환 참조 노드에 속한 경우, 순환 참조 노드(430)의 외부 참조자 목록(411)의 크기와 기반 객체수(431)가 모두 0인 경우, 해당 순환 참조 노드를 가비지 참조 노드로 판별한다. 이는 해당 순환 참조 노드에 속한 객체 중 기반 참조수가 1 이상인 객체가 존재하지 않으며, 해당 순환 참조 노드에 속한 객체 중 외부 객체로부터 참조되는 객체가 전혀 없음을 의미한다. 참조 감소 객체(213)가 속한 순환 참조 노드가 가비지로 판별될 시 가비지 처리 요청 단계 (S325)로 이행하여 해당 참조 노드에 속한 모든 객체에 대한 가비지 처리를 요청하고 종료 단계로 이행한다.
본 실시예에 따른 순환 참조 내부 가비지 검사를 위한 정보 생성 단계(S324) 에서는 참조자 객체(214)와 참조 감소 객체(213)가 동일한 순환 참조 노드에 속한 경우, 참조 감소 객체를(213)의 해당 순환 참조 노드의 가비지 검사 객체 목록(432)에 등록하고, 해당 순환 참조 노드를 훼손된 순환 참조 노드 목록(322)에 등록한다. 순환 참조 노드 내부의 일부 순환 경로가 단절된 경우, 해당 순환 참조 노드 내부의 일부 또는 모든 순환 경로가 해제되거나 참조 감소 객체(213)를 포함한 일부 객체가 가비지 상태로 변경되었을 가능성이 있다. 이에 상기와 같이 참조 노드 보정 정보(320)을 갱신하고, 이후 순환 참조 노드 내부 가비지 컬렉션 단계에서 해당 순환 참조 노드 내부에 대한 가비지 컬렉션 및 참조 노드 재생성 작업(S330)을 실행하도록 한다.
상기 참조수 기반 가비지 판별 과정을 수도 코드로 표현하면 아래와 같다.
static void checkGarbage( // 단계 S320
GCObject erased, /*참조 감소 객체(212) */
GCObject owner /*참조자 객체(213) */
) {
/* 가비지 객체 판별 단계(S321) */
if (0 == erased.rootRefCount + erased.externalM emberRefCount) {
/* 객체의 총 외부 참조수가 0 이면, 해당 객체에 대한 가비지 처리 요청 */
requestReclaimObject(erased, null);
}
/* 가비지 참조 노드 판별 단계(S322) */
else if (erased.refNode.isCyclic()) {
CyclicNode cyclicNode = (CyclicNode)erased.refNode;
if (cyclicNode.rootObjectCount +
cyclicNode .externalReferrerList.size() == 0) {
/* 순환 참조 노드의 총 외부 참조수가 0이면,
* 순환 참조 노드에 속한 모든 객체에 대한 가비지 처리 요청. */
requestReclaimObject(erased, cyclicNode);
}
/* 순환 참조 노드 훼손 판별 단계 (S323) */
else if (owner != null && cyclicNode == owner.refNode) {
/* S424 순환 참조 노드 내부 가비지 검사를 위한 정보 생성 단계
* 참조 감소 객체(212)를 가비지 검사 객체 목록(432)에 등록한다. */
cyclicNode.garbageTestObjectSet.add(erased);
/* 훼손된 순환 참조 노드 목록(322)에 순환 참조 노드를 추가한다. */
gDamagedCyclicNodeSet.add(cyclicNode);
}
}
}
본 실시예에 따른 가비지 처리 요청 단계 (S325)는 가비지 처리부(113)에 가비지 처리 단계(S350)의 수행을 요청한다. 본 실시 예에서는 가비지 처리 요청과 동시에 가비지 처리부(113)가 가비지 처리를 수행하는 것으로 가정한다. 단, 실제 구현 시에는 참조 정보 변경 단계의 처리 속도를 높이기 위하여 가비지 처리 요청과 가비지 처리 과정을 별도의 쓰레드로 나누어 비동기적으로 구현하는 것도 가능하다.
static void requestReclaimObject(GCObject garbage, GCNode garbageNode) { // 단계S325
/* 가비지 처리 단계 (S530) 로 이행*/
reclaimObject(garbage, garbageNode);
}
도 10은 본 발명의 실시예에 따른 참조 노드 관리부(112)에서 수행하는 순환 참조 노드 내부 가비지 컬렉션(S330)과 순환 참조 노드 탐지 단계(S340)를 나타내는 순서도이다. 참조 노드 관리부(112)는 참조 정보 관리부(111)가 생성한 참조 노드 보정 정보(320)를 참조하여 순환 참조 노드 내부의 변경 사항 처리 및 새로 발생한 순환 참조 노드를 탐지하는 작업을 수행한다. 해당 작업들은 참조 정보 변경 작업에 비하여 비교적 시간이 오래 걸리는 작업이므로 별도의 쓰레드에서 비동기적으로 수행하는 것이 바람직하다.
(c) 순환 참조 노드 내부 가비지 컬렉션 단계(S330)
도 11은 도 10의 실시예에 따른 순환 참조 노드 내부 가비지 컬렉션이 필요한 가비지 객체 발생의 예를 나타내는 도면이다.
도 11을 참조하면, 객체-4와 객체-5의 참조 연결이 단절되면, 객체-5와 객체-6을 경유하는 작은 순환 경로에 속한 객체들은 해당 노드를 참조하는 외부 참조가 없으므로 가비지 처리가 필요함을 알 수 있다. 그러나 객체-4와 객체-5를 연결하는 화살표가 삭제되어도 객체-5를 비롯하여, 속이 채워진 원으로 표시된 모든 객체들은 모두 각 객체를 가리키는 화살표를 1 개 이상 가지고 있으므로, 즉 총 외부 참조수가 1 이상이므로, 참조수 계산 방식만으로는 해당 객체에 대한 가비지 판별이 불가능하다.
이처럼 순환 참조 노드 내에서 일부 순환 경로의 단절이 발생하여, 순환 노드가 해제되거나 그 내부의 일부 객체가 가비지 객체로 변경된 경우, 해당 순환 참조 노드에 속한 객체들의 참조 노드를 재구성하고, 추가적인 가비지 컬렉션 기능을 수행할 필요가 있다.
본 실시예에 따른 단계 S330은 아래의 수도 코드와 같이 참조 노드 보정 정보 (320)의 훼손된 순환 참조 노드 목록(322)에 포함된 순환 참조 노드 정보(430)를 순차적으로 취하여, 해당 순환 참조 노드에 대한 가비지 컬렉션 작업을 수행한다. 훼손된 순환 참조 노드는 가비지 컬렉션 수행 후 폐기된다.
static void collectGarbageInCyclicNodes() { // 단계 S330
/* 훼손된 순환 참조 목록(322)에 포함된 각 객체에 대하여, */
for (CyclicNode expiredNode : gDamagedCyclicNodeSet) {
/* 객체 추적 및 마킹 단계(S331)를 수행한다.*/
traceAndMarkObjectsInCyclicNode(expiredNode);
/* 내부 가비지 처리 단계(S332)를 수행한다.*/
clearGarbageObjectsInCyclicNode(expiredNode);
}
/* 훼손된 순환 참조 목록(322)을 비운다.*/
gDamagedCyclicNodeSet.clear();
}
도 11을 다시 참조하면, 객체-4와 객체-5의 참조 연결이 단절됨으로 인해 객체-2와 객체-4를 경유하던 순환 경로-3이 단절되고 또한 객체-5와 객체-6을 경유하는 순환 경로-2에 속한 객체들이 모두 가비지 객체로 변경된 상태를 보여준다. 순환 참조 노드 내부 가비지 컬렉션 단계는 훼손된 순환 참조 노드에 속한 객체들을 추적하여 각 객체들의 순환 참조 여부를 다시 판별하고 이에 따라 해당 객체들의 소속 참조 노드를 새로운 참조 노드로 변경하는 객체 추적 및 마킹 단계(S331)를 수행하고, S331 단계에서 마킹 되지 않은 객체들을 가비지 처리 하는 단계(S332)를 수행함으로써 순환 경로 단절로 인해 발생한 가비지 발생과 순환 참조 상태 변경을 처리한다.
본 발명의 바람직한 실시예에 따른 역방향 경로 정보, 즉 외부 참조자 목록(411)은 객체가 아닌 참조 노드 단위로 저장한다. 이는 역방향 경로 정보를 저장하기 위한 메모리 공간을 절약하기 위한 것이다. 이로 인해 본 발명의 바람직한 실시예에 따라 구성된 순환 참조 노드 내부의 객체에 대해선 역방향 경로 추적이 불가능하고, 순방향 경로 추적만이 가능하다.
본 실시예에 따른 객체 추적 및 마킹 단계(S331)에서는 참조 변수 추적방식을 이용하여 훼손된 순환 참조 노드에 속한 객체들을 추적하여 가비지 객체가 아님을 마킹한다. 구체적으로 훼손된 순환 참조 노드에 속한 객체들의 객체 참조 멤버 변수에 저장된 객체의 주소를 연속적으로 추적하면서 각 객체의 순환 참조 여부를 다시 판별하고, 그 결과에 따라 해당 객체의 소속 참조 노드를 새로운 참조 노드로 변경함으로써 가비지 객체가 아님을 마킹한다. 추적 및 마킹 단계(S331) 종료 이후에도 훼손된 참조 노드에 속한 객체는 추적 불가능한 객체 즉, 가비지 객체에 해당한다.
객체 추적 중 순환 참조 여부를 판별하고, 가비지 여부를 표시하기 위하여 각 객체의 상태를 아래의 4가지로 구분한다.
enum TraceState {
NOT_TRACED, // 미추적 상태 또는 가비지 상태
IN_TRACING, // 추적 중 상태
TRACE_FINISHED, // 추적 완료 상태
OUT_OF_TRACING_NODE // 추적 대상이 아님.
}
static TraceState getTraceState(
GCObject obj, /*검사 객체*/
CyclicNode expiredNode /* 훼손된 순환 참조 노드*/
) {
if (obj.refNode == expiredNode) {
/* 검사 객체의 소속 참조 노드(313)가 훼손된 순환 참조 노드와 일치하는 경우,
* 해당 객체에 대한 추적 작업이 시작되지 않은 상태이다. 참고로 가비지 객체는
* 모든 추적이 종료된 후에도 NOT_TRACED 상태를 가진다. */
return TraceState.NOT_TRACED;
}
else if (obj.refNode == TRACING_NODE) {
/* 검사 객체의 소속 참조 노드(313)가 TRACING_NODE와 일치하는 경우,
* 해당 객체에 대한 추적 작업이 시작되었으나 아직 완료되지 않은 상태이다. */
return TraceState.IN_TRACING;
}
else if (expiredNode.tracedNodeList.contains(obj.refNode)) {
/* 검사 객체의 소속 참조 노드(313)가 훼손된 순환 참조 노드의 추적 완료 노드 목록(433)에
* 포함된 경우, 해당 객체에 대한 추적 작업이 완료된 상태이다. */
return TraceState.TRACE_FINISHED;
}
else {
/* 위 3가지 조건에 맞지 않는 것은 추적 대상이 아닌 객체이다 */
return TraceState.OUT_OF_TRACING_NODE;
}
}
본 실시예에 따른 객체 추적 및 마킹 단계(S331)에서는 아래의 수도 코드와 같이 순환 참조 노드의 외부 참조자 목록(411)에 포함된 각 객체와 가비지 검사 객체 목록(432)에 포함된 각 객체를 기점으로 객체 참조 변수를 추적하여 가비지가 아닌 객체의 소속 참조 노드를 새로운 참조 노드로 변경함으로써, 해당 객체가 가비지가 아님을 마킹 한다.
static void traceAndMarkObjectsInCyclicNode( // S331
final CyclicNode expiredNode /*훼손된 순환 참조 노드*/
) {
new Runnable() {
/* 추적 객체 목록 */
Vector<GCObject> tracingList = new Vector<>();
public void run() {
/* 외부 참조자 목록(411)에 포함된 객체의 참조자-피참조자 경로 중
* 훼손된 순환 참조 노드에 속한 객체를 선별하여 참조 노드 재생성 작업을 실행한다. */
for (GCObject foreign : expiredNode.externalReferrerList) {
traceSubGraphInCyclicNode(foreign);
}
/* 가비지 검사 객체 목록에 포함된 객체 및 해당 객체의 참조 경로에 속한 객체 중
* 기반 참조수가 1 이상이고, 훼손된 참조 노드에 속한 객체를 선별하여 참조 노드
* 재생성 작업을 실행한다. */
for (GCObject obj : expiredNode.garbageTestObjectSet) {
traceAndMarkRootObjects(obj);
}
}
void traceAndMarkRootObjects(GCObject obj) {
if (getTraceState(obj, expiredNode) == TraceState.NOT_TRACED) {
if (obj.rootRefCount > 0) {
traceSubGraphAndReplaceNodeInCyclicNode(obj);
expiredNode.tracedNodeList.add(obj.refNode);
}
else {
for (GCObject referent : Runtime.getReferents(obj)) {
traceAndMarkRootObjects(referent);
}
}
}
}
void traceSubGraphAndReplaceNodeInCyclicNode(GCObject tracingObj /*추적 객체*/) {
/* 추적할 객체의 상태를 추적 중 상태로 변경하고, 추적 객체 목록에 추가하다. */
tracingObj.refNode = TRACING_NODE;
tracingList.add(tracingObj);
/* 추적 객체의 참조자-피참조자 경로를 추적하여 마킹 작업을 재귀적으로 수행한다. */
traceSubGraphInCyclicNode(tracingObj);
/* 추적 객체가 순환 참조노드에 속하지 않은 경우, 단방향 참조 노드 할당. */
if (tracingObj.refNode == TRACING_NODE) {
tracingObj.refNode = new OneWayNode();
expiredNode.tracedNodeList.add(tracingObj.refNode);
}
}
void traceSubGraphInCyclicNode(GCObject tracingObj /*추적 객체*/) {
/* 현재 추적 위치를 저장한다.*/
int tracingPos = tracingList.size();
/* 객체의 피참조자를 순차적으로 취하여 아래의 과정을 처리한다. */
for (GCObject referent : Runtime.getReferents(tracingObj)) {
switch(getTraceState(referent, expiredNode)) {
case NOT_TRACED: // 추적되지 않은 피참조자 객체
/* 참조 노드 재구성 작업을 재귀적으로 수행. */
traceSubGraphAndReplaceNodeInCyclicNode(referent);
if (referent.refNode != tracingObj.refNode) {
/* 추적 객체와 referent를 경유하는 순환 경로가 발견되지 않은 경우,
* 추적 객체 목록에서 referent를 삭제하고, referent가 속한 참조
* 노드(313)의 외부 참조자 목록(411)에 추적 객체를 추가한다. */
tracingList.setSize(tracingPos);
referent.refNode.externalReferrerList.add(tracingObj);
}
break;
case IN_TRACING: // 순환 참조된 피참조자 객체 발견.
/* referent 와 referent 이후에 추적 객체 목록에 추가된 객체들을 경유하는
* 순환 경로가 발견되었다. 해당 객체들의 소속 참조 노드(313)를
* 순환 참조 노드로 변경한다.*/
int cyclic_start = tracingList.indexOf(referent);
CyclicNode cyclicNode = new CyclicNode();
for (GCObject cyclicObj :
tracingList.subList(cyclic_start, tracingList.size())) {
addCyclicObject(cyclicObj, cyclicNode);
}
expiredNode.tracedNodeList.add(cyclicNode);
break;
case TRACE_FINISHED: // 추적 작업을 완료한 피참조자 객체
/* referent 가 속한 참조 노드(313)의 외부 참조자 목록(411)에
* 현재 추적 객체를 추가한다. */
referent.refNode.externalReferrerList.add(tracingObj);
break;
case OUT_OF_TRACING_NODE: // 추적 대상이 아닌 피참조자 객체
break;
}
}
}
}.run();
}
본 실시예에 따른 순환 참조 노드 내부 가비지 처리 단계(S332)에서는 아래와 같이 훼손된 순환 참조 노드의 가비지 검사 객체 목록(432)에 포함된 객체 중 소속 참조 노드가 변경되지 않은 객체, 즉 추적되어 마킹 되지 않은 NOT_TRACED 상태의 객체를 선별하여 가비지 처리부(113)에 가비지 처리를 요청한다. 본 실시예에 따르면, S332 단계 이후에 훼손된 순환 참조 노드는 폐기된다. 즉, S332 단계 이후엔 훼손된 순환 참조 노드에 속한 객체는 존재하지 않게 된다.
static void clearGarbageObjectsInCyclicNode( // S332
CyclicNode expiredNode /* 훼손된 순환 참조 노드 */
) {
/* 가비지 검사 객체 목록(432)에 포함된 객체를 순차적으로 취하여, */
for (GCObject obj : expiredNode.garbageTestObjectSet) {
if (getTraceState(obj, expiredNode) == TraceState.NOT_TRACED) {
/* 가비지 검사 객체가 마킹 되지 않았으면, 해당 객체 및 해당 객체의 참조자-피참조자
* 경로 중 마킹 되지 않은 객체들에 대한 가비지 처리를 요청한다. */
GCObject.reclaimObject(obj, expiredNode);
}
}
}
(d) 순환 참조 노드 탐지 및 처리 단계(S340)
본 실시예에 따른 단계 S340은 아래의 수도 코드와 같이 참조 노드 보정 정보(320) 중 경로 검사 객체 목록(321)에 포함된 객체를 순차적으로 취하여, 해당 객체를 기점으로 순환 참조 노드 탐지 및 처리 작업을 실행한다.
static void detectCyclicReferences() { // S340
/* 경로 검사 객체 목록(321)에 포함된 객체에 대하여, */
for (GCObject obj: gCyclicTestObjectSet) {
/* 순환 참조 노드 탐지 단계(341)를 수행한다. */
detectCyclicNodes(obj, new Vector());
/* 순환 참조 노드 가비지 판별 및 처리 단계( S342)를 수행한다. */
checkCyclicGarbage(obj); // S342
}
/* 경로 검사 객체 목록(321)을 비운다. */
gCyclicTestObjectSet.clear();
}
본 실시예에 따른 순환 참조 노드 탐지 단계(S341)는 참조 노드의 외부 참조자 목록(411) 정보를 이용하여 역방향 참조 경로를 추적하여 순환 참조 관계로 상호 연결된 객체들의 소속 참조 노드(313)를 순환 참조 노드로 변경하는 작업을 수행한다..
순환 참조 노드에 속한 객체는 해당 객체로부터 출발하여 해당 객체로 되돌아오는 순환 경로를 하나 이상 가진다. 이를 판별하기 위하여 순방향 참조 경로(referrer-referent reference graph) 를 탐색하는 경우엔 수많은 잔가지의 끝까지 경로를 탐색해야만 하므로 많은 시간이 걸리나, 가지에서 뿌리 쪽을 향하는 역방향 참조 경로(referent-referrer reference graph)를 탐색하면 탐색 범위를 크게 줄일 수 있어 탐색 시간을 절약할 수 있다. 아울러 다수의 객체를 참조 노드로 그룹화하여 참조 경로를 단순화하면 탐색 속도를 더욱 높일 수 있다. 도 6b는 도 6a에 표시된 객체간 참조 경로를 참조 노드 간 참조 경로로 치환한 상태를 보여주는 것으로, 도 6b의 화살표를 역방향으로 탐색하는 것이 참조 노드 단위 역방향 참조 경로 탐색에 해당한다.
본 발명의 바람직한 실시예에 따르면, 참조 노드 단위로 외부 참조자 목록(411) 정보를 구성하고, 이를 바탕으로 빠르게 역방향 참조 경로를 탐색하여 순환 참조 발생 여부를 빠르게 판별할 수 있다.
순환 참조 노드를 탐지하는 과정은 미로를 탈출하기 위해서 지나는 경로 마다 표식을 하면서 걷는 것과 유사하다. 이미 표식이 된 경로인가를 확인하여 예전 장소로 다시 되돌아왔는가, 즉 순환 경로가 발생했는가를 판별할 수 있다. 단계S341에서는 각 참조 노드를 추적할 때 마다 해당 참조 노드의 추적 상태를 변경함으로써, 상기 표식 과정을 처리한다. 아울러 추적 중인 경로에 속한 객체를 '추적 목록'(tracingList)에 포함시키고 순환 경로 발생 판별과 동시에 추적 목록에 포함된 순환 참조 객체를 취하여 순환 참조 노드로 변경하는 것이 가능하도록 하였다.
본 발명의 실시예에 따른 단계 S341에서는, 아래의 수도 코드와 같이 경로 검사 객체 목록(321)에 포함된 객체를 기점으로, 객체가 속한 참조 노드(313)의 외부 참조자 목록(411)에 포함된 객체를 연속적으로 추적하여, 순환 참조 관계로 연결된 참조 노드들을 탐지하고, 순환 참조 관계로 연결된 참조 노드들에 속한 객체들의 소속 참조 노드(313)를 새로운 순환 참조 노드로 변경하는 작업을 수행한다.
static void detectCyclicNodes( // S341
GCObject tracingObj /*추적 객체*/,
Vector<GCObject> tracingList /*추적 객체 목록*/
) {
/* 추적 객체의 소속 참조 노드(313)의 추적 상태(412)를 '추적 중'으로 변경하고,
* 추적 목록에 추가한다. */
tracingObj.refNode.traceState = TraceState.IN_TRACING;
tracingList.add(tracingObj);
/* 추적 중인 참조 노드의 외부 참조자 목록(411)에 포함된 참조자들을 순차적으로 취하여, */
for (GCObject referrer : tracingObj.refNode.externalReferrerList) {
switch (referrer.refNode.traceState) {
case NOT_TRACED: // 추적되지 않은 참조 노드
/* 외부참조자에 대한 역방향 추적을 재귀적으로 수행한다. */
detectCyclicNodes(referrer, tracingList);
if (tracingObj.refNode != referrer.refNode) {
// tracingObj와 referent 를 경유하는 순환 경로가 발견되지 않은 경우
referrer.refNode.traceState =TraceState.TRACE_FINISHED;
tracingList.remove(referrer);
// 발견된 순환 참조 노드가 가비지인가를 검사한다.
checkCyclicGarbage(referrer);
}
break;
case IN_TRACING: // 순환 경로 발견
/* 추적 객체와 referent 객체가 속한 참조 노드를 경유하는 순환 경로가 발견되었다.
* 추적경로에 포함된 참조 노드들을 하나의 순환 참조 노드로 병합한다. */
int cyclic_start = 0;
for (; cyclic_start < tracingList.size(); cyclic_start ++) {
if (tracingList.get(cyclic_start).refNode == referrer.refNode) break;
}
CyclicNode cyclicNode = new CyclicNode();
for (GCObject cyclicObj :
tracingList.subList(cyclic_start, tracingList.size())) {
addCyclicObject(cyclicObj, cyclicNode);
}
cyclicNode.traceState = TraceState.IN_TRACING;
tracingList.setSize(cyclic_start + 1);
break;
case TRACE_FINISHED: // 이미 추적된 참조 노드
break;
}
}
}
가비지 컬렉터의 효율적 실행을 위해서, 순환 참조 노드 탐지 작업 실행 회수를 최소화하는 것이 바람직하다. 본 발명의 바람직한 실시예에 따르면 순환 참조 검사가 반드시 필요하다고 판단되는 시점까지 최대한 순환 참조 노드에 대한 탐지 작업을 늦추어 수행하는 것이 가능하다. 이에, 단계 S342에서 탐지된 순환 참조 노드는 이미 가비지 상태일 수 있다.
본 실시예에 따른 순환 참조 노드 가비지 판별 및 처리 단계(S342)에서는, 단계 S341에서 순환 참조 노드가 발견된 경우, 해당 노드가 가비지 노드인가를 검사하고, 가비지 순환 참조 노드로 판별된 경우, 단계 S350의 가비지 처리 절차를 수행한다.
static void checkCyclicGarbage( // 단계 S342
GCObject obj /* 검사 객체 */
) {
if (obj.refNode.isCyclic()) {
/* 검사 객체가 순환 참조 노드에 속한 경우, 해당 순환 참조 노드의 가비지 여부 판별 */
CyclicNode cyclicNode = (CyclicNode)obj.refNode;
if (cyclicNode.rootObjectCount +
cyclicNode.externalReferrerList.size() == 0) {
GCObject.reclaimObject(obj, cyclicNode );
}
}
}
아래는 본 실시예에 따른 S331 단계와 S341 단계 수행 시 발견된 순환 참조 객체를 순환 참조 노드(430)에 추가하는 함수에 대한 수도 코드이다. 순환 참조 노드(430)에 새로운 객체를 추가하면, 아래의 수도 코드와 같이 해당 객체의 참조 정보에 따라 순환 참조 노드의 기반 객체수(431), 외부 참조자 목록(411) 등을 변경한다.
static void addCyclicObject(
GCObject rookie, /* 추가 객체*/
CyclicNode cycilcNode /* 순환 참조 노드 */
) {
if (rookie.refNode == cycilcNode) return;
/* 객체의 소속 참조 노드 변경 */
GCNode oldNode = rookie.refNode;
rookie.refNode = cycilcNode;
if (oldNode.isCyclic()) {
/* 두 개의 순환 참조 노드를 병합한다. */
CyclicNode oldCyclicNode = (CyclicNode)oldNode;
// 순환 참조 노드의 기반 객체수(431) 변경.
cycilcNode.rootObjectCount += oldCyclicNode.rootObjectCount;
/* 추가 객체 및 해당 객체와 동일한 순환 참조 노드에 속한 객체들의 소속 참조구간을
* 새로운 새로운 순환 참조 노드로 변경한다. */
new Object() {
void mergeIntoNewCyclicRegion(GCObject obj) {
obj.refNode = cycilcNode;
for (GCObject referent : Runtime.getReferents(obj)) {
if (referent.refNode == oldCyclicNode) {
mergeIntoNewCyclicRegion(referent);
}
}
}
}.mergeIntoNewCyclicRegion(rookie);
}
else {
/* 순환 참조 노드의 기반 객체수(431) 변경. */
if (rookie.rootRefCount > 0) {
cycilcNode.rootObjectCount ++;
}
}
/* 순환 참조 노드의 외부 참조자 목록(411)을 변경한다. */
for(GCObject referrer : oldNode.externalReferrerList) {
if (referrer.refNode != cycilcNode) {
cycilcNode.externalReferrerList.add(referrer);
}
}
if (cycilcNode.externalReferrerList.contains(rookie)) {
cycilcNode.externalReferrerList.remove(rookie);
}
}
(e) 가비지 처리 단계(S350)
본 실시예에 따른 가비지 처리부(113)는 가비지 객체 또는 가비지로 판단된 참조 노드에 속한 모든 객체에 대하여 아래와 같이 가비지 처리 절차를 실행한다.
1) 응용 프로그램 언어에 따라 객체 삭제 전 필요 절차 등을 실행한다.
2) 가비지 객체의 피참조자를 순차적으로 취하여, 구체적으로 가비지 객체의 멤버 변수에 그 주소가 저장된 객체를 순차적으로 취하여, 해당 피참조자의 외부 참조자 목록에서 가비지 객체를 삭제하고, 해당 피참조자에 대한 가비지 검사 및 처리를 먼저 수행한다.
3) 가비지 객체에 할당된 메모리를 해제하여 재사용 가능하도록 한다.
상기 가비지 처리 과정을 수도 코드로 나타내면 아래와 같다.
static void reclaimObject(
GCObject garbage, /* 가비지 객체 */
GCNode garbageNode /* 가비지 참조 노드 */
) {
/* 응용 프로그램 언어별로 정해진 삭제 전 사전 작업을 실행한다. */
if (!Runtime.prepareReclaimObject(garbage)) return;
/* 가비지 처리 중인 객체임을 표시한다. */
garbage.refNode = GARBAGE_NODE;
/*garbage 객체가 참조하는 피참조자 객체를 순차적으로 취하여 아래의 작업을 수행한다. */
for (GCObject referent : Runtime.getReferents(garbage)) {
if (garbageNode != null && referent.refNode == garbageNode) {
/* 동일한 참조 노드에 속한 다른 객체들에 대한 가비지 처리를 먼저 수행*/
reclaimObject(referent, garbageNode);
}
else if (referent.refNode != GARBAGE_NODE) {
/* 가비지 객체와 피참조자의 연결을 해제한다. 즉 가비지 객체의 피참조자에 대한
* 가비지 판별 및 가비지 처리를 먼저 수행한다. */
onReplaceMemberVariable(null, referent, garbage);
}
}
/* 객체에 할당된 메모리를 해제한다.*/
Runtime.deallocObject(garbage);
}
본 발명의 다양한 실시예에 따른 방법은 다양한 컴퓨터 수단을 통하여 수행될 수 있는 프로그램 명령 형태로 구현되어 컴퓨터 판독 가능 매체에 기록될 수 있다. 상기 컴퓨터 판독 가능 매체는 프로그램 명령, 데이터 파일, 데이터 구조 등을 단독으로 또는 조합하여 포함할 수 있다. 상기 매체에 기록되는 프로그램 명령은 본 발명을 위하여 특별히 설계되고 구성된 것들이거나 컴퓨터 소프트웨어 당업자에게 공지되어 사용 가능한 것일 수도 있다. 컴퓨터 판독 가능 기록 매체의 예에는 하드 디스크, 플로피 디스크 및 자기 테이프와 같은 자기 매체(magnetic media), CD-ROM, DVD와 같은 광기록 매체(optical media), 플롭티컬 디스크(floptical disk)와 같은 자기-광 매체(magneto-optical media), 및 롬(ROM), 램(RAM), 플래시 메모리 등과 같은 프로그램 명령을 저장하고 수행하도록 특별히 구성된 하드웨어 장치가 포함된다. 프로그램 명령의 예에는 컴파일러에 의해 만들어지는 것과 같은 기계어 코드뿐만 아니라 인터프리터 등을 사용해서 컴퓨터에 의해서 실행될 수 있는 고급 언어 코드를 포함한다.
이상에서 본 발명의 실시예에 대하여 상세하게 설명하였지만 본 발명의 권리범위는 이에 한정되는 것은 아니고 다음의 청구범위에서 정의하고 있는 본 발명의 기본 개념을 이용한 당업자의 여러 변형 및 개량 형태 또한 본 발명의 권리범위에 속한다.
110: 가비지 컬렉터
111: 참조 정보 관리부
112: 참조 노드 관리부
113: 가비지 처리부
120: 연산 처리부
130: 메모리부

Claims (18)

  1. 객체 참조 변수(object reference variable)의 값(value)이 변경된 경우에,
    상기 변경과 관련된 객체 또는 참조 노드 별로 역방향 참조 경로 탐색을 위한 정보를 변경하는 참조 정보 변경 단계(S310);
    객체 또는 참조 노드의 역방향 참조 경로를 추적하여, 순환 참조 관계로 연결된 둘 이상의 객체를 포함하는 순환 참조 노드를 탐지하는 순환 참조 탐지 단계(S340);
    를 포함하는 가비지 컬렉션 방법.
  2. 제 1항에 있어서,
    상기 참조 정보 변경 단계(S310)에서는,
    상기 변경과 관련된 상기 객체 및 참조 노드의 참조수 정보를 변경하는 것을 특징으로 하고,
    참조수 계산법을 기반으로 상기 객체 및 참조 노드의 가비지 여부를 판별하는 참조수 기반 가비지 판별 단계(S320);
    를 더 포함하는 것을 특징으로 하는 가비지 컬렉션 방법.
  3. 제 2항에 있어서,
    순환 참조 노드에 속한 객체들에 한정하여 참조 변수 추적 방식으로 가비지 객체를 판별하여 처리하는 순환 참조 노드 내부 가비지 컬렉션 단계(S330);
    를 더 포함하는 것을 특징으로 하는 가비지 컬렉션 방법.
  4. 제 1항에 있어서,
    상기 참조 정보 변경 단계(S310)에서,
    상기 역방향 참조 경로 탐색을 위한 정보는 상기 객체 및 참조 노드의 외부 참조자 목록을 포함하는 것을 특징으로 하는 가비지 컬렉션 방법.
  5. 제 4항에 있어서,
    상기 참조 정보 변경 단계(S310)에서,
    상기 변수의 값 변경에 의하여 새로운 객체 간 참조 관계가 생성된 경우, 피참조자 객체 또는 피참조자 객체가 속한 참조 노드의 외부 참조자 목록에 참조자 객체를 추가하고,
    상기 변수의 값 변경에 의하여 객체 간 참조 관계가 해지된 경우, 피참조자 객체 또는 피참조자 객체가 속한 참조 노드의 외부 참조자 목록에서 참조자 객체를 삭제하는 것을
    특징으로 하는 가비지 컬렉션 방법
  6. 제2항에 있어서,
    상기 참조 정보 변경 단계(S310)에서,
    상기 객체 및 참조 노드의 참조수 정보는,
    기반 참조수(311), 외부 객체 참조수(312)로 구분하여 저장하는 것을 특징으로 하는 가비지 컬렉션 방법.
  7. 제2항에 있어서,
    상기 참조 정보 변경 단계(S310)는,
    상기 변수의 값 변경과 관련하여 순환 참조 노드에 속한 객체의 참조수 정보를 변경하는 경우,
    순환 참조 노드의 외부 참조자 목록(411), 기반 객체수(431)를 관리하는 단계를 더 포함하고,
    상기 참조수 기반 가비지 판별 단계(S320)는,
    상기 순환 참조 노드의 상기 외부 참조자 목록의 개수와 상기 기반 객체수가 모두 0인 경우 가비지로 판별하는 것을 특징으로 하는 가비지 컬렉션 방법.
  8. 제 3항에 있어서,
    상기 참조수 기반 가비지 판별 단계 (S320)는 상기 객체 참조 변수의 값 변경과 동기화 된 프로세스로 진행하고,
    순환 참조 노드 내부 가비지 컬렉션 단계(S330) 및 순환 참조 탐지 단계(S340)는 상기 객체 참조 변수의 값 변경과 비동기화 된 프로세스로 진행하는 것을 특징으로 하는 가비지 컬렉션 방법.
  9. 제 3항에 있어서,
    상기 참조 정보 변경 단계(S310)에서 순환 참조 노드 내부의 객체 간 참조 관계가 해지된 순환 참조 노드를 선별하여 훼손된 순환 참조 노드 목록에 추가하는 단계를 더 포함하고,
    상기 순환 참조 노드 내부 가비지 컬렉션 단계(S330)는 상기 훼손된 순환 참조 노드 목록(322)에 포함된 순환 참조 노드에 대해서만 한정적으로 실시하는 가비지 컬렉션 방법.
  10. 제 3항에 있어서,
    상기 순환 참조 노드 내부 가비지 컬렉션 단계(S330)는,
    상기 순환 참조 노드의 외부 참조자 목록(411)에 포함된 각 객체들의 참조 경로를 따라 선택된 순환 참조 노드에 속한 객체를 추적하여 마킹 하는 단계;
    를 포함하는 것을 특징으로 하는 가비지 컬렉션 방법.
  11. 제 3항에 있어서,
    상기 참조 정보 변경 단계(S310)는,
    동일한 순환 참조 노드에 속한 두 객체의 연결을 해지하는 변경이 발생한 경우, 상기 두 객체 중 피참조자에 대한 정보를 상기 동일한 순환 참조 노드의 가비지 검사 객체 목록(432)에 추가하는 단계를 더 포함하고,
    상기 순환 참조 노드 가비지 컬렉션 단계(S330)는,
    상기 순환 참조 노드의 가비지 검사 객체 목록(432)에 포함된 각 객체를 기점으로 하는 참조자-피참조자 경로에 포함된 객체 중, 상기 순환 참조 노드에 속한 기반 참조수가 1이상인 각 객체들을 기점으로 참조 경로를 추적하여 상기 순환 참조 노드에 속한 객체를 마킹하는 단계; 및
    상기 순환 참조 노드의 가비지 검사 객체 목록(432)에 포함된 각 객체를 기점으로 하는 참조자-피참조자 경로에 포함된 객체 중, 상기 순환 참조 노드에 속한 마킹 되지 않은 객체를 추적하여 가비지 처리하는 단계; 를
    포함하는 것을 특징으로 하는 가비지 컬렉션 방법.
  12. 제 3항에 있어서,
    상기 참조 정보 변경 단계(S310)는,
    서로 다른 참조 노드에 속한 두 객체 간 참조 관계가 생성되는 경우, 피참조자 객체가 속한 참조 노드의 외부 참조자 목록(411)의 크기가 0이고, 참조자 객체가 속한 참조 노드의 외부 참조자 목록(411)의 크기가 1인 경우와,
    서로 다른 참조 노드에 속한 두 객체 간 참조 관계가 소멸되는 경우, 피참조자 객체가 속한 참조 노드의 외부 참조자 목록(411)의 크기가 1이상인 경우에
    관련 참조자 객체 또는 피참조자 객체 중 하나를 경로 검사 객체 목록에 추가하고,
    상기 순환 참조 노드 탐지 단계(S340)는,
    상기 경로 검사 객체 목록에 포함된 객체를 기점으로 역방향 참조 경로 탐색하여 순환 참조 여부를 확인하는 것을 특징으로 하는 가비지 컬렉션 방법.
  13. 제 3항에 있어서,
    순환 참조 노드 탐지 단계(S340)는,
    순환 참조 발생이 의심되는 객체를 기점으로 역방향 참조 경로 추적을 통해 순환 참조 노드를 탐지하는 단계(S341);
    상기 탐지된 순환 참조 노드가 가비지 노드인가를 판별하고 가비지인 경우 가비지 처리하는 단계(S342);
    를 포함하는 것을 특징으로 하는 가비지 컬렉션 방법.
  14. 제 13항에 있어서,
    상기 순환 참조 노드를 탐지하는 단계(S341)는,
    새로이 추적을 개시한 객체를 포함하는 참조 노드를 추적 중 상태로 변경하는 단계;
    상기 추적 중 상태인 상기 참조 노드의 외부 참조자 목록에 포함된 객체를 다음 추적 객체로 선택하는 단계;
    상기 다음 추적 객체가 이미 추적 중 상태인 경우, 상기 다음 추적 객체가 포함된 참조 노드 및 상기 참조 노드 이후에 추적 중 상태로 변경된 모든 참조 노드들에 속한 객체들이 하나의 순환 참조 노드에 포함되도록 소속 참조 노드를 변경하는 단계;
    를 포함하는 것을 특징으로 하는 가비지 컬렉션 방법.
  15. 객체 참조 변수 변경으로 인해 발생되는 가비지를 판별 및 처리하는 가비지 컬렉터(110)는,
    상기 변경과 관련된 객체 및 참조 노드의 참조수 정보 및 역방향 참조 경로 탐색을 위한 정보를 변경하고, 상기 참조수 정보에 기반하여 객체 및 참조 노드의 가비지 여부를 판단하는 참조 정보 관리부(111);
    순환 참조 노드에 속한 객체들에 한정하여 가비지를 판별하는 순환 참조 노드 내부 가비지 컬렉션 및 역방향 참조 경로를 추적하여 순환 참조 탐지를 진행하는 참조 노드 관리부(112); 및
    가비지 처리부(113)을 포함하는 것을 특징으로 하는 가비지 컬렉션 시스템.
  16. 제 15항에 있어서,
    역방향 경로 탐색을 위한 정보는 외부 참조자 목록을 포함하는 것을 특징으로 하는 가비지 컬렉션 시스템.
  17. 제 16항에 있어서,
    상기 변수 변경에 의하여 새로운 객체 간 참조 관계가 생성된 경우, 피참조자 객체 또는 피참조자 객체가 속한 참조 노드의 외부 참조자 목록에 참조자 객체를 추가하고,
    상기 변수 변경에 의하여 객체 간 참조 관계가 해지된 경우, 피참조자 객체 또는 피참조자 객체가 속한 참조 노드의 외부 참조자 목록에서 참조자 객체를 삭제하는 것을
    특징으로 하는 가비지 컬렉션 시스템.
  18. 제 15항에 있어서,
    상기 참조 노드 관리부(112)의 순환 참조 탐지 방법은,
    순환 참조 발생이 의심되는 객체를 기점으로 역방향 참조 경로 추적을 통해 순환 참조 노드를 탐지하고,
    상기 탐지된 순환 참조 노드가 가비지 노드인가를 판별하는 것을 특징으로 하는 가비지 컬렉션 시스템.

KR1020200074473A 2020-06-18 2020-06-18 역방향 경로 탐색을 이용한 혼합형 가비지 컬렉션 방법 및 이를 이용하는 가비지 컬렉션 시스템 KR102194413B1 (ko)

Priority Applications (1)

Application Number Priority Date Filing Date Title
KR1020200074473A KR102194413B1 (ko) 2020-06-18 2020-06-18 역방향 경로 탐색을 이용한 혼합형 가비지 컬렉션 방법 및 이를 이용하는 가비지 컬렉션 시스템

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
KR1020200074473A KR102194413B1 (ko) 2020-06-18 2020-06-18 역방향 경로 탐색을 이용한 혼합형 가비지 컬렉션 방법 및 이를 이용하는 가비지 컬렉션 시스템

Publications (1)

Publication Number Publication Date
KR102194413B1 true KR102194413B1 (ko) 2020-12-23

Family

ID=74088983

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020200074473A KR102194413B1 (ko) 2020-06-18 2020-06-18 역방향 경로 탐색을 이용한 혼합형 가비지 컬렉션 방법 및 이를 이용하는 가비지 컬렉션 시스템

Country Status (1)

Country Link
KR (1) KR102194413B1 (ko)

Cited By (1)

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

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7216136B2 (en) * 2000-12-11 2007-05-08 International Business Machines Corporation Concurrent collection of cyclic garbage in reference counting systems
KR100737345B1 (ko) * 2006-03-28 2007-07-09 한국전자통신연구원 점진적인 가비지 콜렉션 수행 시에 순환적 가비지의 회수방법 및 장치
KR20140059801A (ko) * 2011-09-09 2014-05-16 마이크로소프트 코포레이션 사이클 그래프에서 객체 수명을 관리하는 기법

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7216136B2 (en) * 2000-12-11 2007-05-08 International Business Machines Corporation Concurrent collection of cyclic garbage in reference counting systems
KR100737345B1 (ko) * 2006-03-28 2007-07-09 한국전자통신연구원 점진적인 가비지 콜렉션 수행 시에 순환적 가비지의 회수방법 및 장치
KR20140059801A (ko) * 2011-09-09 2014-05-16 마이크로소프트 코포레이션 사이클 그래프에서 객체 수명을 관리하는 기법

Non-Patent Citations (3)

* Cited by examiner, † Cited by third party
Title
David F. Bacon et al. (2001). A Pure Reference Counting Garbage Collector
David F. Bacon et al., "Concurrent Cycle Collection in Reference Counted Systems", Proc. European Conf. on Object-Oriented Programming, LNCS vol. 2072, pp. 1-29, June 2001. *
M. Schoettner et al., "Incremental Distributed Garbage Collection Using Reverse Reference Tracking", Euro-par 2006 Parallel Processing, LNCS vol. 4128, pp. 571-581, 29th August - 1st September 2006.* *

Cited By (2)

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

Similar Documents

Publication Publication Date Title
JP5284103B2 (ja) ソフトウェアトランザクショナルメモリ動作の最適化
US8555255B2 (en) Method of tracing object allocation site in program, as well as computer system and computer program therefor
US20050050531A1 (en) System of benchmarking and method thereof
US7779393B1 (en) System and method for efficient verification of memory consistency model compliance
US20120197944A1 (en) System and method for determining an object&#39;s lifetime in an object oriented environment
JP5618796B2 (ja) 計算機、計算機の制御方法及びプログラム
US20090327373A1 (en) Method for performing memory leak analysis inside a virtual machine
US7937378B2 (en) Concurrent lock-free skiplist with wait-free contains operator
CN109308213B (zh) 基于改进任务调度机制的多任务断点调试方法
CN109522097B (zh) 一种基于自适应随机测试的并发缺陷检测方法
CN111611120A (zh) 一种片上多核处理器Cache一致性协议验证方法、系统及介质
KR102194413B1 (ko) 역방향 경로 탐색을 이용한 혼합형 가비지 컬렉션 방법 및 이를 이용하는 가비지 컬렉션 시스템
US20180300146A1 (en) Database operating method and apparatus
CN106294169A (zh) 一种基于符号执行虚拟机的数据竞争检测与重放方法
EP3635561B1 (en) Asynchronous operation query
CN113505114A (zh) 数据库的多版本并发控制方法及数据库系统
CN111159022B (zh) 基于单变量访问序模式的中断数据访问冲突检测方法及装置
KR102453983B1 (ko) 생존 경로 정보 기반 가비지 컬렉션 방법
Kacsuk Systematic macrostep debugging of message passing parallel programs
CN114527963A (zh) C++二进制文件中的类继承关系识别方法及电子装置
CN102360306A (zh) 高级语言代码中循环数据流图提取优化信息处理方法
JP2009265996A (ja) 検査装置、検証方法および検証プログラム
Tsai et al. Automated class testing using threaded multi-way trees to represent the behaviour of state machines
Ramanujam et al. Analysis of event synchronization in parallel programs
CN116501660A (zh) 一种面向Spark的自动缓存方法及装置

Legal Events

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