KR20050022175A - 가비지 콜렉션 벤치마킹 방법 및 가비지 콜렉션 워크로드 - Google Patents

가비지 콜렉션 벤치마킹 방법 및 가비지 콜렉션 워크로드 Download PDF

Info

Publication number
KR20050022175A
KR20050022175A KR1020030058748A KR20030058748A KR20050022175A KR 20050022175 A KR20050022175 A KR 20050022175A KR 1020030058748 A KR1020030058748 A KR 1020030058748A KR 20030058748 A KR20030058748 A KR 20030058748A KR 20050022175 A KR20050022175 A KR 20050022175A
Authority
KR
South Korea
Prior art keywords
objects
node
size
garbage collection
binary tree
Prior art date
Application number
KR1020030058748A
Other languages
English (en)
Other versions
KR100626368B1 (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 KR1020030058748A priority Critical patent/KR100626368B1/ko
Priority to JP2004244667A priority patent/JP2005071375A/ja
Priority to GB0418969A priority patent/GB2405506A/en
Priority to US10/924,938 priority patent/US20050050531A1/en
Publication of KR20050022175A publication Critical patent/KR20050022175A/ko
Application granted granted Critical
Publication of KR100626368B1 publication Critical patent/KR100626368B1/ko

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/30Monitoring
    • G06F11/34Recording or statistical evaluation of computer activity, e.g. of down time, of input/output operation ; Recording or statistical evaluation of user activity, e.g. usability assessment
    • G06F11/3409Recording or statistical evaluation of computer activity, e.g. of down time, of input/output operation ; Recording or statistical evaluation of user activity, e.g. usability assessment for performance assessment
    • G06F11/3428Benchmarking
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2201/00Indexing scheme relating to error detection, to error correction, and to monitoring
    • G06F2201/815Virtual

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Software Systems (AREA)
  • Stored Programmes (AREA)
  • Memory System (AREA)
  • Debugging And Monitoring (AREA)

Abstract

본 발명은 자바 가상 머신의 가비지 콜렉션의 성능을 측정하기 위한 자바 가비지 콜렉션 워크로드, 이를 이용한 벤치마킹 방법 및 상기 벤치마킹 방법을 실현시키기 위한 프로그램을 기록한 컴퓨터로 읽을 수 있는 기록매체에 관한 것으로서, 벤치마킹 방법은 벤치마크 파일을 생성하고, 상기 파일을 자바 가상 머신 상에서 실행하는 것을 포함한다. 벤치마크 파일을 생성하는 것은 이진 트리의 데이터 구조를 갖는 객체들을 생성하고, 상기 객체들이 더 이상 참조되지 않게 하여 가비지 콜렉션을 임의로 발생케 하여 객체의 반복적인 재생성을 통해 가비지 콜렉션의 부하를 높이고, 벤치마크 결과를 보고하는 것을 포함한다.

Description

가비지 콜렉션 벤치마킹 방법 및 가비지 콜렉션 워크로드{METHOD OF BENCHMARKING GARBAGE COLLECTION AND GARBAGE COLLECTION WORKLOAD}
본 발명은 자바 가상 머신 벤치마킹에 관한 것으로서, 더욱 상세하게는 자바 가상 머신의 가비지 콜렉션을 공정하게 평가할 수 있는 자바 가비지 콜렉션 벤치마크 및 그 방법에 관한 것이다.
자바(Java)는 플랫폼 중립적인 프로그래밍 언어 및 환경이다. 자바 소스 코드는 컴파일되어 자바 가상 머신(Java Virtual Machine:JVM) 상에서 수행된다. 자바 가상 머신이 설치된 어떠한 플랫폼도 자바 어플리케이션을 실행할 수 있다. 즉, 자바 소스 코드는 바이트 코드로 컴파일되고 자바 가상 기계가 자바 바이트 코드를 해석하여 그것이 설치되어 있는 플랫폼 상에서 실행한다. 자바 바이트 코드는 자바 가상 머신의 머신 언어로 생각할 수 있다. 자바 가상 머신 측으로 보면, 바이트 코드의 스트림은 인스트럭션 시퀀스이다.
자바 가상 머신은 실제 하드웨어 플랫폼 및 오퍼레이팅 시스템 상에 설치된 가상 컴퓨터로서 컴파일된 자바 프로그램을 수행한다. 이 같은 자바 가상 머신으로 인해서 자바 언어로 작성된 프로그램은 다른 컴퓨터 상에서 수행되기 위해서 재작성될 필요가 없다.
자바 가상 머신의 가상 하드웨어는 네 부분으로 나누어질 수 있다: 레지스터, 스택, 가비지-콜렉티드 힙, 그리고 메쏘드 영역. 메쏘드 영역은 자바 바이트 코드가 상주하는 영역이다. 자바 스택은 바이트 코드 명령을 위한 파라미터 및 바이트 코드 명령의 결과를 저장하고, 메쏘드로 파라미터를 전달하거나 메쏘드로부터 값을 받고, 각 메쏘드의 호출 상태를 유지한다. 자바 가비지-콜렉티드 힙은 자바 프로그램의 객체가 있는 자유 저장 장소이다. "new" 연산자를 사용하여 메모리를 할당하면, 힙으로부터 메모리가 생성된다. 자바 런타임 환경은 힙 상의 각 객체에 대한 참조를 추적한다.
자바 시스템에서 가비지 콜렉션을 통해서 모든 객체들은 힙으로부터 동적으로 할당되고 할당된 객체들이 방출(release)(할당된 메모리가 시스템으로 반환)된다. 가비지 콜렉션 알고리즘은 일반적으로 참조들로부터 도달 가능한 객체들을 결정한다. 객체가 더 이상 도달할 수 없을 때(객체가 더 이상 참조되지 않을 때), 프로그램에 의해 명시적으로 할당해제(deallocation)가 되지 않더라도, 그 객체가 차지하는 메모리는 시스템으로 반환되고 재요청(reclaim)되어 재사용(reuse)된다.
런타임 동안 끊임없이 객체가 생성되고 가비지 콜렉션이 수행되기 때문에 가비지 콜렉션은 자바 가상 머신에서 시간을 가장 많이 소비하는 구성(component) 중 하나이다 따라서, 자바 가상 머신의 성능은 자바 가비지 콜렉션에 의해 크게 좌우된다. 서로 다른 자바 가상 머신은 서로 다른 가비지 콜렉션 행동을 나타낸다. 하지만, 대부분의 자바 벤치마크(benchmark)는 중앙처리장치 또는 서버 및 클라이언트 사이의 트랜잭션의 성능 측정에 맞춰져 있다. 따라서, 서로 다른 자바 가상 머신의 가비지 콜렉션에 대한 공정하고 정확한 평가를 하기가 어렵다. 예컨대, 자바 가비지 콜렉션의 성능 이외의 다른 구성의 성능이 향상되어도 전체적인 자바 가상 머신의 성능은 좋은 결과를 나타낸다.
따라서 본 발명이 이루고자 하는 기술적 과제는 서로 다른 자바 가상 머신의 가비지 콜렉션을 공정하고 상대적인 평가를 가능하게 하는 자바 가비지 콜렉션 벤치마크 및 그 방법을 제공하는 것이다.
가비지 콜렉션을 벤치마킹하기 위한 본 발명의 가비지 콜렉션 워크로드(java garbage collection workload)는 가비지 콜렉션을 지원하는 데이터 처리 장치의 객체 할당 및 자유 객체의 재요청의 실행 시간, 메모리 상태(힙 크기, 할당된 공간, 자유 공간 등) 등을 측정한다. 예컨대, 가비지 콜렉션을 지원하는 데이터 처리 장치로서 자바 가상 머신을 꼽을 수 있다.
본 발명의 가비지 콜렉션 워크로드는 서로 다른 데이터 처리 장치들의 가비지 콜렉션을 공정하고 상대적으로 평가하여 가비지 콜렉션의 핫스팟(hot spot)을 확인하고 자바를 위한 이상적인 가비지 콜렉션 전략을 세울 수 있도록 한다.
본 발명의 가비지 콜렉션 워크로드는 또한 다중 쓰레드 환경을 제공하여 다중 프로세서 시스템에 있어서의 가비지 콜렉션 성능의 비례확대(scalability)를 측정할 수 있도록 한다.
본 발명의 일 실시예에 따른 가비지 콜렉션 벤치마킹하는 방법은, 벤치마크 파일을 생성하고, 상기 파일을 가비지 콜렉션을 지원하는 데이터 처리 장치 상에서 실행하는 것을 포함한다. 상기 벤치마크 파일을 생성하는 것은 이진 트리의 데이터 구조를 갖는 객체들을 생성하고, 상기 객체들이 더 이상 참조되지 않게 하여 새로운 객체들을 재생성하고, 벤치마크 결과를 보고하는 것을 포함한다.
일 실시예에 있어서, 상기 이진 트리의 데이터 구조를 갖는 객체들을 생성하는 것은, 경계 객체를 루트 노드로하여, 상기 경계 객체보다 작거나 같은 제1 크기의 객체는 상기 루트 노드에서 왼쪽 노드로 분기하고 큰 제2 크기의 객체는 상기 루트 노드에서 오른쪽 노드로 분기하며, 각 노드에서 그 노드의 객체의 크기보다 작거나 같은 객체는 왼쪽 노드로 분기하고 큰 객체는 오른쪽 노드로 분기하도록 하도록 한다.
경계 객체의 크기는 임의로 결정될 수 있으며, 예컨대, 가장 작은 객체 및 가장 큰 객체의 중간 값 또는 그 부근의 크기를 가질 수 있다. 또한, 제1 객체 및 제2 객체의 개수를 적절히 조절하여 실제 프로그램들의 상황을 반영할 수 있다. 예컨대, 실제 객체 지향 프로그램들(예컨대, 자바 프로그램들)에서 작은 크기의 객체가 큰 크기의 객체보다 상대적으로 많이 생성된다면 이를 반영한 이진 트리 구조의 객체를 형성할 수 있다.
실제 객체 지향 프로그램들을 분석하여 생성되는 객체의 개수 및 크기를 분석하여 중간 크기의 객체, 자주 생성되는 객체의 크기, 최대 크기의 객체, 최소 크기의 객체 등을 파악한 후, 여기에 기초해서 이진 트리 구조를 형성할 수 있다. 예컨대, 객체의 개수, 크기, 최소 크기의 객체, 최대 크기의 객체의 평균을 이용하여 이진 트리 구조를 생성할 수 있다.
일 실시예에 있어서, 상기 객체들이 더 이상 참조되지 않게 하여 새로운 객체들을 재생성하는 것은, 이진 트리의 데이터 구조에서 먼저 어느 한 쪽의 객체들(예컨대, 제1 크기의 객체들)에 접근한 후 경계 객체를 접근하고 다른 쪽의 객체들(제2 크기의 객체들)에 접근한다. 따라서, 제2 크기의 객체들이 제1 크기의 객체들에 비해서 오래 살아있다. 실제 자바 프로그램에서 큰 크기의 객체가 작은 크기의 객체보다 오래 살아있기 때문에, 작은 크기의 객체를 제1 크기의 객체로 하고 큰 크기의 객체를 제2 크기로 하는 것이 바람직하다.
구체적으로, 상기 제1 크기의 객체 노드들에 접근하여 현재 링크를 절단하고(더 이상 참조되지 않게 하고) 새로운 제1 크기의 객체들을 생성하고, 상기 경계 객체 노드에 접근하여 현재 링크를 절단하고 새로운 경계 객체를 생성하고, 상기 제2 크기의 객체 노드들에 접근하여 현재 링크를 절단하고 새로운 제2 크기의 객체들을 생성한다. 이때, 각각의 크기의 객체 노드들에 대한 접근은 상기 이진 트리의 최상위 깊이의 객체 노드들부터 시작하여 하위 깊이의 객체노드들로 향한다. 또, 이전의 이진 트리와 동일한 구조를 가지도록 객체를 생성한다. 즉, 제거한 객체와 동일한 크기의 객체를 재생성한다.
바람직하게, 상기 이진 트리의 최상위 깊이의 객체 노드들로부터 시작하여 하위 깊이의 객체노드들로 객체 재생성이 이루어질 때, 특정 깊이의 객체 노드에 대한 객체 재생성은 그 특정 깊이 바로 이전에 이루어진 객체의 재생성을 반복한 한 후에 이루어진다.
일 실시예에 있어서, 상기 이진 트리의 데이터 구조를 갖는 객체들을 생성하는 것은, 객체의 개수는 동일한 서로 다른 구조의 이진 트리 구조들을 형성하는 것을 포함한다. 이것은 멀티 쓰레드 환경을 제공하여 실제 자바 프로그램 환경을 반영하기 위함이다. 이때, 각 이진 트리 구조는 서로 다른 개수의 상기 제1 크기의 객체 및 제2 크기의 객체를 포함하는 것이 바람직하다.
일 실시예에 있어서, 상기 메모리에 이진 트리의 데이터 구조를 갖는 객체들을 생성하기 전에, 미리 할당된 객체들을 생성하는 것을 더 포함할 수 있다. 이 같은 미리 할당된 객체들은 프로그램 수행 중에 제거되지 않고 프로그램 수행이 끝날 때까지 메모리를 차지한다.
본 발명의 일 실시예에 따른 가비지 콜렉션을 벤치마킹하는 가비지 콜렉션 워크로드는, 이진 트리 데이터 구조를 갖는 객체들을 생성하는 객체 생성 수단과, 생성된 이진 트리 데이터 구조의 객체들이 더 이상 참조되지 않게 하여 새로운 객체들을 재생성하는 객체 재생성 수단과, 벤치마킹 결과를 출력하는 보고 수단을 포함한다.
본 발명은 또한, 가비지 콜렉션을 벤치마킹하기 위하여 데이터 처리 장치에, 이진 트리 구조의 객체 노드들을 생성하는 기능과, 생성된 객체 노드들 모두에 접근하여 현재의 링크를 끊어버리고 새로운 객체들을 재생성하는 기능과, 테스트 결과를 보고하는 기능을 실현시키기 위한 프로그램을 기록한 컴퓨터로 읽을 수 있는 기록 매체를 제공한다.
이하 첨부한 도면들을 참조하여 본 발명의 실시예들을 상세히 설명하기로 한다.
본 발명은 가비지 콜렉션을 측정하기 위한 가비지 콜렉션 워크로드 및 자바 가비지 콜렉션 벤치마킹 방법 그리고 상기 가비지 콜렉션 벤치마킹 방법을 실현시키기 위한 프로그램을 기록한 컴퓨터로 읽을 수 있는 기록매체를 제공한다.
본 발명에 대한 보다 명확한 이해를 위해서, 자바 가상 머신과 관련하여 본 발명의 가비지 콜렉션 워크로드 및 가비지 콜렉션 벤치마킹을 상세히 설명하기로 한다. 하지만, 본 발명은 다른 프로그램 언어 콘텍스트에서도 실행될 수 있음은 당업자에 있어서 자명할 것이다. 또, 본 발명은 여기서 설명되어지는 실시예들에 한정되지 않고 다른 형태로 구체화될 수도 있다. 오히려, 여기서 소개되는 실시예들은 개시된 내용이 철저하고 완전해질 수 있도록 그리고 당업자에게 본 발명의 사상이 충분히 전달될 수 있도록 하기 위해 제공되어지는 것이다.
본 발명에서 트리의 최상위 깊이란 루트 노드로부터 가장 멀리 있는 자식 노드의 깊이를 말한다. 즉, 루트 노드는 깊이 1이고 루트 노드의 두 자식 노드는 깊이 2이다.
도 1은 본 발명의 일 실시예에 따른 자바 가비지 콜렉션 벤치마킹 방법을 설명하기 위한 흐름도이다. 단계 S100 에서, 실제 자바 프로그램들을 분석한다. 특히, 객체에 대한 분석, 예컨대, 객체(Object)의 크기, 객체의 수명, 최대 객체의 크기, 최소 크기의 객체, 객체의 개수, 자주 발생되는 객체의 크기 등을 분석한다.
단계 S200 에서, 자바 가비지 콜렉션을 벤치마킹하기 위한 벤치마크 파일을 생성한다. 벤치마크 파일은 단계 S100의 객체에 대한 분석 결과를 반영하여, 객체의 생성, 생성된 객체의 제거 및 재생성하는 것을 포함한다. 통상적으로, 실제 자바 프로그램에서 크기자 작은 객체가 상대적으로 크기가 큰 객체에 비해서 많이 생성된다. 또, 크기가 자은 객체는 수명이 짧고(빈번히 생성되었다가 소멸하고) 크기가 큰 객체는 수명이 길다. 따라서 이와 같은 상황을 반영하여 객체를 생성하고 생성된 객체를 제거하고 재생성한다. 객체의 생성, 제거 및 재생성에 대해서는 후술한다.
단계 300에서, 자바 가상 머신의 가비지 콜렉션을 측정하기 위해서, 벤치마크 파일을 여러 자바 가상 머신들 상에서 실행한다. 벤치마크 파일(*.java 파일)을 자바 바이트 코드로 변환한 후(*.class 파일) 이를 자바 가상 머신 상에서 실행한다.
도 2는 도 1의 벤치마크 파일 생성 단계(S200)를 보다 상세히 설명하기 위한 흐름도이다. 단계 S201에서 이진 트리의 데이터 구조를 갖는 객체들을 생성한다. 이진 트리 구조의 객체를 생성함에 있어서, 루트 노드는 예컨대, 객체 분석으로부터 얻은 객체의 평균 크기로 정할 수 있다. 또한 루트 노드는 최소 크기의 객체 및 최대 크기의 객체의 평균값으로 정할 수 있다. 루트 노드에서 분기하는 자식 노드는 최소 크기의 객체 및 최대 크기의 객체 사이의 크기를 가진다. 루트 노드의 객체(경계 객체)보다 작거나 같은 크기의 객체는 왼쪽으로 분기하고 큰 크기의 객체는 오른쪽으로 분기한다. 또한, 각 노드(부모 노드)에서 분기하는 노드(자식 노드)역시 부모 노드의 객체보다 작거나 같으면 부모 노드에서 왼쪽으로 분기하고 부모 노드의 객체보다 크면 부모 노드에서 오른쪽으로 분기한다. 또, 루트 노드의 왼쪽에 있는 작은 크기의 객체 및 오른쪽에 있는 큰 크기의 객체의 개수 비율은 적절히 조절될 수 있다.
도 3은 본 발명의 일 실시예에 따른 트리 구조의 객체 생성을 설명하기 위한 흐름도이다.
단계 S301에서 경계 객체의 크기, 최대 객체의 크기, 최소 객체의 크기, 객체의 개수(노드의 개수) 등을 결정한다. 이와 같은 결정은 실제 자바 프로그램을 분석함으로써 구할 수 있다.
단계 S303에서 경계 객체를 사용하여 루트 노드를 생성한다. 경계 객체의 크기는 미리 고정된 값으로서, 루트 노드를 형성한다.
단계 S305에서 최소 크기의 객체와 최대 크기의 객체 사이의 범위를 가지는 객체를 무작위(random)로 생성한다. 여기서, 경계 객체를 중심으로 그 보다 작은 크기의 객체들 및 큰 크기의 객체들의 비율을 조절할 수 있다. 큰 크기의 객체보다 작은 크기의 객체를 상대적으로 많이 생성한다.
단계 S307에서 생성된 객체가 루트 노드의 객체(경계 객체)의 크기보다 작거나 같은지를 비교한다.
그 결과, 생성된 객체의 크기가 루트 노드의 객체보다 작으면, 루트 노드(또는 부모 노드)의 왼쪽으로 분기하고(단계 S309A), 그렇지 않고 루트 노드의 객체가 생성된 객체보다 크면 루트 노드의 오른쪽으로 분기한다(단계 309B).
단계 S311에서, 분기한 쪽에 노드가 존재하는 지 판단한다. 만약 분기한 쪽으로 노드가 이미 존재한다면, 단계 S313으로 가서 존재하는 노드의 객체와 새로이 생성된 객체의 크기를 비교한다. 그 결과 새로운 객체의 크기가 이미 존재하는 노드의 객체보다 작거나 같으면 단계 S301A로 이동하고, 그렇지 않고 새로운 객체의 크기가 이미 존재하는 노드의 객체보다 크면 단계 S301B로 이동하며, 분기한 쪽에 새로운 노드가 나타나지 않을 때까지 반복한다.
만약 단계 S311에서, 분기한 쪽에 노드가 존재하지 않는다면 단계 S315로 이동하여 분기한 쪽으로 새 노드를 생성한다.
단계 317에서, 생성된 객체가 존재하는지 판단하여 그렇다면 다시 단계 S307로 이동하고 그렇지 않다면(모든 객체들에 대해서 처리가 끝이 나면) 단계 S319로 가서 단계 S305에서 생성된 객체들에 대한 이진 트리가 완성된다.
다시 도 2를 참조하여, 이진 트리 구조의 객체들을 생성한 후, 단계 203에서 생성된 객체를 제거하고 새로운 객체를 재생성한다. 객체의 제거 및 재생성은 루트 노드(경계 객체)를 기준으로 그 왼쪽의 자식 노드들, 즉, 작은 객체의 노드들에 대해서 먼저 객체의 제거 및 재생성을 한다. 이어서 루트 노드의 객체를 제거 및 재생성한 후, 루트 노드의 오른쪽 자식 노드들에 대해서 객체의 제거 및 재생성을 한다. 또, 동일한 깊이의 노드에서, 먼저 오른쪽의 형제 노드에 대해서 객체의 제거 및 재생성을 하고 왼쪽 형제 노드에 대해서 객체의 제거 및 재생성을 한다. 또한, 객체의 제거 및 재생성은 이진 트리 구조의 최상위 깊이에서부터 시작하여 하위 깊이로 이동한다.
예컨대, 이진 트리가 깊이 4의 노드로 이루어진 경우를 생각해보자. 먼저 루트 노드의 왼쪽의 노드에서(즉, 루트 노드의 객체보다 같거나 작은 크기의 객체들에 대해서) 깊이 4의 형제 노드(sibling node), 깊이 3의 형제 노드, 깊이 2의 형제 노드 순서로 객체에 대한 제거 및 재생성을 진행한 후, 깊이 1의 노드(루트 노드)의 경계 객체에 대해서 객체의 제거 및 재생성을 한다. 이어서, 루트 노드의 오른쪽 노드에서(즉, 루트 노드의 객체보다 큰 크기의 객체들에 대해서), 깊이 4의 형제 노드, 깊이 3의 형제 노드, 깊이 2의 형제 노드 순서로 객체에 대한 제거 및 재생성을 진행한다.
즉, 객체에 대한 제거 및 재생성은 4 L , 3 L , 2 L , 1, 4 R , 3 R , 2 R 순서로 이루어진다(여기서, 숫자는 노드의 깊이를 표시하고(1은 루트 노들 표시), 숫자의 하첨자 R은 루트 노드를 기준으로 오른쪽 노드를(루트 노드의 객체보다 큰 크기의 객체), 하첨자 L은 왼쪽 노드(루트 노드의 객체보다 작은 크기의 객체)를 가리킨다. 또 각 깊이의 노드는 2개의 형제 노드로 이루어질 수 있으며 이때, 오른쪽 형제 노드의 객체에 대해서 먼저 제거 및 재생성을 진행한 후 왼쪽 형제 노드의 객체에 대해서 제거 및 재생성을 진행한다. 또한 왼쪽 형제 노드의 객체에 대해서 먼저 진행한 후 오른쪽 형제 노드 객체에 대해서 진행할 수 있다).
이때, 동일한 이진 트리 구조를 유지하기 위해서, 제거된 객체의 크기와 동일한 크기의 객체를 재생성한다.
바람직하게는 특정 깊이의 노드에서의 객체에 대한 제거 및 재생성은 그 특정 깊이 바로 직전에 이루어진 객체에 대한 제거 및 재생성을 반복한 후에 이루어진다. 즉, 각 깊이에서의 객체의 제거 및 재생성은 그 깊이를 포함하여 그 깊이 아래에 있는 모든 깊이의 노드들(자식 노드들)에 대해서 객체의 제거 및 재생성이 이루어진다. 또, 루트 노드 오른쪽의 노드에 대한 객체의 제거 및 재생성은 루트 노드 왼쪽의 객체에 대한 제거 및 재생성을 진행한 후에 이루어진다.
예컨대, 위의 깊이 4(루트 노드:깊이 1)로 이루어진 이진 트리 구조의 예의 경우, 4 L , ( 4 L , 3 L ), ( 4 L , 3 L , 2 L ), ( 4 L , 3 L , 2 L , 1), ( 4 L , 3 L , 2 L , 1 , 4 R ), ( 4 L , 3 L , 2 L , 1, 4 R , 3 R ), ( 4 L , 3 L , 2 L , 1, 4 R , 3 R , 2 R ) 순서로 객체의 제거 및 재생성이 이루어진다. 따라서, 작은 크기의 객체는 빈번히 제거 및 재생성이 이루어지며 큰 크기의 객체는 아주 드물게 제거 및 재생성이 이루어진다. 이는 실제 자바 프로그램 환경을 매우 적절하게 대변한다. 이진 트리를 구성하는 모든 노드들이 적어도 한번은 방문되어 객체를 제거하고 재생성된다. 기존의 트리 구조와 동일한 구조를 유지하기 위해서 기존의 자식 노드들과 동일한 크기의 자식 노드들을 생성한다.
도 4a 및 도 4b는 본 발명의 일 실시예에 따른 트리 구조의 객체 제거 및 재생성을 설명하기 위한 흐름도이다.
도 4a는 객체 제거 및 재생성 순서를 나타내는 흐름도이고 도 4b는 객체 제거 및 재생성 알고리즘을 도시하는 흐름도이다.
먼저 도 4a를 참조하여, 단계 S401에서 시작하여, 단계 S403에서 루트 노드의 왼쪽 자식 노드들(작은 객체)에 대한 객체의 제거 및 재생성이 이루어지고, 단계 S405에서 루트 노드에 대한 객체의 제거 및 재생성이 이루어지고 단계 S407에서 루트 노드의 오른쪽 자식 노드들(큰 객체)에 대한 객체의 제거 및 재생성이 이루어진다.
도 4b는 재생성 함수를 설명하기 위한 흐름도로서, 이에 따르면 현재 트리 깊이에서 마지막 노드(최상위 깊이의 노드)까지 객체 제거 및 재생성이 반복적으로 진행된다.
단계 S411에서 시작하여 재생성 함수가 시작된다. 단계 S413에서 오른쪽 노드가 null이 아닌지(오른쪽 자식 노드가 존재하는지)를 판단한다. 판단 결과, null이라면(오른쪽 자식 노드가 없다면) 단계 S421로 진행하여 이번에는 왼쪽 노드가 null이 아닌지(왼쪽 자식 노드가 존재하는지)를 판단한다. 판단 결과 왼쪽 노드가 null이라면(왼쪽 자식 노드가 없다면) 재생성 함수의 실행이 종료되어 단계 S429에서 끝이 난다.
단계 S413에서 오른쪽 자식 노드가 있다면 단계 S415로 진행하여 그 오른쪽 자식 노드를 현재 오른쪽 노드로 하여 단계 S416에서 재생성 함수를 호출(재귀호출)한다. 재귀호출된 함수의 실행이 완료되면(즉, 단계 S411에서 시작하여 단계 S429까지 실행되어 재귀호출된 함수의 실행이 종료되면) 단계 S417로 진행한다. 단계 S417에서 오른쪽 자식 노드가 null인지를 판단한다. 그 결과 null이라면 새로운 객체를 생성하고, null이 아니라면 단계 S421로 진행한다.
단계 S421에서 왼쪽 자식 노드가 있다면 단계 S423으로 진행하여 그 왼쪽 자시 노드를 현재 왼쪽 노드로 하여 단계 S424에서 재생성 함수를 호출(재귀호출)하고, 재귀호출된 함수의 실행이 완료되면(즉, 단계 S411에서 시작하여 단계 S429까지 실행되어 재귀호출된 함수의 실행이 종료되면) 단계 S425로 진행한다. 단계 S425에서 왼쪽 자식 노드가 null인지를 판단한다. 그 결과 null이라면 새로운 객체를 생성하고, null이 아니라면 단계 S419로 진행하여 재귀호출된 함수의 실행이 종료된다.
이에 따라 현재 부모 노드의 상위 깊이에 있는 모든 자식 노드들에 대한 객체의 제거 및 재생성이 이루어진다. 이때, 객체의 제거 및 재생성은 최상위 깊이의 자식 노드에서 부터 상위 깊이의 노드로 이동하면서 그리고 오른쪽 자식 노드가 왼쪽 자식 노드보다 먼저 제거되고 재생성된다.
도 4b의 흐름도에서 자식 노드들 중 왼쪽 형제 노드가 먼저 제거 및 재생성되고 이어서 오른쪽 형제 노드가 제거 및 재생성될 수 있다.
이상에서 설명한 이진 트리 데이터 구조 및 그것에 대한 객체의 제거 및 재생성에 대한 설명으로부터 프로그래머는 소정의 프로그램 언어를 사용하여 하게 구현할 수 있다.
이 같은 이진 트리 구조 형성, 객체의 제거 및 재생성을 포함하는 벤치마크 프로그램의 일 예를 설명한다.
벤치마크 프로그램은 실제적인 노드의 생성, 노드의 제거 및 재생성을 담당하는 ObjBTree 클래스와, ObjBTree 클래스의 메쏘드들(method)을 이용하여 원하는 이진 트리 구조를 생성하고, 생성된 이진 트리 구조에 대한 객체의 제거 및 재생성을 담당하는 MTBinTree 클래스, 벤치마크 결과를 출력하는 JGCW 클래스, 새로운 객체 생성을 위해 랜덤하게 수를 발생시키는 RanGen 클래스를 포함한다.
ObjBTree 클래스는 add 메쏘드, traverse 메쏘드, getDepth 메쏘드, getdepth 메쏘드, regenNode 메쏘드 등을 포함한다. Obj.BTree.add(ObjBTree r, Integer n, int objsize) 메쏘드는 새로운 노드의 생성 요구가 들어왔을 때, 기존의 트리 구조에 새로운 크기의 노드를 생성하며, 부모 노드보다 큰 노드는 오른쪽 형제 노드로, 같거나 작은 노드는 왼쪽 형제 노드로 된다. ObjBTree.traverse(ObjBTree r) 메쏘드는 생성된 모든 노드를 한 번 이상 방문(visiting)한다. ObjBTree.getDepth(ObjBTree r) 메쏘드는 현재의 트리 구조의 깊이를 알려주며, 트리 깊이를 반환하는 ObjBTree.getdepth(ObjBTree r) 메쏘드에서 호출된다. ObjBTree.regenNode(BbjBTree r, int depth)는 각 노드들을 방문하여 기존의 객체 링크를 없애버리고(기존 객체를 가비지화 하고) 동일한 크기의 객체 노드를 생성하여 동일한 트리 구조를 유지하도록 한다.
예컨대, 객체 생성 메쏘드 add()의 소스 코드는 다음과 같을 수 있다.
-----------------------------------------------------------------------
1. public static ObjBTree add(ObjBTree r,Integer n, int objsize){
2. if(r == null){
3. r = new ObjBTree();
4. r.left = r.right = null;
5. r.idata = n;
6. r.sdata = new StringBuffer();
7. r.sdata.setLength(objsize);
8. }else if(r.idata.compareTo(n) < 0)
9. r.right = add(r.right,n, objsize);
10. else
11. r.left = add(r.left,n, objsize);
12. return r;
13. }
-----------------------------------------------------------------------
위 소스 코드에서 왼쪽의 숫자는 설명의 편의를 위한 라인(line)을 표시하는 것으로서 실제 소스 코드에는 포함되지 않는다.
이와 같은 소스 코드는 일 예에 불과하면 동일한 자바 언어를 사용하더라도 다르게 구현할 수 있다.
위 add 메쏘드 소스 코드에서, 라인 2 ~ 7 에서, 객체 노드가 null이라면, 왼쪽 및 오른쪽 자식 노드가 null인 objsize의 크기를 가지는 새로운 객체 노드를 형성한다. 라인 8에서, 객체 노드가 null이 아니라면, 그 노드의 객체의 크기와 새로이 생성될 객체의 크기(objsize의 크기)를 비교한다. 새로이 생성될 객체의 크기가 현재 노드의 객체보다 더 크다면, 그 노드에서 오른쪽으로 분기하여 자식 노드 객체가 형성되고(라인 9), 그렇지 않다면(새로이 생성될 객체의 크기가 현재 노드의 객체보다 작거나 같다면) 그 노드에서 왼쪽으로 분기하여 자식 노드 객체가 형성된다(라인 11).
트리 전체에 대한 깊이를 알려주는 getDepth 메쏘드의 소스 코드는 다음과 같은 수 있다.
-----------------------------------------------------------------------
1. public void getDepth(ObjBTree r){
2. if(r != null){
3. curr_depth++;
4. if(curr_depth > tree_depth)
5. tree_depth = curr_depth;
6. getDepth(r.left);
7. getDepth(r.right);
8. curr_depth--;
9. }
10. }
-----------------------------------------------------------------------
6 ~ 7 라인에서 getDepth(r.left) 및 getDepth(r.right) 메쏘드를 재귀호출함으로써, 트리 전체에 대한 깊이를 알려준다.
도 4b에서 설명한 객체 제거 및 재생성 메쏘드인 regenNode(ObjBTree r, int depth)는 특정 깊이 아래에 있는 모든 상위 깊이들의 노드들을 방문하여 현재의 링크를 끊어버리고 새로운 객체를 만든다. 이와 같은 메쏘드 regenNode에 대한 소스 코드는 다음과 같을 수 있다.
-----------------------------------------------------------------------
1. public ObjBTree regenNode(ObjBTree r, int depth) {
2. ObjBTree tmpleft = null, tmpright=null;
3. int tmpidata = 0;
4. curr_depth++;
5. if (r.right != null) {
6. tmpidata = r.right.idata.intValue();
7. tmpleft = r.right.left;
8. tmpright = r.right.right;
9. r.right=regenNode(r.right, depth);
10. if (r.right==null) {
11. r.right = new ObjBTree();
12. Integer tmpIdata = new Integer(tmpidata);
13. r.right.idata = tmpIdata;
14. r.right.sdata = new StringBuffer();
15. r.left.sdata.setLength(tmpidata);
16. r.right.right= tmpright;
17. r.right.left= tmpleft;
18. }
19. }
20. if (r.left != null) {
21. tmpidata = r.left.idata.intValue();
22. tmpleft = r.left.left;
23. tmpright = r.left.right;
24. r.left=regenNode(r.left, depth);
25. if (r.left==null) {
26. r.left = new ObjBTree();
27 Integer tmpIdata = new Integer(tmpidata);
28. r.left.idata = tmpIdata;
29. r.left.sdata = new StringBuffer();
30. r.left.sdata.setLength(tmpidata);
31. r.left.right = tmpright;
32. r.left.left = tmpleft;
33. }
34. }
-----------------------------------------------------------------------
메쏘드 regenNode(ObjBTree r, int depth)는 오른쪽 노드 및 왼쪽 노드가 null이 아닌지를 각각 판단하는 조건문(5 라인, 20 라인)을 가지고 있다. 또 각 조건문은 그 내부에서 regenNode 메쏘드를 호출하는 문(9 라인 및 24라인의 메쏘드 r.right=regenNode(r.right, depth) 및 r.left=regenNode(r.left, depth)) 및 오른쪽 노드 또는 왼쪽 노드가 null인지를 판단하는 네스트 조건문(10 라인 및 25 라인)을 포함하고 있다. 왼쪽 노드 또는 오른쪽 노드가 null이면 새로운 객체 노드가 생성된다. 따라서, 특정 깊이의 노드에 대한 객체의 제거 및 재생성은 그 아래에 있는 상위 깊이의 모든 노드들에 대한 객체를 제거하고 재생성하게 된다.
MTBinTree 클래스는 add 메쏘드, regen 메쏘드, getdepth 메쏘드, run 메쏘드를 포함한다. MTBinTree.add() 메쏘드는 원하는 개수의 노드에 도달할 때까지 노드를 생성한다. MTBinTree.getdepth() 메쏘드는 형성된 트리 구조에서 가장 깊은 깊이를 계산한다. MTBinTree.regen() 메쏘드는 생성된 트리 구조의 각 노드를 방문하여 객체를 제거하고 재생성한다. MTBinTree 클래스는 또한 쓰레드(Thread) 클래스를 상속하여 동시에 다수 개의 트리 구조를 생성할 수 있다. MTBinTree.run() 메쏘드는 객체의 개수, 최대 크기의 객체, 최소 크기의 객체, 경계 객체(루트 노드), 경계 객체를 기준으로 그 보다 작은 크기의 객체 및 그 보다 큰 크기의 객체의 비율 등을 결정하는 제어문들을 포함하며 제어문 내에서 MTBinTree.add(), MTBinTree.getdepth(), MTBinTree.regen() 메쏘드를 호출한다.
한편, 클래스 ObjBTree 의 소스 코드는 다음과 같을 수 있다.
-----------------------------------------------------------------------
1. class MTBinTree extends Thread {
2. protected ObjBTree bnode = null;
3. protected ObjBTree rnode = null;
4. protected ObjBTree rnode_l = null;
5. protected ObjBTree rnode_r = null;
6. protected Integer obji = null;
7. protected int currdepth =0;
8. protected static int bmaxsize=0;
9. protected static int bnodes=0;
10. protected static int bweight=0;
11. protected static int bsizebound=0;
12. MTBinTree() {}
13. public void add() {
14. bnode = bnode.add(bnode,obji,obji.intValue());
15. }
16. public void regen(ObjBTree node) {
17 bnode=bnode.regenNode(node,currdepth);
18. }
19. public int getdepth(ObjBTree node) {
20. return bnode.getdepth(node);
21. }
22. public void run() {
23. int stringsize=0;
24. int removedobjs=0;
25. int objsize[];
26. int largeobj=1;
27. int smallobj=1;
28. int treedepth_l=0, treedepth_r=0;
29. RanGen r;
30. JGCW jgcw_bin = new JGCW();
31. bmaxsize=jgcw_bin.bmaxsize;
32. bnodes=jgcw_bin.bnodes;
33. bweight=jgcw_bin.bweight;
34. bsizebound=jgcw_bin.bsizebound;
35. objsize = new int[bnodes];
36. r = new RanGen(bmaxsize);
37. for(int i=0; i<bnodes; i++) {
38. if ((largeobj*bweight) > (smallobj*(10-bweight))) {
39. stringsize=r.RInt();
40. while (stringsize > bsizebound) {
41. stringsize=r.RInt();
42. }
43. objsize[i]=stringsize;
44. smallobj++;
45. }
46. else {
47. stringsize=r.RInt();
48. while (stringsize <= bsizebound) {
49. stringsize=r.RInt();
50. }
51. objsize[i]=stringsize;
52. largeobj++;
53. }
54. }
55. Integer objbound = new Integer(bsizebound);
56. obji=objbound;
57. add();
58. rnode = bnode;
59. for (int i=1; i<bnodes; i++) {
60. Integer objint= new Integer(objsize[i]);
61. obji=objint;
62. add();
63. }
64. jgcw_bin.MemWaterMark();
65. rnode_l = rnode.left;
66. rnode_r = rnode.right;
67. treedepth_l = getdepth(rnode_l);
68. treedepth_r = getdepth(rnode_r);
69. for(int i=treedepth_l; i > 1; i--){
70. currdepth = i;
71. regen(rnode_l);
72. jgcw_bin.MemWaterMark();
73. }
74. for(int i=treedepth_r; i > 1; i--){
75. currdepth = 2;
76. regen(rnode_l);
77. currdepth=i;
78. regen(rnode_r);
79. jgcw_bin.MemWaterMark();
80. }
81. }
82. }
----------------------------------------------------------------------
위 소스 코드에서 왼쪽의 숫자는 설명의 편의를 위한 라인(line)을 표시하는 것으로서 실제 소스 코드에는 포함되지 않는다.
이와 같은 소스 코드는 일 예에 불과하면 동일한 자바 언어를 사용하더라도 다르게 구현할 수 있다.
13 ~ 15 라인에서 ObjBTree 클래스의 add(ObjBTree r, Integer n, int objsize)에 접근하는 add 메쏘드가 선언되고, 16 ~ 18 라인에서 ObjBTree 클래스의 regenNode(ObjBTree r, int depth)에 접근하는 regen 메쏘드가 선언되고, 19 ~ 21 라인에서 ObjBTree 클래스의 getdepth(ObjBTree r)에 접근하는 getdepth 메쏘드가 선언된다.
22 라인에서부터 run 메쏘드가 시작된다. 36 ~ 54 라인에서 새로운 객체 노드 형성을 위한 램덤 수를 발생시킨다. 랜덤 수는 최소 크기의 객체 및 최대 크기의 객체 사이의 값을 가진다. 여기서, 경계 객체를 기준으로 그 보다 작은 객체 및 그 보다 큰 객체를 일정 비율로 생성한다.
34 라인에서 경계 객체의 크기가 주어지고 이를 이용해서 55 ~ 58 라인에서 루트 노드를 생성한다.
59 ~ 63 라인에서, 랜덤 수를 이용해서 라인에서 나머지 노드를 형성한다.
65 ~ 68 라인에서, 루트 노드의 왼쪽 자식 노드들 및 이들의 깊이, 그리고 루트 노드의 오른쪽 자식 노드들 및 이들의 깊이가 정의된다. 69 ~ 73에서 루트 노드 왼쪽의 자식 노드 및 루트 노드의 객체에 대해서 제거 및 재생성을 진행한다. for 루프 구문을 이용하여 상위 깊이로부터 하위 깊이로 가면서 반복적으로 객체의 제거 및 재생성을 진행한다.
74 ~ 78라인에서, 루트 노드의 오른쪽 자식 노드에 대한 객체의 제거 및 재생성이 이루어진다. 이때, 라인 76에서 왼쪽 노드에 대한 객체를 제거 및 재생성하는 메쏘드 regen(rnode_l)가 호출된 후, 루트 노드의 오른쪽 노드에 대한 객체를 제거 및 재생성하는 메쏘드 regen(rnode_r)가 호출된다. 따라서, 루트 노드의 오른쪽 자식 노드들에 대한 객체의 제거 및 재생성은 루트 노드의 왼쪽 자식 노드들에 대한 객체의 제거 및 재생성을 진행한 후 이루어진다.
다시 도 2를 참조하여, 이진 트리 구조를 구성하는 객체에 대해서 적어도 한번 이상의 제거 및 재생성을 진행 한 후에, 단계 S205에서 벤치마크 결과를 보고한다. 벤치마크 결과는 예컨대, 객체 할당 및 자유 객체의 재요청의 실행 시간, 메모리 상태(힙 크기, 할당된 공간, 자유 공간 등) 등을 포함할 수 있다.
실행 시간은 프로그램 실행전과 실행 후에 각각 시간 스탬프(stamp)를 찍어 그 차이로 구할 수 있으며, 메모리 상태는 자바 라이브러리 펑션을 이용할 수 있다.
도 5a 및 도 5b는 본 발명에 따른 이진 트리 구조의 객체 노드를 형성하는 방법을 설명하기 위한 모식도이다. 경계 객체 크기를 128(byte), 최대 크기의 객체를 512(byte), 최소 크기의 객체를 1(byte)라고 가정하고, 객체 개수는 경계 객체를 포함하여 9개라고 가정한다. 경계 객체를 제외한 객체들은 임의적으로(random) 생성되며 도 5a 및 도 5b에서는 그 생성 순서에 차이가 있으며 동일한 크기의 객체로 가정하였다. 이는 동일한 크기의 객체라고 하더라도 생성 순서의 차이에 따라 다른 트리 구조를 형성함을 보여주기 위함이다. 도 5a에서는 256, 64, 72, 30, 512, 234, 102, 67의 순서로 생성되고, 도 5b에서는 72, 102, 512, 67, 74, 256, 234, 32의 순서로 생성된다.
먼저 도 5a를 참조하여, 경계 객체로 루트 노드가 형성된다. 첫 번째 생성된 객체는 256 바이트로서 루트 노드의 객체보다 크기 때문에 루트 노드에서 오른쪽으로 분기하여 깊이 2의 오른쪽 자식 노드를 형성한다. 두 번째 형성된 객체는 64 바이트로서 루트 노드의 객체보다 작기 때문에 왼쪽으로 분기하여 깊이 2의 왼쪽 자식 노드를 형성한다. 세 번째 형성된 객체는 72 바이트로서 루트 노드의 객체보다 작기 때문에 깊이 2의 왼쪽 자식 노드로 분기하며, 그곳의 객체(64 바이트)보다 크기 때문에 오른쪽으로 분기하여 깊이 3의 오른쪽 자식 노드를 형성한다. 네 번째 생성된 객체는 30 바이트로서 루트 노드의 객체보다 작기 때문에 왼쪽으로 분기하여 깊이 2의 왼쪽 자식 노드로 분기하며, 그곳의 객체(64 바이트)보다 작기 때문에 왼쪽으로 분기하여 깊이 3의 왼쪽 자식 노드를 형성한다. 다섯 번째 생성된 객체는 512 바이트로서 루트 노드의 객체보다 크기 때문에 오른쪽으로 분기하여 깊이 2의 오른쪽 자식 노드를 형성한다. 이와 같은 방법으로 이진 트리 구조가 형성된다.
다음 도 5b를 참조하여, 첫 번째 생성된 객체는 72바이트로서 루트 노드의 객체보다 작기 때문에 왼쪽으로 분기하여 깊이 2의 왼쪽 자식 노드를 형성한다. 두 번째 생성된 객체는 102 바이트로서 루트 노드의 객체보다 작기 때문에 왼쪽으로 분기하며 분기한 곳의 자식 노드보다 크기 때문에 깊이 2의 왼쪽 자식 노드에서 오른쪽으로 분기하여 깊이 3의 오른쪽 자식 노드를 구성한다. 이와 같은 방법으로 이진 트리 구조가 형성되며, 도 5a와는 완전히 다른 구조를 가짐을 알 수 있다.
도 6a 및 도 6b는 각각 도 5a 및 도 5b의 이진 트리 구조에서 객체의 제거 및 재생성 순서를 도시한다. 전술한 바와 같이, 본 발명에 따른 객체의 제거 및 재생성은 루트 노드의 왼쪽에 있는 왼쪽 자식 노드들, 루트 노드 및 루트 노드의 오른쪽 자식 노드들 순서로 이루어진다. 또한, 최하위 깊이의 노드에서 시작하여 상위 깊이로 이동하면서 이루어지며, 각 깊이에서의 객체의 제거 및 재생성은 바로 직전에 이루어진 객체의 제거 및 재생성을 반복한 후에 진행된다.
먼저 도 6a를 참조하여, 첫 번째 실행에서, 왼쪽 노드들 중 최하위 깊이인 깊이 4의 객체들 102, 72에 대한 제거 및 재생성이 이루어지며, 오른쪽 형제 노드가 왼쪽 형제 노드에 비해서 먼저 제거 및 재생성된다. 또는 그 반대의 순서로 진행될 수 도 있다.
두 번째 실행에서, 왼쪽 노드들 중 깊이 3의 노드들에 대한 객체의 제거 및 재생이 이루어진다. 왼쪽 노드의 깊이 3의 노드에 대한 객체의 제거 및 재생성은 먼저 깊이 4에 대한 객체의 제거 및 재생성을 반복한 이후에 이루어진다. 즉, 왼쪽 노드의 깊이 4의 노드 102, 67에 대한 객체의 제거 및 재생성을 진행한 후(첫 번째 실행을 반복한 후) 깊이 3의 노드 72, 32에 대한 객체의 제거 및 재생성을 진행한다.
세 번째 실행에서, 왼쪽 노드들 중 깊이 2의 노드 62에 대한 객체의 제거 및 재생성이 이루어진다. 즉, 왼쪽 노드의 깊이 4의 노드 102, 67 깊이 3의 노드 72, 32에 대한 객체의 제거 및 재생성을 진행한 후(두 번째 실행을 반복한 후) 깊이 2의 노드 62에 대한 객체의 제거 및 재생성을 진행한다.
네 번째 실행에서 왼쪽 노드의 깊이 4, 깊이 3, 깊이 2의 노드들에 대한 객체의 제거 및 재생성을 진행한 후(세 번째 실행을 반복한 후), 깊이 1의 노드에 대한 객체의 제거 및 재생성을 진행한다. 이로써 루트 노드의 왼쪽 자식 노드들에 대한 객체의 제거 및 재생성이 끝이 난다.
다음은 루트 노드의 오른쪽 자식 노드들에 대한 객체의 제거 및 재생성이 이루어진다. 다섯 번째 실행에서, 루트 노드의 왼쪽 노드의 깊이 4, 깊이 3, 깊이 2의 노드 및 루트 노드에 대한 객체의 제거 및 재생성을 진행한 후(네 번째 실행을 반복한 후), 루트 노드의 오른쪽 노드의 깊이 3의 노드 512, 234에 대한 객체의 제거 및 재생성을 진행한다.
여섯 번째 실행해서, 다섯 번째 실행을 진행한 후, 노드 256에 대한 객체의 제거 및 재생성을 진행한다.
도 6b를 참조하여, 첫 번째 실행에서 노드 32에 대해서, 두 번째 실행에서 노드 32, 64에 대해서, ..., 여덟 번째 실행에서 노드 32, 64, 102, 67, 72, 128, 234, 256, 512에 대해서 객체 제거 및 재생성이 실행됨을 알 수 있다.
도 6a 및 도 6b로 알 수 있듯이 큰 크기의 객체는 프로그램 진행 중에 오래도록 살아 있는 반면 작은 크기의 객체는 아주 빈번히 제거 및 재생성됨을 알 수 있다. 이는 실제 자바 프로그램들의 특성과 일치한다.
자바 환경은 다중 쓰레드를 지원한다. 따라서, 상술한 이진 트리 구조를 다수 개 형성하여 다중 쓰레드 환경을 반영한다. 또한, 프로그램 진행 중에 제거되지 않는 생존 객체를 미리 형성할 수 있다. 각 쓰레드는 동일한 객체 개수를 가지면서 서로 다른 트리 구조를 가진다. 또한, 각 쓰레드의 경계 객체는 서로 다를 수도 있고 같을 수도 있다.
도 7은 본 발명에 다른 실시예에 따른 벤치마크 파일을 생성하는 방법을 설명하기 위한 흐름도이다.
단계 S701에서 시작하여, 단계 S703에서, 사전에 생존 객체를 생성할 것인지를 판단한다. 생존 객체는 프로그램 실행동안 제거되지 않고 계속 해서 메모리를 점유하는 객체이다. 생존 객체를 생성할 것이라면, 단계 S705에서 생존 객체를 생성한다. 생존 객체는 다양한 데이터 구조를 가질 수 있다. 앞서 설명한 트리 구조를 가질 수 있을 뿐 아니라, 링크 리스트 구조, 어레이 구조 등을 가질 수 있다. 자바 가비지 콜렉션은 프로그램 실행 중에 이 같은 생존 객체를 끊임없이 방문해야 하기 때문에, 생존 객체는 자바 가비지 콜렉션에게 추가적인 부담(stress, burden)을 제공한다.
단계 S707에서, 쓰레드의 개수, 경계 객체, 최대 크기의 객체, 경계 객체를 기준으로 그보다 큰 객체 및 그보다 작은 객체의 생성 비율 등을 결정한다. 경계 객체는 미리 결정된 값이다. 경계 객체 이외의 객체는 랜덤하게 생성하며, 미리 정한 조건을 만족시키지 않으면(최대 크기의 객체보다 큰 랜덤 수가 발생하거나 최소 크기의 객체보다 작은 랜덤수가 발생하게 되면) 다시 랜덤하게 생성한다.
단계 S709에서 다수 개의 쓰레드를 형성한다. 각 쓰레드는 객체들로 구성된 고유의 이진 트리 데이터 구조를 가진다. 각 쓰레드는 객체 개수는 동일하지만 서로 다른 트리 구조를 가진다.
단계 S711에서 각 쓰레드에서 동시에 전술한 바와 같은 방법으로 객체 제거 및 재생성이 이루어진다.
단계 S713에서 각 쓰레드에 대한 가비지 콜렉션에 대한 평가가 보고된다.
이제까지 본 발명에 대하여 그 바람직한 실시예(들)를 중심으로 살펴보았다. 본 발명이 속하는 기술 분야에서 통상의 지식을 가진 자는 본 발명이 본 발명의 본질적인 특성에서 벗어나지 않는 범위에서 변형된 형태로 구현될 수 있음을 이해할 수 있을 것이다. 그러므로 본 개시된 실시예들은 한정적인 관점이 아니라 설명적인 관점에서 고려되어야 한다. 본 발명의 범위는 전술한 설명이 아니라 특허청구범위에 나타나 있으며, 그와 동등한 범위 내에 있는 모든 차이점은 본 발명에 포함된 것으로 해석되어야 할 것이다.
이상에서 설명한 본 발명에 따르면, 서로 다른 자바 가상 머신의 자바 가비지 콜렉션 성능을 공정하고 상대적으로 평가하여 가비지 콜렉션 알고리즘 상의 핫스팟(hot spot)을 확인하고 자바를 위한 이상적인 가비지 콜렉션 전략을 세울 수 있도록 한다.
도 1은 본 발명의 일 실시예에 따른 자바 가비지 콜렉션 벤치마킹 방법을 설명하기 위한 흐름도이다.
도 2는 도 1의 벤치마크 파일 생성 단계(S200)를 보다 상세히 설명하기 위한 흐름도이다.
도 3은 본 발명의 일 실시예에 따른 트리 구조의 객체 생성을 설명하기 위한 흐름도이다.
도 4a는 객체 제거 및 재생성 순서를 나타내는 흐름도이고 도 4b는 객체 제거 및 재생성 알고리즘을 도시하는 흐름도이다.
도 5a 및 도 5b는 본 발명에 따른 이진 트리 구조의 객체 노드를 형성하는 방법을 설명하기 위한 모식도이다.
도 6a 및 도 6b는 각각 도 5a 및 도 5b의 이진 트리 구조에서 객체의 제거 및 재생성 순서를 도시한다.
도 7은 본 발명에 다른 실시예에 따른 벤치마크 파일을 생성하는 방법을 설명하기 위한 흐름도이다.

Claims (20)

  1. 벤치마크 파일을 생성하고;
    상기 파일을 가비지 콜렉션을 지원하는 데이터 처리 장치에서 실행하는 것을 포함하되,
    상기 벤치마크 파일을 생성하는 것은:
    이진 트리의 데이터 구조를 갖는 객체들을 생성하고;
    상기 객체들이 더 이상 참조되지 않게 하여 새로운 객체들을 재생성하고;
    벤치마크 결과를 보고하는 것을 포함하는 가비지 콜렉션 벤치마킹 방법.
  2. 제 1 항에 있어서,
    상기 데이터 처리 장치는 자바 가상 머신인 것을 특징으로 하는 가비지 콜렉션 벤치마킹 방법.
  3. 제 1 항 또는 제 2 항에 있어서,
    상기 이진 트리의 데이터 구조를 갖는 객체들을 생성하는 것은:
    경계 객체를 루트 노드로하여, 상기 경계 객체보다 작거나 같은 제1 크기의 객체는 왼쪽 노드로 분기하고 상기 경계 객체보다 큰 제2 크기의 객체는 오른쪽으로 분기하되, 각 노드에서 그 노드의 객체의 크기보다 작거나 같은 객체는 왼쪽 노드로 분기하고 큰 객체는 오른쪽 노드로 분기하도록 하는 것을 특징으로 하는 가비지 콜렉션 벤치마킹 방법.
  4. 제 3 항에 있어서,
    상기 객체들이 더 이상 참조되지 않게 하여 새로운 객체들을 재생성하는 것은:
    동일한 이진 트리 구조를 유지하도록 동일한 크기의 객체를 재생성하되, 상기 제1 크기의 객체 노드들, 상기 루트 노드 및 상기 제2 크기의 객체 노드들 순서로 객체들을 재생성하는 것을 특징으로 하는 가비지 콜렉션 벤치마킹 방법.
  5. 제 4 항에 있어서,
    상기 객체들이 더 이상 참조되지 않게 하여 새로운 객체들을 재생성하는 것은:
    상기 이진 트리의 최상위 깊이의 노드들부터 시작하여 하위 깊이의 노드들로 이동하면서 객체들을 재생성하며, 특정 깊이의 노드에 대한 객체 재생성은 그 특정 깊이 아래의 모든 상위 깊이의 노드에 대한 객체의 재생성을 포함하는 것을 특징으로 하는 가비지 콜렉션 벤치마킹 방법.
  6. 제 1 항 또는 제 2 항에 있어서,
    상기 이진 트리의 데이터 구조를 갖는 객체들을 생성하는 것은, 객체의 개수는 동일하며 서로 다른 구조를 갖는 다수의 이진 트리 구조들을 생성하는 것을 포함하고,
    상기 객체들이 더 이상 참조되지 않게 하여 새로운 객체들을 재생성하는 것은, 동시에 다수의 이진 트리 구조들에서 진행되는 것을 특징으로 하는 가비지 콜렉션 벤치마킹 방법.
  7. 제 5 항에 있어서,
    상기 이진 트리의 데이터 구조를 갖는 객체들을 생성하는 것은, 객체의 개수는 동일하며 서로 다른 구조를 갖는 다수의 이진 트리 구조들을 생성하는 것을 포함하고,
    상기 객체들이 더 이상 참조되지 않게 하여 새로운 객체들을 재생성하는 것은, 동시에 다수의 이진 트리 구조들에서 진행되는 것을 특징으로 하는 가비지 콜렉션 벤치마킹 방법.
  8. 제 6 항에 있어서,
    상기 각 이진 트리 구조는 서로 다른 개수의 상기 제1 크기의 객체 및 제2 크기의 객체를 포함하고, 서로 다른 크기의 경계 객체를 가지는 것을 특징으로 하는 가비지 콜렉션 벤치마킹 방법.
  9. 제 7 항에 있어서,
    상기 각 이진 트리 구조는 서로 다른 개수의 상기 제1 크기의 객체 및 제2 크기의 객체를 포함하고, 서로 다른 크기의 경계 객체를 가지는 것을 특징으로 하는 가비지 콜렉션 벤치마킹 방법.
  10. 제 1 항 또는 제 2 항에 있어서,
    이진 트리의 데이터 구조를 갖는 객체들을 생성하기 전에, 프로그램 실행 동안에 항상 메모리를 차지하는 생존 객체들을 생성하는 것을 더 포함하는 것을 특징으로 하는 가비지 콜렉션 벤치마킹 방법.
  11. 제 1 항 또는 제 2 항에 있어서,
    벤치마크 결과를 보고하는 것은 전체 메모리, 현재 할당된 메모리 및 사용할 수 있는 메모리에 대한 크기와 벤치마킹에 소요된 시간을 보고하는 것을 포함하는 것을 특징으로 하는 가비지 콜렉션 벤치마킹 방법.
  12. 제 1 항 또는 제 2 항에 있어서,
    상기 벤치마크 파일을 생성하기 전에 실제 객체 지향 프로그램들에서 생성되는 객체들을 분석하여 객체의 개수, 객체의 크기, 중간 크기의 객체, 자주 생성되는 객체의 크기, 최대 크기의 객체, 최소 크기의 객체를 파악하는 것을 더 포함하고,
    상기 이진 트리의 데이터 구조를 갖는 객체들을 생성하는 것은 상기 객체 분석에 기초하여 상기 중간 크기의 객체를 루트 노드로 하여, 상기 루트 노드의 객체보다 작거나 같은 제1 크기의 객체는 왼쪽 노드로 분기하고 큰 제2 크기의 객체는 오른쪽 노드로 분기하며, 각 노드에서 그 노드의 객체의 크기보다 작거나 같은 객체는 왼쪽 노드로 분기하고 큰 객체는 오른쪽 노드로 분기하도록 하는 것을 특징으로 하는 가비지 콜렉션 벤치마킹 방법.
  13. 가비지 콜렉션을 벤치마킹하는 가비지 콜렉션 워크로드에 있어서,
    이진 트리 데이터 구조를 갖는 객체들을 생성하는 객체 생성 수단;
    생성된 이진 트리 데이터 구조의 객체들이 더 이상 참조되지 않게 하여 새로운 객체들을 재생성하는 객체 재생성 수단;
    벤치마킹 결과를 출력하는 보고 수단을 포함하는 가비지 콜렉션 워크로드.
  14. 제 13 항에 있어서,
    상기 객체 생성 수단은 경계 객체를 루트 노드로 하여, 상기 경계 객체보다 같거나 작은 제1 크기의 객체는 상기 루트 노드에서 왼쪽 노드로 분기하고 상기 경계 객체보다 큰 제2 크기의 객체는 상기 루트 노드에서 오른쪽 노드 분기하며, 각 노드에서 그 노드의 객체의 크기보다 작은 객체는 왼쪽 노드로 분기하고 큰 객체는 오른쪽 노드로 분기하도록 하는 것을 특징으로 하는 가비지 콜렉션 워크로드.
  15. 제 14 항에 있어서,
    상기 객체 재생성 수단은, 상기 제1 크기의 객체 노드들, 상기 루트 노드 및 상기 제2 크기의 객체 노드들 순서로 객체들에 접근하여 이전 객체들을 제거하고 동일한 이진 트리 구조를 가지도록 제거된 객체와 동일한 크기의 객체를 재생성하는 것을 특징으로 하는 가비지 콜렉션 워크로드.
  16. 제 15 항에 있어서,
    상기 객체 재생성 수단은, 상기 이진 트리의 최상위 깊이의 노드들부터 시작하여 하위 깊이의 노드들로 이동하면서 객체를 재생성하되, 특정 깊이의 객체 노드에 대한 객체 재생성은 그 특정 깊이 아래의 모든 상위 깊이의 노드에 대한 객체에 대한 재생성을 포함하는 것을 특징으로 하는 가비지 콜렉션 워크로드.
  17. 제 13 항 내지 제 16 항 중 어느 한 항에 있어서,
    상기 객체 생성 수단은 서로 다른 구조를 가지는 다수의 이진 트리 구조들을 생성하는 것을 특징으로 하는 가비지 콜렉션 워크로드.
  18. 제 13 항에 있어서,
    프로그램 실행 동안 메모리를 항상 차지하고 있는 객체들을 생성하는 생존 객체 생성 수단을 더 포함하는 것을 특징으로 하는 가비지 콜렉션 워크로드.
  19. 가비지 콜렉션을 벤치마킹하기 위하여 가비지 콜렉션을 지원하는 데이터 처리 장치에,
    이진 트리 구조의 객체들을 생성하는 기능과;
    생성된 객체들이 더 이상 참조되지 않게 하여 새로운 객체들을 재생성하는 기능과;
    벤치마킹 결과를 보고하는 보고 기능을 실현시키기 위한 프로그램을 기록한 컴퓨터로 읽을 수 있는 기록 매체.
  20. 제 19 항에 있어서,
    상기 데이터 처리 장치는 자바 가상 머신인 것을 특징으로 하는 컴퓨터로 읽을 수 있는 기록 매체.
KR1020030058748A 2003-08-25 2003-08-25 가비지 콜렉션 벤치마킹 방법 KR100626368B1 (ko)

Priority Applications (4)

Application Number Priority Date Filing Date Title
KR1020030058748A KR100626368B1 (ko) 2003-08-25 2003-08-25 가비지 콜렉션 벤치마킹 방법
JP2004244667A JP2005071375A (ja) 2003-08-25 2004-08-25 ガービッジコレクションのベンチマーキング方法及びガービッジコレクションワークロード
GB0418969A GB2405506A (en) 2003-08-25 2004-08-25 Benchmarking Garbage Collection in Java Virtual Machines
US10/924,938 US20050050531A1 (en) 2003-08-25 2004-08-25 System of benchmarking and method thereof

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
KR1020030058748A KR100626368B1 (ko) 2003-08-25 2003-08-25 가비지 콜렉션 벤치마킹 방법

Publications (2)

Publication Number Publication Date
KR20050022175A true KR20050022175A (ko) 2005-03-07
KR100626368B1 KR100626368B1 (ko) 2006-09-20

Family

ID=33129063

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020030058748A KR100626368B1 (ko) 2003-08-25 2003-08-25 가비지 콜렉션 벤치마킹 방법

Country Status (4)

Country Link
US (1) US20050050531A1 (ko)
JP (1) JP2005071375A (ko)
KR (1) KR100626368B1 (ko)
GB (1) GB2405506A (ko)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR100737345B1 (ko) * 2006-03-28 2007-07-09 한국전자통신연구원 점진적인 가비지 콜렉션 수행 시에 순환적 가비지의 회수방법 및 장치

Families Citing this family (29)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7197521B2 (en) * 2003-11-21 2007-03-27 Intel Corporation Method and system performing concurrently mark-sweep garbage collection invoking garbage collection thread to track and mark live objects in heap block using bit vector
US7647581B2 (en) * 2004-06-30 2010-01-12 International Business Machines Corporation Evaluating java objects across different virtual machine vendors
US7493596B2 (en) * 2004-06-30 2009-02-17 International Business Machines Corporation Method, system and program product for determining java software code plagiarism and infringement
CN1908893A (zh) * 2005-08-01 2007-02-07 王彤 程序逻辑结构图示方法及程序路径统计方法
US7487307B2 (en) * 2006-01-05 2009-02-03 International Business Machines Corporation Method, apparatus and program product for managing memory in a virtual computing system
GB0608406D0 (en) * 2006-04-28 2006-06-07 Ibm Creating references in a scoped memory system
US8464059B2 (en) * 2007-12-05 2013-06-11 Netauthority, Inc. System and method for device bound public key infrastructure
WO2009143115A1 (en) * 2008-05-21 2009-11-26 Uniloc Usa, Inc. Device and method for secured communication
US20100325719A1 (en) * 2009-06-19 2010-12-23 Craig Stephen Etchegoyen System and Method for Redundancy in a Communication Network
US8903653B2 (en) * 2009-06-23 2014-12-02 Uniloc Luxembourg S.A. System and method for locating network nodes
US8452960B2 (en) * 2009-06-23 2013-05-28 Netauthority, Inc. System and method for content delivery
US20100325703A1 (en) * 2009-06-23 2010-12-23 Craig Stephen Etchegoyen System and Method for Secured Communications by Embedded Platforms
US20100321207A1 (en) * 2009-06-23 2010-12-23 Craig Stephen Etchegoyen System and Method for Communicating with Traffic Signals and Toll Stations
US20100321208A1 (en) * 2009-06-23 2010-12-23 Craig Stephen Etchegoyen System and Method for Emergency Communications
US8736462B2 (en) * 2009-06-23 2014-05-27 Uniloc Luxembourg, S.A. System and method for traffic information delivery
US9141489B2 (en) * 2009-07-09 2015-09-22 Uniloc Luxembourg S.A. Failover procedure for server system
US20110093503A1 (en) * 2009-10-19 2011-04-21 Etchegoyen Craig S Computer Hardware Identity Tracking Using Characteristic Parameter-Derived Data
US8316421B2 (en) * 2009-10-19 2012-11-20 Uniloc Luxembourg S.A. System and method for device authentication with built-in tolerance
GB2484268A (en) 2010-09-16 2012-04-11 Uniloc Usa Inc Psychographic profiling of users of computing devices
AU2011101296B4 (en) 2011-09-15 2012-06-28 Uniloc Usa, Inc. Hardware identification through cookies
CN103067125B (zh) * 2012-12-18 2015-08-05 浙江工业大学 一种基于ook调制的无线传感器网络中高发送能量效率源编码方法
AU2013100802B4 (en) 2013-04-11 2013-11-14 Uniloc Luxembourg S.A. Device authentication using inter-person message metadata
US8695068B1 (en) 2013-04-25 2014-04-08 Uniloc Luxembourg, S.A. Device authentication using display device irregularity
US11113176B2 (en) 2019-01-14 2021-09-07 Microsoft Technology Licensing, Llc Generating a debugging network for a synchronous digital circuit during compilation of program source code
US11106437B2 (en) 2019-01-14 2021-08-31 Microsoft Technology Licensing, Llc Lookup table optimization for programming languages that target synchronous digital circuits
US11144286B2 (en) 2019-01-14 2021-10-12 Microsoft Technology Licensing, Llc Generating synchronous digital circuits from source code constructs that map to circuit implementations
US11275568B2 (en) 2019-01-14 2022-03-15 Microsoft Technology Licensing, Llc Generating a synchronous digital circuit from a source code construct defining a function call
US10810343B2 (en) * 2019-01-14 2020-10-20 Microsoft Technology Licensing, Llc Mapping software constructs to synchronous digital circuits that do not deadlock
US11093682B2 (en) 2019-01-14 2021-08-17 Microsoft Technology Licensing, Llc Language and compiler that generate synchronous digital circuits that maintain thread execution order

Family Cites Families (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
ATE233001T1 (de) * 1992-06-15 2003-03-15 Microsoft Corp Rechnerverfahren und system zur speicherverwaltung
US5900001A (en) * 1997-04-23 1999-05-04 Sun Microsystems, Inc. Method and apparatus for optimizing exact garbage collection using a bifurcated data structure
US6118940A (en) * 1997-11-25 2000-09-12 International Business Machines Corp. Method and apparatus for benchmarking byte code sequences
US6070173A (en) * 1997-11-26 2000-05-30 International Business Machines Corporation Method and apparatus for assisting garbage collection process within a java virtual machine
EP1068572A2 (en) * 1999-01-06 2001-01-17 Koninklijke Philips Electronics N.V. Arrangement for executing program code with reduced memory requirements
GB0007493D0 (en) * 2000-03-28 2000-05-17 Tao Group Ltd Garbage collection
US6799191B2 (en) * 2000-05-16 2004-09-28 Sun Microsystems, Inc. Object sampling technique for runtime observations of representative instances thereof
US6839725B2 (en) * 2000-05-16 2005-01-04 Sun Microsystems, Inc. Dynamic adaptive tenuring of objects
JP4116877B2 (ja) * 2002-12-26 2008-07-09 富士通株式会社 ヒープサイズ自動最適化処理方法,ヒープサイズ自動最適化装置およびそのプログラム

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR100737345B1 (ko) * 2006-03-28 2007-07-09 한국전자통신연구원 점진적인 가비지 콜렉션 수행 시에 순환적 가비지의 회수방법 및 장치

Also Published As

Publication number Publication date
JP2005071375A (ja) 2005-03-17
US20050050531A1 (en) 2005-03-03
GB0418969D0 (en) 2004-09-29
GB2405506A (en) 2005-03-02
KR100626368B1 (ko) 2006-09-20

Similar Documents

Publication Publication Date Title
KR100626368B1 (ko) 가비지 콜렉션 벤치마킹 방법
JP3659317B2 (ja) データを管理する方法及び装置
Flood et al. Shenandoah: An open-source concurrent compacting garbage collector for openjdk
EP0881576B1 (en) Method and apparatus for generational garbage collection in a shared heap memory by means of multiple processor units
US20100011357A1 (en) System and method for garbage collection in a virtual machine
JP2003323336A (ja) ヒープメモリ管理方法およびそれを用いた計算機システム
Kotzmann et al. Escape analysis in the context of dynamic compilation and deoptimization
Bruno et al. NG2C: pretenuring garbage collection with dynamic generations for HotSpot big data applications
EP3577565B1 (en) Garbage collector
US20040193662A1 (en) Remembered-set scrubbing to remove stale entries in an incremental garbage collector
Bruening et al. Maintaining consistency and bounding capacity of software code caches
JPH09212369A (ja) 記憶域割り付け装置
GB2399897A (en) Memory recycling in computer system where the processing is stopped to identify where the data items allocated in the memory
Peiris et al. Automatically detecting" excessive dynamic memory allocations" software performance anti-pattern
Pankajakshan et al. Porting a 3D seismic modeling code (SW4) to CORAL machines
Ugawa et al. Transactional sapphire: Lessons in high-performance, on-the-fly garbage collection
CN114051610A (zh) 基于arena的存储器管理
Dragojevic et al. Dividing transactional memories by zero
Jones et al. A fast analysis for thread-local garbage collection with dynamic class loading
Peluso et al. Supports for transparent object-migration in PDES systems
Cuoq et al. Hashconsing in an incrementally garbage-collected system: a story of weak pointers and hashconsing in OCaml 3.10. 2
Wolczko et al. The influence of the object-oriented language model on a supporting architecture
Bruno et al. NG2C: Pretenuring N-Generational GC for HotSpot Big Data Applications
Veldema et al. Parallel memory defragmentation on a gpu
Shivkumar et al. Real-time MLton: A Standard ML runtime for real-time functional programs

Legal Events

Date Code Title Description
A201 Request for examination
E902 Notification of reason for refusal
E701 Decision to grant or registration of patent right
GRNT Written decision to grant
FPAY Annual fee payment

Payment date: 20120831

Year of fee payment: 7

FPAY Annual fee payment

Payment date: 20130902

Year of fee payment: 8

LAPS Lapse due to unpaid annual fee