KR101699981B1 - 외래 정보를 분할함에 의한 가상 머신 코드의 메모리 최적화 - Google Patents

외래 정보를 분할함에 의한 가상 머신 코드의 메모리 최적화 Download PDF

Info

Publication number
KR101699981B1
KR101699981B1 KR1020100116594A KR20100116594A KR101699981B1 KR 101699981 B1 KR101699981 B1 KR 101699981B1 KR 1020100116594 A KR1020100116594 A KR 1020100116594A KR 20100116594 A KR20100116594 A KR 20100116594A KR 101699981 B1 KR101699981 B1 KR 101699981B1
Authority
KR
South Korea
Prior art keywords
information
code
processor
virtual machine
location
Prior art date
Application number
KR1020100116594A
Other languages
English (en)
Other versions
KR20110060822A (ko
Inventor
커티스 이. 흐리스척
션 크리스토퍼 폴리
헨리 월턴 아담스 3세
앤드류 러셀 로우
피터 던컨 쉽턴
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 인터내셔널 비지네스 머신즈 코포레이션
Publication of KR20110060822A publication Critical patent/KR20110060822A/ko
Application granted granted Critical
Publication of KR101699981B1 publication Critical patent/KR101699981B1/ko

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/443Optimisation
    • G06F8/4434Reducing the memory space required by the program code

Landscapes

  • Engineering & Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Devices For Executing Special Programs (AREA)
  • Debugging And Monitoring (AREA)

Abstract

실행가능한 가상 머신 코드 또는 인터프리트된 코드로부터 외래 정보(extraneous information)를 분리함에 의한 메모리 최적화 방법, 컴퓨터 프로그램 제품, 및 시스템이 개시된다. 상기 외래 정보는 분리되어 저장될 수 있고, 또는 만약 그 필드에서 상기 코드를 디버깅 또는 서비스하기 위해 요구된다면, 원 코드로부터 접근될 수 있다. 이 접근법은 디버깅을 위한 비-실행 정보 및 그 필드에서 코드를 서비스하기 위해 필요한 기타 프로세스들의 접근성(accessibility)을 유지하면서, 메모리 풋프린트를 감소시킴으로써 메모리 사용량을 최적화할 수 있다.

Description

외래 정보를 분할함에 의한 가상 머신 코드의 메모리 최적화{MEMORY OPTIMIZATION OF VIRTUAL MACHINE CODE BY PARTITIONING EXTRANEOUS INFORMATION}
본 발명은 일반적으로 가상 머신 코드(virtual machine code)와 관련되고, 더 상세하게는 외래 정보(extraneous information)를 실행가능 코드로부터 분할함에 의한 가상 머신 코드의 메모리 최적화와 관련된다.
가상 머신 기술의 이점들은 널리 알려져 왔다. 이들 이점들 중에서도 하나의 호스트 플랫폼 상에 다수의 가상 머신들을 실행시킬 수 있는 기능이 있는데, 이 기능은 하드웨어의 용량을 더 잘 활용하는 한편 각각의 사용자가 "완전한" 컴퓨터의 특징들을 즐기도록 보장한다. 컴퓨터 소프트웨어의 복잡함이 증가하고 또한 일상 생활 및 사업에서 소프트웨어 시스템들에 대한 의존도가 증가함에 따라, 소프트웨어 실행에서의 고성능이 사용자들에 의해 기대되어 왔다. 가상 머신 소프트웨어의 성능은 특히 중요하다. 왜냐하면 이 소프트웨어는 흔히 메모리가 제한된 시스템들(예를 들어, 전통적인 컴퓨터 시스템보다는 더 적은 메모리를 갖는 경향이 있는 PDA들 및 스마트폰들과 같은 무선 디바이스들) 상에서 실행된다. 따라서, 실행 시간 동안 가상 머신 코드에 의한 메모리 사용량을 감소시키기 위한 노력이 기울여져 왔다. 이러한 노력의 예들에는, 네이티브 함수 호출들(native function calls)을 최소화하는 것, 네이티브 코드(native code)에 제공된 기능의 유형을 제한하는 것, 어플리케이션 크기를 감소시키는 것, 및 효율적인 코딩을 필요로 하는 것과 같은 것이 있다.
따라서, 본 발명의 실시예들은, 가상 머신 또는 인터프리트된 코드를 최적화하기 위한 방법, 컴퓨터 프로그램 제품 및 시스템을 포함한다. 상기 방법, 컴퓨터 프로그램 제품 및 시스템은, 복수의 프로그램 명령들 및 제1 외래 정보(first extraneous information)를 포함하는 코드를 수신하는 것 - 상기 코드는 가상 머신에 의해 실행하기 위한 언어로 쓰여지고, 상기 제1 외래 정보는 제1 유형의 비-실행 정보(non-executable information)임 -, 상기 제1 외래 정보를 제거(remove)하고 상기 제1 외래 정보의 위치를 참조하는 키(key)로 상기 제1 외래 정보를 대체함으로써 상기 코드를 변경(modify)하는 것, 및 상기 변경된 코드를 실행시키고, 만약 실행 동안 상기 제1 외래 정보를 요청하는 이벤트가 발생하면, 상기 이벤트에 응답하여 상기 위치에서 상기 제1 외래 정보를 찾기(locate) 위해 상기 키를 사용하는 것, 및 상기 위치로부터 상기 제1 외래 정보를 로드(load)하는 것을 포함한다.
본 발명의 실시예들에 대한 위의 이점들 및 특징들 그리고 추가 이점들 및 특징들은 본 발명에 관한 다음의 상세한 설명을 고려함으로써 분명해질 것이고, 특히 첨부되는 도면들과 함께 읽혀질 경우 더욱 분명해질 것이다. 첨부된 여러 도면들에서 유사한 참조 부호들은 유사한 컴포넌트들을 나타내기 위해 이용된다.
도 1은 본 발명의 일 실시예에 따른 가상 머신을 포함하는 예시적인 컴퓨터 시스템을 도시하는 블록도이다.
도 2는 본 발명의 제1 실시예에 따른 예시적인 분할 및 메모리 최적화 프로세스를 도시하는 블록도이다.
도 3은 본 발명의 제1 실시예에 따른 예시적인 자바 클래스 파일(Java class file) 상의 도 2의 분할 프로세스의 결과들을 도시하는 블록도이다.
도 4a 및 4b는 본 발명의 제1 실시예에 따른 분할 및 메모리 최적화 프로세스를 도시하는 흐름도이다.
도 5는 본 발명의 제2 실시예에 따른 예시적인 분할 및 메모리 최적화 프로세스를 도시하는 블록도이다.
도 6은 본 발명의 제2 실시예에 따른 예시적인 자바 클래스 파일 상의 도 5의 분할 프로세스의 결과들을 도시하는 블록도이다.
도 7a 및 7b는 본 발명의 제2 실시예에 따른 분할 및 메모리 최적화 프로세스를 도시하는 흐름도이다.
이제 도면들을 참조하면, 본 발명의 실시예들에 따른 컴퓨터 시스템 예가 도 1에 도시되어 있다. 도 1은 컴퓨터 시스템(10)을 보여주는데, 이 컴퓨터 시스템(10)은 프로세서(12), 메모리(14), 네트워크 어댑터(16), 및 자바 가상 머신(Java virtual machine)(20)을 포함한다. 이들 모두는 시스템 버스(18)에 의해 통신상으로 함께 결합되어 있다. 메모리(14)는 통상의 메모리 또는 기타 메모리 또는 스토리지 디바이스(예, RAM, 캐쉬, 플래쉬 등)에 의해 구현될 수 있고, 적절한 스토리지 용량을 포함할 수 있다. 컴퓨터 시스템(10)이 공유 메모리를 통해, 또는 기타 적절한 방법으로 대량의 적절한 통신 매체(예, WAN, LAN, 인터넷, 인트라넷, 유선, 무선 등)에 의해 하나 또는 그 이상의 기타 시스템들과 통신할 수 있도록, 네트워크 어댑터(16)가 구현될 수 있다. 전통적인 프로토콜들 또는 기타 프로토콜들을 이용하여 네트워크들 또는 기타 통신 채널들을 통해 통신하기 위해, 본 발명의 컴퓨터 시스템들은 전통적인 통신 디바이스들 또는 기타 통신 디바이스들을 포함할 수 있고, 접근을 위해 적절한 유형의 연결(예, 유선, 무선 등)을 이용할 수 있다.
자바 가상 머신(20)은 클래스 로더(class loader)(21), 예외 핸들러 모듈(exception handler module)(22), 에러 리포팅 모듈(error reporting module)(23), 실행 엔진(24) - 이 실행 엔진(24)은 인터프리터(25) 및 적시(Just-in-Time) 컴파일러(26)를 포함함 -, 클래스 라이브러리(27) 및 메모리(28)와 같은 여러 가지 컴포넌트들을 포함한다. 비록 여기서는 가상 머신(20)이 자바 가상 머신으로 논해지지만, 본 발명은 자바 기술로 한정되는 것은 아니며, 다른 기술 및 가상 머신들(예를 들어, CPython, .NET 및 공용 언어 런타임(Common Language Runtime), 패롯 가상 머신(Parrot virtual machine), 루비니우스 가상 머신(Rubinius virtual machine), 또는 기타 적절한 가상 머신)과 함께 구현될 수 있다.
클래스 로더(21)는, 예를 들어, 자바 클래스(.class) 또는 자바 아카이브(.jar) 파일과 같은 바이트코드 파일(bytecode file), 또는 CIL 바이트코드 파일과 같은 코드를 로드한다. 상기 코드는 가상 머신과 함께 사용하기에 적합한 언어로부터 컴파일된 프로그램 명령들이다. 예를 들어, CPython 가상 머신과 함께 사용하기에 적합한 언어들은 Python을 포함하고, 자바 가상 머신(JVM)과 함께 사용하기에 적합한 언어들은 자바, 클로저(Clojure), 팬(Fan), 그루비(Groovy), IBM NetRexx, JavaFX 스크립트, 자바스크립트(JavaScript), JRuby, JYthon, JScheme, Macromidia ColdFusion, Rhino, Scala 등을 포함하고, .Net 공용 언어 런타임(CLR)과 함께 사용하기에 적합한 언어는 C#, C++/CLI, 코브라(Cobra), F#, Fan, IronPython, IronRuby, J#, JScript.NET, Managed JScript, Mondrian, Nemerle, VB.NET 등을 포함하고, Parrot 가상 머신과 함께 사용하기에 적합한 언어들은 Perl 6을 포함하고, Rubinius 가상 머신과 함께 사용하기에 적합한 언어들은 Ruby를 포함한다. 상기 언어는 인터프리트된 언어 또는 컴파일된 언어일 수 있다. 예를 들어, JVM과 함께 사용하기 위한 언어는 자바스크립트(JavaScript) - 이는 일반적으로 인터프리트됨 -, 또는 그루비(Groovy) - 이는 일반적으로 컴파일됨 - 일 수 있다.
컴퓨터 시스템(10)은 처리 시스템의 형태로 구현될 수 있고, 또는 소프트웨어의 형태일 수 있다. 컴퓨터 시스템(10)은 어떤 적절한 규모의 전통적인 컴퓨터 시스템들 또는 디바이스들 또는 기타 컴퓨터 시스템들 또는 디바이스들(예, 컴퓨터 터미널들, 개인용 컴퓨터들(예, IBM-호환, 애플 매킨토시, 타블렛, 랩탑 등) 등), 셀룰러 전화기들, 개인용 데이터 보조기기들(예, Palm Pre, Treo, iPhone 등) 등에 의해 구현될 수 있고, 상업적으로 이용가능한 운영 체계(예, AIX, Linux, OSX, Sun Solaris, Unix, Windows 등) 및 상업적으로 이용가능하거나 주문형 소프트웨어(예, 브라우저 소프트웨어, 통신 소프트웨어, 워드 처리 소프트웨어 등)를 포함할 수 있다. 이들 시스템들은 정보를 입력하고 및/또는 정보를 보기 위한 표시 및 입력 디바이스들(예, 키보드, 마우스, 음성 인식 디바이스 등)의 유형들을 포함할 수 있다. 만약 소프트웨어로 구현된다면(예, 가상 이미지와 같이), 컴퓨터 시스템(10)은 기록가능한 매체(예, 자기, 광학, 플로피, DVD, CD 등) 상에서, 이용가능할 수 있다.
도 2 내지 4는 본 발명의 제1 실시예의 여러 가지 측면들을 도시한다. 이 실시예에서, 코드는, 상기 실행가능 코드로부터 상기 외래 정보를 분리함으로써 분할되며, 상기 실행가능 코드가 정상적으로 로드될 수 있도록 하기 위해 상기 외래 정보를 분리하여 저장한다. 상기 외래 정보는 필요시 단지 레이지 방식으로 로드(lazy-loaded only)될 수 있다. 이러한 접근법은 디버깅을 위해 상기 외래 정보의 접근성(accssibility)을 유지하면서 메모리 풋프린트(footprint)를 감소시키며, 그 필드에서 코드를 서비스하기 위해 필요한 기타 프로세스들을 감소시킴으로써, 메모리 사용량을 최적화한다.
도 2는 본 발명의 제1 실시예에 따라 도 1의 시스템에 의해 수행될 수 있는 예시적인 분할 및 메모리 최적화 프로세스를 도시한다. 이 프로세스에서, 코드(30)(예를 들어, 자바 클래스 파일 또는 CIL 코드 파일)는 포스트-컴파일레이션 모듈(post-compilation module)(40)에 의해 수신되는데, 이 포스트-컴파일레이션 모듈(40)에서 코드(30) 내의 외래 정보가 식별된다. 상기 외래 정보는 비-실행가능 정보, 예를 들어, 디버그 정보(debug information)(221), 주석 정보(annotation information)(222), 또는 소스 정보(source information)(223)이다. 코드(30)는 변경된 코드(35)를 생성하기 위해 상기 외래 정보를 제거함에 의해 변경되고, 데이터 스토리지 위치(예를 들어, 데이터베이스(60)), 공유 클래스 캐쉬에, 또는 네스트된 내부 클래스(nested inner-class)로서, 또는 분리된 바이너리 객체로서, 상기 외부 정보를 저장한다. 상기 스토리지 위치를 식별하는 고유의 식별 키는 변경된 코드(35) 내에 삽입된다.
실행시, 변경된 코드(35)는 정상적으로 가상 머신(20) 내에 로드된다. 만약 실행 시간 동안 상기 외래 정보에 대한 요구가 있다면, 상기 시스템은 그 특정 작업을 위해 요구되는 외래 정보의 적절한 유형의 위치를 찾고 그 외래 정보의 적절한 유형만을 로드할 뿐이다. 예를 들어, 만약 고장(fault)이 발생하면, 예외 핸들링 프로세스(22) 및 에러 리포팅 메커니즘(23)은 예외를 던지고(throw an exception) 에러를 리포트하기 위해 디버그 정보(221)를 요청하지만, 주석 정보(222) 및 소스 정보(223)를 요구하지는 않는다. 이와 유사하게, 만약 상기 코드가 리플렉션(reflection)을 사용한다면, 리플렉션 프로세스는 소스 정보(223)를 요청할 수 있지만, 디버그 정보(221)는 요청하지 않는다. 도시된 예에서, 에러 리포팅 메커니즘(23)은 스택 트레이스(stack trace)(70)를 생성하기 위해 정보의 네 부분, 즉 클래스, 메쏘드(method), 파일 및 라인 번호를 요청하는 자바 스택 트레이스 리포팅 메쏘드이다. 정상적으로는, 이 정보는 예외가 구성(construct)될 때 상기 가상 머신에 의해 파퓰레이트(populate)되지만, 이들 실시예들에서 상기 파일 및 라인 번호는 디버그 정보(221)의 일부로서 제거되었다. 이 디버그 정보(221)는 데이터베이스(60)에 저장되었다. 따라서, 예외 핸들링 프로세스(22) 및 에러 리포팅 메커니즘(23)은 디버그 정보(221)가 저장되는 스토리지 위치(60)를 발견하기 위해 상기 키를 사용하고, 그런 다음 스택 트레이스(70)가 파퓰레이트될 수 있도록 디버그 정보(221)를 로드한다.
이제 도 3을 참조하면, 예시적인 자바 클래스 파일(30)이 보여지는데, 이 자바 클래스 파일(30)은 10 개의 주요 컴포넌트들, 즉 매직 넘버(201), 버젼(202), 상수 풀(constant pool)(203), 접근 플래그들(access flags)(204), 디스 클래스(this class)(205), 수퍼 클래스(super class)(206), 인터페이스들(207), 필드들(208), 메쏘드들(methods)(209) 및 속성들(attributes)(210)을 갖는다. 상기 속성들은 디버그 정보(221), 주석 정보(222) 및 소스 정보(223)를 포함할 수 있다. 예시적인 자바 클래스 파일(30)은, 자신의 외래 정보(이 경우 디버그 정보(221), 주석 정보(222) 및 소스 정보(223)) - 이는 프로그램 명령들로부터 분할되고 스토리지 위치(60)에 저장됨 - 를 가짐으로써 변경된다. 상기 외래 정보는 변경된 자바 클래스 파일(35)에서 키(224)에 의해 대체된다. 변경된 자바 클래스 파일(35)에서 키는 상기 외래 정보가 저장된 스토리지 위치를 식별한다.
자바 기술의 맥락에서, 디버그 정보(221)는 다음과 같은 속성들을 포함할 수 있다.
SourceFile : (클래스 별) 어떠한 경로도 갖지 않는 소스 파일 명칭, 예, ClassName. java;
SourceDebugExtension : 일반적으로 미사용됨;
LineNumberTable : (메쏘드 별) 스텝 스루(step through)할 디버거 및 라인 번호들을 프린트할 예외 스택 트레이스들을 위한 라인 번호들(바이트코드 인덱스를 상기 소스 파일 내의 라인 번호에 매핑);
LocalVariableTable : (메쏘드 별) 스텝핑하면서 상기 디버거를 위한 로컬 변수들의 명칭들; 및
LocalVariableTypeTable : (메쏘드 별) 일반적인 유형들(generic types)(및 단지 일반적인 것들만)의 경우, 상기 소스 파일 내의 로컬 변수의 유형은 상기 VM 내의 유형과 다르다. 예를 들어, 상기 가상 머신은 해쉬테이블(Hashtable)을 볼 것이나, 상기 소스 파일 유형은 일반적인 해쉬테이블(generic Hashtable)<Integer, String>일 수 있다.
이 정보는 상기 코드에서의 프로그램 명령들의 정상적인 실행에는 불필요하다. 왜냐하면 그것은 일반적으로 디버깅 및 스택 트레이스들을 위해서만 사용될 뿐이고 실행 프로그램에서는 그 밖의 어떤 것도 사용되지 않기 때문이다.
자바 기술의 맥락에서, 주석 정보(222)는 다음과 같은 속성들을 포함할 수 있다.
AnnotationDefault;
RuntimeVisibleAnnotations;
RuntimeInvisibleAnnotations;
RuntimeVisibleParameterAnnotations; 및
RuntimeInvisibleParameterAnnotations.
또한 자바 기술의 맥락에서, 소스 정보(223)는 다음과 같은 속성들을 포함할 수 있다.
EnclosingMethod : 로컬 클래스들의 인클로징(enclosing) 메쏘드 식별;
Signature : 클래스들, 필드 유형들 및 메쏘드 서명들을 위한 일반적인 서명들(generic signatures) 식별;
Deprecated : 디프리케이티드(deprecated) 항목들 식별;
Synthetic : 컴파일러-일반 항목 식별; 및
InnerClasses : 내부 및 외부 클래스 관계(relationships) 식별(네스트된 것 및 유사한 것을 포함함)
이 정보는 상기 코드 내에 프로그램 명령들의 정상적인 실행에 있어서는 불필요하다. 왜냐하면 실행 가상 머신은 이 정보를 필요로 하지 않는다. 이 정보는 일반적으로 리플렉션을 위해서만 사용된다. 따라서, 리플렉션을 광범위하게 사용하는 프로그램은 이 정보의 제거에 의해 영향을 받을 수 있지만, 일반적으로 대부분의 프로그램들은 이 정보의 제거에 의해 영향을 받지 않을 것이다.
이제 도 4a 및 4b를 참조하면, 제1 실시예의 분할 및 메모리 최적화 프로세스를 위한 프로세스들(300 및 400)이 일반적으로 도시된다. 프로세스(300)는 실행 시간 이외의 시간에 수행될 수도 있고, 또는 실행시(예를 들어, 클래스가 로드될 때) 상기 시스템에 의해 수행될 수 있다. 프로세스(400)는 일반적으로 실행 시간에 수행된다. 프로세스(300)에서, 시스템(예를 들어, 도 1의 시스템)은, 단계 310에서, 예를 들어 포스트-프로세서(post-processor)에 의해 파싱(parse)되는 것에 의해 코드를 수신하고, 단계 320에서, 상기 코드 내의 외래 정보를 식별한다. 단계 330에서 상기 시스템은 상기 코드로부터 상기 외래 정보를 제거하고, 단계 340에서 데이터 스토리지 위치에 그 제거된 정보를 저장한다. 단계 350에서 상기 시스템은 상기 외래 정보의 위치를 참조하기 위해 상기 코드 내에 키(key)를 삽입한다. IBM J9 시스템과 같은 시스템에서, 이 프로세스는 자바 옵티마이저(Java Optimizer, JAPT) 클래스 매니퓰레이션 툴(class manipulation tool)과 같은 툴에 의해 수행될 수 있다.
단계 360 - 이는 선택적인 단계임 - 에서, 상기 시스템은, 직접적이지 않고 간접적으로, 예를 들어, 예외 핸들링 프로세스를 인터셉트하고 그것을 키를 사용하여 스토리지 위치에 리다이렉트(redirect)하기 위해 복수의 프로그램 명령들 중 하나 또는 그 이상을 변경함으로써, 상기 외래 정보에 접근하도록 하기 위해, 상기 코드를 재작성(rewrite)한다. 이 단계는 선택적이다. 왜냐하면, 상기 프로세스는 저장된 외래 정보(예를 들어, Throwable.getStackTrace(), Class.getDeclaredAnnotations(), 및 Class.getGenericInterfaces())를 명료하게(transparently) 로드하기 위해 네이티브 함수들(native functions)의 동작(operation)을 바꾸도록 상기 클래스 라이브러리를 변경함으로써, 다른 방법들로 수행될 수 있기 때문이다. 예를 들어, 스택 트레이스의 경우, 상기 클래스 라이브러리는 StackTraceElement에 프로그램 카운터를 저장하기 위해 변경될 수 있다. 상기 프로그램 카운터는 StackTraceElement에 의해 표현되는 메쏘드 콜이 발생하는 바이트코드 명령들 내의 인덱스이며, 상기 라인 번호 디버그 정보(info) 구조에서 상기 라인 번호를 찾기 위해 사용된다. 단계 370 - 이 단계는 선택적임 - 에서, 상기 변경된 코드는 공유 클래스 캐쉬와 같은 캐쉬 메모리에 저장될 수 있다. 그리하여 로드 시간 패널티를 감소시키기 위해 상기 클래스의 계속되는 로드들이 상기 공유 클래스 캐쉬로부터 있을 수 있도록 한다.
도 4b에 도시된 바와 같이, 실행 시간 동안, 상기 시스템은 단계 410에서 상기 변경된 코드를 로드하고, 그런 다음, 단계 420에서 외래 정보를 요구하는 이벤트(예를 들어 고장 또는 리플렉션 프로세스)의 발생 여부를 결정한다. 만약 발생하지 않는다면, 이 프로세스(400)는 종료한다. 만약 발생한다면, 단계 430의 시스템은 상기 저장 위치에서 원하는 외래 정보의 위치를 찾기 위해 상기 키를 사용하고, 단계 440에서 그것을 로드한다. 그런 다음, 상기 메모리 최적화 프로세스는 종료하고, 상기 시스템은 상기 리트리브된 외래 정보로 원하는 액션들을 수행할 수 있다. 상기 위치가 찾아지고 로드된 외래 정보는 하나 또는 그 이상의 유형의 외래 정보, 예를 들어 앞서 기술된 디버그 정보, 주석 정보, 및 소스 정보일 수 있다. 상기 시스템은 특정 목적을 위해 원하는 외래 정보만을 로드할 수 있는데, 예를 들어, 만약 상기 시스템이 스택 트레이스를 생성하고 있다면, 상기 시스템은 상기 스택 트레이스를 파퓰레이트하기 위해 필요한 디버그 정보의 위치를 찾아내어 그것만을 로드할 수 있고, 또는 상기 시스템이 리플렉션을 사용한다면, 상기 시스템은 리플렉션을 수행하기 위해 필요한 소스 정보의 위치를 찾아내어 그것만을 로드할 수 있다.
도 5 내지 7은 본 발명의 제2 실시예의 여러 가지 측면들을 도시한다. 이 실시예에서, 코드는 상기 실행가능한 코드로부터 외래 정보를 분리시키고 그 외래 정보를 폐기함으로써 분할된다. 만약 필요하다면, 상기 외래 정보는 원 코드(original code)로부터 로드될 수 있다. 이 접근법은 메모리 풋프린트를 감소시킴으로써 메모리 사용량을 최적화하는 한편, 디버깅 및 그 필드에서 코드를 서비스하기 위해 필요한 다른 프로세스들을 위해 상기 외래 정보의 접근성(accessibility)를 유지한다.
도 5는 본 발명의 제2 실시예에 따라, 도 1의 시스템에 의해 수행될 수 있는 예시적인 분할 및 메모리 최적화 프로세스를 도시한다. 이 프로세스에서, 코드(30)(예를 들어, 자바 클래스 파일 또는 CIL 코드 파일)는 가상 머신(20)에서 주문형 클래스 로더(21)에 의해 수신된다. 가상 머신(20)에서는 코드(30) 내의 외래 정보가 식별된다. 상기 외래 정보는 비-실행가능 정보, 예를 들어, 디버그 정보, 주석 정보, 또는 소스 정보이다. 코드(30)는 변경된 코드(35)를 생성하기 위해 상기 외래 정보를 제거함으로써 변경되고, 원 코드(30)의 위치를 식별하는 고유의 식별 키는 변경된 코드(35) 내에 삽입된다.
실행시, 변경된 코드(35)는 가상 머신(20) 내로 정상적으로 로드된다. 만약 실행 시간 동안 상기 외래 정보에 대한 요구가 있다면, 상기 시스템은 그 특정 작업을 위해 요구되는 외래 정보의 적절한 유형의 위치를 찾고 그것만을 로드할 수 있다. 예를 들어, 만약 고장이 발생한다면, 예외 핸들링 프로세스(22) 및 에러 리포팅 메커니즘(23)은 예외를 던지고(throw an exception) 상기 에러를 리포트하기 위해 상기 디버그 정보를 요청하지만 상기 주석 정보 및 상기 소스 정보에 대한 요구는 없다. 상기 예외 핸들링 프로세스(22) 및 에러 리포팅 메커니즘(23)은 원 코드(30)가 저장되는 스토리지 위치를 발견하기 위해 상기 키를 사용하고, 상기 스택 트레이스가 파퓰레이트될 수 있도록 상기 파일로부터 상기 디버그 정보를 로드한다. 이와 유사하게, 만약 상기 코드가 리플렉션을 사용한다면, 리플렉션 프로세스는 소스 정보를 요청할 수 있지만 상기 디버그 정보는 요청하지 않는다. 만약 상기 원 코드가 서버로부터 발생 또는 다운로드되었고 또한 로컬로 존재하지 않는다면, 그것은 재발생되거나 다시 다운로드될 수 있다.
이제 도 6을 참조하면, 예시적인 자바 클래스 파일(30)이 보여지는데, 이 자바 클래스 파일(30)은 10 개의 주요 컴포넌트들, 즉 매직 넘버(201), 버젼(202), 상수 풀(203), 접근 플래그들(204), 디스 클래스(205), 수퍼 클래스(206), 인터페이스들(207), 필드들(208), 메쏘드들(209) 및 속성들(210)을 갖는다. 상기 속성들은 디버그 정보(221), 주석 정보(222) 및 소스 정보(223)를 포함할 수 있다. 예시적인 자바 클래스 파일(30)은 자신의 외래 정보(이 경우 디버그 정보(221), 주석 정보(222) 및 소스 정보(223))를 가지는데, 이 외래 정보는 상기 프로그램 명령들로부터 분할되고 트래쉬(trash)(80) 또는 수거되는 가비지(garbage collected)에 폐기된다. 상기 외래 정보는 변경된 자바 클래스 파일(35) 내에서 키(224)에 의해 대체되는데, 변경된 자바 클래스 파일(35)은 원 코드(30)가 저장되거나 예를 들어 다운로드에 의해 그것이 리트리브가능한 위치를 식별한다.
이제 도 7a 및 7b를 참조하면, 제2 실시예의 분할 및 메모리 최적화 프로세스를 위한 프로세스들(500 및 600)이 일반적으로 보여진다. 프로세스(500)는 실행 시간 이외의 시간에 수행될 수 있고 또는 실행시(예를 들어, 클래스가 로드될 때)에 시스템에 의해 수행될 수 있다. 프로세스(600)는 일반적으로 실행시에 수행된다. 프로세스(500)에서, 시스템(예를 들어, 도 1의 시스템)은, 예를 들어, 클래스 로더에 의해 로드됨으로써 단계 510에서 원 코드를 로드하고, 단계 520에서 상기 코드 내의 외래 정보를 식별한다. 단계 530에서 상기 시스템은 상기 코드로부터 상기 외래 정보를 제거하고, 단계 540에서 상기 외래 정보를 포함하는 원 코드가 저장되거나 리트리브가능한, 위치를 참조하기 위해 상기 코드 내에 키를 삽입한다. IBM J9 시스템과 같은 시스템에서, 이 프로세스는 자바 옵티마이저(JAPT) 클래스 매니퓰레이션 툴과 같은 툴에 의해 수행될 수 있고, 또는 실행시 그것은 확장된 로딩 프로세스의 일부로서 실행 시간 J9 시스템에 의해 수행될 수 있다. 상기 실행 시간 시스템에 의해 수행될 때, 상기 변경된 코드는 상기 가상 머신 내에 저장되거나 선택적으로는 상기 캐쉬 내에 저장되는, 코드의 표현이다.
단계 550 - 이는 선택적인 단계임 - 에서, 상기 시스템은, 직접적이 아니라 간접적으로, 예를 들어, 예외 핸들링 프로세스를 인터셉트하고 그것을 상기 키를 사용하여 그 저장된 코드로 리다이렉트하기 위해 상기 복수의 프로그램 명령들 중 하나 또는 그 이상을 변경함으로써, 상기 외래 정보에 접근하도록, 상기 코드를 재작성(rewrite)한다. 이 단계는 선택적이다. 왜냐하면, 상기 프로세스는 다른 방법들, 예를 들어, Throwable.getStackTrace(), Class.getDeclaredAnnotations(), 및 Class.getGenericInterfaces()와 같은 저장된 코드로부터 상기 외래 정보를 명료하게(transparently) 로드하기 위해 네이티브 함수의 동작을 바꾸도록 상기 클래스 라이브러리를 변경함으로써, 수행될 수 있다. 예를 들어, 스택 트레이스의 경우, 상기 클래스 라이브러리는 StackTraceElement에 프로그램 카운터를 저장하기 위해 변경될 수 있다. 상기 프로그램 카운터는 StackTraceElement에 의해 표현되는 메쏘드 호출이 발생하는 바이트코드 명령들 내의 인덱스이며, 상기 라인 번호 디버그 정보 구조에서 라인 번호를 찾기 위해 사용된다. 단계 560 - 이 단계는 선택적임 - 에서, 상기 변경된 코드는 상기 공유 클래스 캐쉬와 같은 캐쉬 메모리에 저장될 수 있다. 그리하여, 로드 시간 패널티를 감소시키기 위해 상기 클래스의 계속되는 로드들이 상기 공유 캐쉬로부터 있을 수 있도록 한다.
도 7b에 도시된 바와 같이, 실행 시간 동안, 상기 시스템은 단계 610에서 상기 변경된 코드를 로드하고, 그런 다음, 단계 620에서 외래 정보를 요구하는 이벤트(예를 들어, 고장 또는 리플렉션 프로세스)의 발생 여부를 결정한다. 만약 발생하지 않는다면, 이 프로세스(600)는 종료한다. 만약 발생한다면, 단계 630에서 상기 시스템은 원 코드가 저장되거나 그것이 리트리브될 수 있는 위치에서 원하는 외래 정보의 위치를 찾기 위해 상기 키를 사용하고, 단계 640에서 그것을 로드한다. 그런 다음, 상기 메모리 최적화 프로세스는 종료하고, 상기 시스템은 상기 리트리브된 외래 정보로 원하는 액션들을 수행할 수 있다. 상기 위치가 찾아지고 로드된 외래 정보는 하나 또는 그 이상의 유형의 외래 정보, 예를 들어, 앞서 기술된 디버그 정보, 주석 정보, 및 소스 정보일 수 있다. 상기 시스템은 특정 목적을 위해 요구되는 외래 정보만을 로드할 수 있는데, 예를 들어, 만약 상기 시스템이 스택 트레이스를 생성하고 있다면, 그것은 상기 스택 트레이스를 파퓰레이트하기 위해 필요한 디버그 정보의 위치를 찾아 그것만을 로드할 수 있으며, 또는 만약 상기 시스템이 리플렉션을 사용한다면, 그것은 리플렉션을 수행하기 위해 필요한 소스 정보의 위치를 찾아 그것만을 로드할 수 있다.
당해 기술 분야에서 숙련된 자들이라면 이해할 수 있는 바와 같이, 본 발명의 측면들은 시스템, 방법, 또는 컴퓨터 프로그램 제품으로 구현될 수 있다. 따라서 본 발명의 측면들은 전적으로 하드웨어 실시예의 형태를 취할 수도 있고, 전적으로 소프트웨어 실시예(펌웨어, 상주 소프트웨어, 마이크로-코드 등을 포함함)의 형태를 취할 수도 있고, 또는 소프트웨어와 하드웨어 측면들 - 이들 모두는 일반적으로 여기서 "회로", "모듈" 또는 "시스템"으로 일컬어질 수 있음 - 을 조합하는 실시예의 형태를 취할 수 있다. 더 나아가, 본 발명의 측면들은 하나 또는 그 이상의 컴퓨터 판독가능 매체(들) - 이 컴퓨터 판독가능 매체(들)은 그 상에 구현된 컴퓨터 판독가능 프로그램 코드를 가짐 - 에 구현된 컴퓨터 프로그램 제품의 형태를 취할 수 있다.
하나 또는 그 이상의 컴퓨터 판독가능 매체(들)의 어떤 조합이든 이용될 수 있다. 상기 컴퓨터 판독가능 매체는 컴퓨터 판독가능 신호 매체 또는 컴퓨터 판독가능 스토리지 매체일 수 있다. 컴퓨터 판독가능 매체는, 예를 들어, 전자, 자기, 광학, 전자기, 적외선, 또는 반도체 시스템, 장치, 또는 디바이스, 또는 이것들의 적절한 조합일 수 있으나, 이러한 예들로 한정되는 것은 아니다. 컴퓨터 판독가능 스토리지 매체의 더 구체적인 예들에는 하나 또는 그 이상의 와이어들을 갖는 전기적 연결, 휴대용 컴퓨터 디스켓, 하드 디스크, RAM(random access memory), ROM(read-only memory), EPROM 또는 플래쉬 메모리, 광 섬유, 휴대용 CD-ROM(portable compact disc read-only memory), 광 스토리지 디바이스, 자기 스토리지 디바이스, 또는 이것들의 적절한 조합이 포함될 수 있으나, 모든 예들이 총 망라된 것은 아니다. 이 문서의 맥락에서, 컴퓨터 판독가능 스토리지 매체는 명령 실행 시스템, 장치, 또는 디바이스에 의해 사용하기 위한 프로그램 또는 명령 실행 시스템, 장치, 또는 디바이스와 함께 사용하기 위한 프로그램을 포함, 또는 저장할 수 있는 실체적인 매체일 수 있다.
컴퓨터 판독가능 신호 매체는, 예를 들어, 기저대역(baseband)으로 또는 반송파의 일부로 그 내부에 구현되는 컴퓨터 판독가능 프로그램 코드를 갖는, 전파되는 데이터 신호를 포함할 수 있다. 이러한 전파되는 신호는 전자기, 광학, 또는 이것들의 적절한 조합을 포함하는 다양한 형태들을 취할 수 있으나, 이러한 예들로 한정되는 것은 아니다. 컴퓨터 판독가능 신호 매체는 컴퓨터 판독가능 스토리지 매체가 아닌, 그리고 명령 실행 시스템, 장치, 또는 디바이스에 의해 사용하기 위한 프로그램 또는 명령 실행 시스템, 장치, 또는 디바이스와 함께 사용하기 이한 프로그램을 전달, 전파, 또는 전송할 수 있는, 컴퓨터 판독가능 매체일 수 있다. 컴퓨터 판독가능 매체 상에 구현된 프로그램 코드는 무선, 유선, 광섬유 케이블, RF 등, 또는 이것들의 적절한 조합을 사용하여 전송될 수 있으나, 이러한 예들로 한정되는 것은 아니다.
본 발명의 측면들의 작업들을 수행하기 위한 컴퓨터 프로그램 코드는, 자바, 스몰토크, C++ 등과 같은 객체 지향형 프로그래밍 언어, 및 "C" 프로그래밍 언어 또는 유사 프로그래밍 언어들과 같은 전통적인 절차 프로그래밍 언어들을 포함하는, 하나 또는 그 이상의 프로그래밍 언어들의 조합으로 작성될 수 있다. 상기 프로그램 코드는, 독립형 소프트웨어 패키지(stand-alone software package)로서, 전적으로 사용자의 컴퓨터 상에서 실행될 수도 있고, 부분적으로 사용자의 컴퓨터 상에서 실행될 수도 있으며, 사용자의 컴퓨터 상에서 부분적으로 그리고 원격 컴퓨터 상에서 부분적으로 또는 원격 컴퓨터 또는 서버 상에서 전적으로 실행될 수 있다. 후자의 시나리오에서, 상기 원격 컴퓨터는 어떤 유형의 네트워크(예를 들어, LAN 또는 WAN을 포함함)를 통해서든 상기 사용자의 컴퓨터에 연결될 수 있고, 또는 상기 연결은 외부 연결에 대해 이뤄질 수 있다(예를 들어, 인터넷 서비스 제공자를 사용하여 인터넷을 통해).
본 발명의 실시예들의 컴퓨터 시스템들을 위한 소프트웨어는 원하는 컴퓨터 언어로 구현될 수 있으며, 컴퓨터 기술 분야에서 통상의 기술을 가진 자에 의해 설명에 포함되는 기능 설명들 및 도면들에 도시된 흐름도들에 기초하여 개발될 수 있다는 것이 이해되어야 한다. 단지 예로서, 상기 소프트웨어는 C#, C++, Python, Java, 또는 PHP 프로그래밍 언어들로 구현될 수 있다. 나아가, 여러 가지 기능들을 수행하는 소프트웨어에 관한 여기서의 참조들은 소프트웨어 제어 하에서 그들 기능들을 수행하는 컴퓨터 시스템들 또는 프로세서들을 일반적으로 참조한다.
본 발명의 실시예들의 컴퓨터 시스템들은 어떤 유형의 하드웨어 및/또는 기타 처리 회로에 의해서든 달리 구현될 수도 있다. 상기 컴퓨터 시스템들의 여러 가지 기능들은 어떤 규모의 소프트웨어 모듈들 또는 유닛들, 처리 또는 컴퓨터 시스템들 및/또는 회로 사이에서 어떤 방법으로든 분배될 수 있는데, 여기서 상기 컴퓨터 또는 처리 시스템들은 서로 로컬로 또는 원격으로 배치될 수 있고 적절한 통신 매체를 통해 통신할 수 있다(예, LAN, WAN, 인트라넷, 인터넷, 하드와이어, 모뎀 연결, 무선 등).
본 발명의 측면들은 발명의 실시예들에 따른 방법들, 장치 (시스템) 및 컴퓨터 프로그램 제품들의 흐름도들 및/또는 블록도들을 참조하여 기술된다. 상기 흐름도들 및/또는 블록도들의 각각의 블록 및 상기 흐름도들 및/또는 블록도들의 블록도들의 조합들은 컴퓨터 프로그램 명령들에 의해 구현될 수 있다는 것이 이해되어야 할 것이다. 이들 컴퓨터 프로그램 명령들은 범용 컴퓨터, 전용 컴퓨터, 또는 기타 프로그램가능 데이터 처리 장치에 제공되어, 머신을 생성할 수 있다. 그리하여, 상기 명령들은 상기 컴퓨터의 프로세서 또는 기타 프로그램가능 데이터 처리 장치를 통해 실행될 때, 흐름도 및/또는 블록도의 블록 또는 블록들에 명시된 기능들/작용들을 구현하기 위한 수단들을 생성하도록 한다.
이들 컴퓨터 프로그램 명령들은 또한 컴퓨터, 기타 프로그램가능 데이터 처리 장치, 또는 기타 디바이스들에게 특정 방법으로 기능하도록 지시할 수 있는 컴퓨터 판독가능 매체에 저장될 수 있다. 그리하여, 상기 컴퓨터 판독가능 매체에 저장된 명령들은 흐름도 및/또는 블록도의 블록 또는 블록들에 명시된 기능/작용을 구현하는 명령들을 포함하는 제조 물품을 생성하도록 한다. 상기 컴퓨터 프로그램 명령들은 또한 컴퓨터, 기타 프로그램가능 데이터 처리 장치, 또는 기타 디바이스들 상에 로드되어, 일련의 동작 단계들이 상기 컴퓨터, 기타 프로그램가능 장치 또는 기타 디바이스들 상에서 수행되도록 하여 컴퓨터로 구현된 프로세스를 생성하도록 할 수 있다. 그리하여 상기 컴퓨터 또는 기타 프로그램가능 장치 상에서 실행되는 명령들이 상기 흐름도 및/또는 블록도의 블록 또는 블록들에 명시된 기능들/작용들을 구현하기 위한 프로세스들을 제공하도록 한다.
프로그램 코드를 저장 및/또는 실행하기에 적합한 처리 시스템은 바람직하게는 디스플레이 또는 모니터, 베이스(예, 프로세서, 메모리들 및/또는 내부 또는 외부 통신 디바이스들(예, 모뎀, 네트워크 카드들 등), 및 선택적 입력 디바이스들(예, 키보드, 마우스 또는 기타 입력 디바이스)를 포함함)가 갖추어진, 전통적인 컴퓨터 또는 처리 시스템들 또는 기타 컴퓨터 또는 처리 시스템들에 의해 구현될 수 있다. 상기 시스템은 직접적으로 결합되거나 시스템 버스를 통해 메모리 엘리먼트들에 간접적으로 결합된 적어도 하나의 프로세서를 포함할 수 있다. 상기 메모리 엘리먼트들은 상기 프로그램 코드의 실제 실행 동안 채용되는 로컬 메모리, 벌크 스토리지, 및 캐쉬 메모리들 - 이것들은 실행 동안 벌크 스토리지로부터 코드가 리트리브되어야 하는 횟수를 감소시키기 위해 적어도 일부 프로그램 코드의 임시 스토리지를 제공함 - 을 포함할 수 있다. 입력/출력 또는 I/O 디바이스들(이것들은 키보드들, 디스플레이들, 포인팅 디바이스들 등을 포함하나, 이러한 예들로 한정되는 것은 아님)은 직접 또는 중간의 I/O 컨트롤러들을 통해 상기 시스템에 결합될 수 있다. 네트워크 어댑터들은 또한 상기 시스템이 중간의 사설 또는 공중망들을 통해 다른 처리 시스템들 또는 원격 프린터들 또는 스토리지 디바이스들에 결합될 수 있도록 하기 위해, 네트워크 어댑터들이 또한 상기 시스템에 결합될 수 있다.
도면들에서의 흐름도 및 블록도들은 본 발명의 여러 가지 실시예들에 따른 시스템들, 방법 및 컴퓨터 프로그램 제품들의 가능한 구현들의 아키텍쳐, 기능, 및 동작을 도시한다. 이 점에서, 상기 흐름도 또는 블록도들 내의 각각의 블록은 모듈, 세그멘트, 또는 코드의 일부분을 나타낼 수 있는데, 이는 특정 논리적 기능(들)을 구현하기 위한 하나 또는 그 이상의 실행가능한 명령들을 포함한다. 또한, 몇몇 다른 구현들에서, 상기 블록에 표시된 기능들은 도면들에 표시된 순서를 벗어나서 발생할 수 있다는 것에 주목하여야 한다. 예를 들어, 연속해서 보여지는 두 개의 블록들은 사실상 실질적으로 동시에 실행될 수 있고, 또는 상기 블록들은 관련된 기능에 의존하여 때로는 역순으로 실행될 수도 있다. 또한 상기 블록도들 및/또는 흐름도의 각각의 블록, 및 상기 블록도들 및/또는 흐름도 내의 블록들의 조합들은 특수 목적의 하드웨어-기반의 시스템들 - 이것들은 특수 목적의 하드웨어 및 컴퓨터 명령들의 특정 기능들 또는 작용들, 또는 이것들의 조합들을 수행함 - 에 의해 구현될 수 있다.
여기에 사용되는 용어는 본 발명의 범위를 한정하려는 의도가 아니라 단지 특정 실시예들을 설명하기 위한 목적으로 사용되었다. 여기에 사용되는 바와 같이, "하나의", "일" 및 "한" 등의 단수 형태의 용어는, 만약 그 맥락에서 그렇지 않은 것으로 명확히 표시되어 있지 않으면, 복수 형태들도 또한 포함하는 것으로 의도된다. 나아가 "포함하다" 및/또는 "포함하는" 이라는 용어들은 본 명세서에서 사용되는 경우, 언급된 특징들, 정수들, 단계들, 동작들, 엘리먼트들, 및/또는 컴포넌트들의 존재를 명시하지만, 하나 또는 그 이상의 특징들, 정수들, 단계들, 동작들, 엘리먼트들, 컴포넌트들, 및/또는 이것들의 그룹들을 배제하지는 않는다.
이하의 청구항들에서의 대응하는 구조들, 재료들, 작용들, 및 모든 수단들 또는 단계 플러스 기능 엘리먼트들(step plus function elements)의 균등물들은, 구체적으로 청구되는 다른 청구되는 엘리먼트들과 함께 그 기능을 수행하기 위한 구조, 재료, 또는 작용을 포함하도록 의도된다. 본 발명의 설명은 예시 및 설명의 목적으로 제시된 것이지 개시된 형태로 발명의 실시예들을 총망라하거나 발명의 범위를 한정하려는 의도는 아니다. 발명의 범위 및 사상을 벗어남이 없이 많은 변경 및 변형 예들이 있을 수 있다는 것은 당해 기술 분야에서 통상의 기술을 가진 자들에게는 자명할 것이다. 상기 실시예는 발명의 원리들 및 실제 응용을 가장 잘 설명하기 위해, 그리고 당해 기술 분야에서 통상의 기술을 가진 자들이, 고려되는 특정 사용에 적합하게 다양한 변경 예들을 갖는 여러 가지 실시예들에 대해 발명을 잘 이해할 수 있도록 하기 위해, 선택되고 기술되었다.

Claims (25)

  1. 프로세서, 메모리, 네트워크 어댑터, 및 자바 가상 머신(Java virtual machine)을 포함하는 컴퓨터 시스템에서 구현되는 가상 머신 또는 인터프리트된 코드를 최적화하기 위한 방법에 있어서, 상기 방법은:
    복수의 프로그램 명령들 및 제1 외래 정보(first extraneous information)를 포함하는 코드 ― 상기 코드는 가상 머신에 의한 실행을 위한 언어로 작성되고, 상기 제1 외래 정보는 제1 유형의 비-실행 정보(non-executable information)임 ― 를, 상기 프로세서에 의해서, 수신하는 단계;
    상기 제1 외래 정보를 제거하고 상기 제1 외래 정보의 위치를 참조하는 키(key)로 상기 제1 외래 정보를 대체함으로써 상기 코드를, 상기 프로세서에 의해서, 변경(modify)하는 단계; 및
    상기 프로세서에 의해서, 상기 변경된 코드를 실행하고, 만약 실행 동안 상기 제1 외래 정보를 요청하는 이벤트 ― 상기 이벤트는 고장(fault)임 ― 가 발생한다면, 상기 이벤트에 응답하여 상기 위치에서 상기 제1 외래 정보를 찾기(locate) 위해 상기 키를 사용하며, 상기 위치로부터 상기 제1 외래 정보를 로드(load)하는 단계를 포함하는
    방법.
  2. 삭제
  3. 청구항 1에 있어서, 상기 변경하는 단계는,
    예외 핸들링 프로세스(exception handling process)를, 상기 프로세서에 의하여, 인터셉트하고 상기 키를 사용하여 상기 제1 외래 정보의 위치로 상기 예외 핸들링 프로세스를 리다이렉트(redirect)하기 위해, 상기 복수의 프로그램 명령들 중 하나 또는 그 이상을, 상기 프로세서에 의하여, 변경하는 단계를 더 포함하는
    방법.
  4. 청구항 1에 있어서, 상기 코드는 제2의 외래 정보를 포함하고, 상기 제2의 외래 정보는 제2 유형의 비-실행 정보이고, 상기 제1 및 제2 유형의 정보는 서로 다른
    방법.
  5. 삭제
  6. 청구항 1에 있어서, 상기 코드는 자바 클래스 파일(Java class file) 또는 자바 아카이브(Java Archive, JAR) 파일이고, 상기 복수의 프로그램 명령들은 자바 바이트코드(Java bytecode instructions) 명령들인
    방법.
  7. 청구항 1에 있어서, 상기 코드는 .NET 코드 파일이고, 상기 복수의 프로그램 명령들은 공용 중간 언어(Common Intermediate Language, CIL) 바이트코드 명령들인
    방법.
  8. 삭제
  9. 청구항 1에 있어서, 상기 위치는 스토리지 위치이고, 상기 변경하는 단계는 상기 스토리지 위치에 상기 제거된 제1 외래 정보를, 상기 프로세서에 의해서, 저장하는 단계를 더 포함하는
    방법.
  10. 청구항 1에 있어서, 상기 위치는 상기 코드가 저장된 스토리지 위치이고, 상기 로드하는 단계는 상기 스토리지 위치로부터 상기 코드를, 상기 프로세서에 의해서, 로드하는 단계를 포함하는
    방법.
  11. 삭제
  12. 프로세서, 메모리, 네트워크 어댑터, 및 자바 가상 머신(Java virtual machine)을 포함하는 컴퓨터 시스템에서 구현되는 가상 머신 또는 인터프리트된 코드를 최적화하기 위한 방법을 수행하도록 상기 프로세서에 의한 실행을 위한 컴퓨터 프로그램 명령들을 저장하는 컴퓨터 판독가능 스토리지 매체로서, 상기 방법은:
    가상 머신 환경에서 복수의 프로그램 명령들 및 제1 외래 정보(first extraneous information)를 포함하는 코드 ― 상기 코드는 상기 가상 머신에 의한 실행을 위한 언어로 작성되고, 상기 제1 외래 정보는 제1 유형의 비-실행 정보임 ― 를, 상기 프로세서에 의해서, 수신하는 단계;
    상기 제1 외래 정보를 제거하고 상기 제1 외래 정보를 상기 제1 외래 정보의 위치를 참조하는 키(key)로 대체함으로써 상기 코드를, 상기 프로세서에 의해서, 변경하는 단계; 및
    상기 변경된 코드를 실행하고, 만약 실행 동안 상기 제1 외래 정보를 요청하는 이벤트가 발생하면, 상기 이벤트에 응답하여 상기 위치에서 상기 제1 외래 정보를 찾기(locate) 위해 상기 키를 사용하고, 상기 위치로부터 상기 제1 외래 정보를, 상기 프로세서에 의해서, 로드하는 단계를 포함하는
    컴퓨터 판독가능 스토리지 매체.
  13. 삭제
  14. 삭제
  15. 삭제
  16. 삭제
  17. 삭제
  18. 삭제
  19. 삭제
  20. 삭제
  21. 가상 머신 또는 인터프리트된 코드를 최적화하기 위한 방법을 수행하기 위해, 프로세서, 메모리, 네트워크 어댑터, 및 자바 가상 머신(Java virtual machine)을 포함하는 컴퓨터 시스템으로서, 상기 방법은:
    가상 머신 환경에서 복수의 프로그램 명령들 및 제1 외래 정보(first extraneous information)를 포함하는 코드 ― 상기 코드는 상기 가상 머신에 의한 실행을 위한 언어로 작성되고, 상기 제1 외래 정보는 제1 유형의 비-실행 정보(non-executable information)임 ― 를, 상기 프로세서에 의해서, 로드(load)하는 단계;
    상기 제1 외래 정보를 제거하고 상기 제1 외래 정보를 상기 제1 외래 정보의 위치를 참조하는 키(key)로 대체함으로써 상기 코드를, 상기 프로세서에 의해서, 변경하는 단계; 및
    상기 변경된 코드를 실행하고, 만약 실행 동안 상기 제1 외래 정보를 요청하는 이벤트가 발생하면, 상기 이벤트에 응답하여 상기 위치에서 상기 제1 외래 정보를 찾기(locate) 위해 상기 키를 사용하고, 상기 위치로부터 상기 제1 외래 정보를, 상기 프로세서에 의해서, 로드하는 단계를 포함하는
    컴퓨터 시스템.
  22. 삭제
  23. 삭제
  24. 삭제
  25. 삭제
KR1020100116594A 2009-11-30 2010-11-23 외래 정보를 분할함에 의한 가상 머신 코드의 메모리 최적화 KR101699981B1 (ko)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US12/627,206 2009-11-30
US12/627,206 US8627303B2 (en) 2009-11-30 2009-11-30 Memory optimization of virtual machine code by partitioning extraneous information

Publications (2)

Publication Number Publication Date
KR20110060822A KR20110060822A (ko) 2011-06-08
KR101699981B1 true KR101699981B1 (ko) 2017-01-26

Family

ID=44069822

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020100116594A KR101699981B1 (ko) 2009-11-30 2010-11-23 외래 정보를 분할함에 의한 가상 머신 코드의 메모리 최적화

Country Status (4)

Country Link
US (1) US8627303B2 (ko)
JP (1) JP5602597B2 (ko)
KR (1) KR101699981B1 (ko)
CN (1) CN102081546B (ko)

Families Citing this family (32)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8701088B2 (en) * 2010-05-28 2014-04-15 Red Hat, Inc. Generating backtracing information for software debugging of software programs running on virtual machines
JP5466601B2 (ja) * 2010-08-31 2014-04-09 インターナショナル・ビジネス・マシーンズ・コーポレーション コード生成方法、システム及びプログラム
US8375443B1 (en) * 2011-09-27 2013-02-12 Google Inc. Code annotations for preventing access to unsafe functionality
US9027075B2 (en) * 2011-09-29 2015-05-05 Oracle International Corporation Enforcing security rules at runtime
US9183113B2 (en) 2011-09-29 2015-11-10 Oracle International Corporation Debugging analysis in running multi-user systems
US9111033B2 (en) 2012-04-17 2015-08-18 International Business Machines Corporation Compiling source code for debugging with user preferred snapshot locations
US8910126B2 (en) 2012-04-18 2014-12-09 International Business Machines Corporation Compiling source code for debugging with variable value restoration based on debugging user activity
US9274772B2 (en) 2012-08-13 2016-03-01 Microsoft Technology Licensing, Llc. Compact type layouts
US9122794B2 (en) 2012-10-30 2015-09-01 Oracle International Corporation System and method for debugging domain specific languages
US9104797B1 (en) * 2013-03-21 2015-08-11 Intuit Inc. Efficient cloud-based annotation of crash reports
CN103413069B (zh) * 2013-07-08 2016-09-07 北京深思数盾科技股份有限公司 一种保护面向对象语言编写的软件的方法
CN103413073B (zh) * 2013-07-09 2016-01-20 北京深思数盾科技有限公司 一种保护java可执行程序的方法及设备
CN103413075B (zh) * 2013-07-10 2016-05-04 北京深思数盾科技股份有限公司 一种通过虚拟机保护java可执行程序的方法及设备
US9146834B2 (en) 2013-08-22 2015-09-29 Oracle International Corporation Targeted cloud-based debugging
US9721092B2 (en) 2014-03-27 2017-08-01 International Busines Machines Corporation Monitoring an application in a process virtual machine
US9772865B2 (en) * 2015-02-23 2017-09-26 Futurewei Technologies, Inc. On-demand loading of dynamic scripting language code for reduced memory usage
US9916220B2 (en) * 2015-03-26 2018-03-13 EMC IP Holding Company LLC Smart logging of trace data for storage systems
US10310831B2 (en) * 2015-07-17 2019-06-04 Enhance, Inc. Method and system for modifying machine instructions within compiled software
US9626171B2 (en) 2015-07-24 2017-04-18 Oracle International Corporation Composing a module system and a non-module system
US10078497B2 (en) 2015-07-24 2018-09-18 Oracle International Corporation Bridging a module system and a non-module system
GB2541400B (en) * 2015-08-17 2017-11-15 Advanced Risc Mach Ltd Tracing of exception handling events
US10104090B2 (en) * 2015-08-25 2018-10-16 Oracle International Corporation Restrictive access control for modular reflection
US10191753B2 (en) 2016-03-30 2019-01-29 Oracle International Corporation Generating verification metadata and verifying a runtime type based on verification metadata
US10394528B2 (en) 2016-03-30 2019-08-27 Oracle International Corporation Returning a runtime type loaded from an archive in a module system
US10360008B2 (en) 2016-09-16 2019-07-23 Oracle International Corporation Metadata application constraints within a module system based on modular encapsulation
US10387142B2 (en) 2016-09-16 2019-08-20 Oracle International Corporation Using annotation processors defined by modules with annotation processors defined by non-module code
JP6845429B2 (ja) 2017-03-15 2021-03-17 富士通株式会社 コンパイラプログラム、情報処理装置およびコンパイル方法
US10848410B2 (en) 2017-03-29 2020-11-24 Oracle International Corporation Ranking service implementations for a service interface
WO2021021126A1 (en) 2019-07-30 2021-02-04 Hewlett-Packard Development Company, L.P. Hash map of executable control blocks
CN112566307B (zh) * 2019-09-10 2022-11-04 酷矽半导体科技(上海)有限公司 安全显示系统及安全显示方法
JP2023018290A (ja) * 2021-07-27 2023-02-08 富士通株式会社 解析プログラム、解析装置、及び解析方法
CN115328690B (zh) * 2022-10-13 2023-02-17 北京登临科技有限公司 异常处理方法、计算机可读介质及电子设备

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2004054807A (ja) * 2002-07-24 2004-02-19 Hitachi Ltd 情報処理方法および装置
EP1491999A2 (en) * 2003-06-26 2004-12-29 Microsoft Corporation Software development infrastructure
US20090172648A1 (en) * 2007-12-28 2009-07-02 Gerginov Georgi A Byte code analysis library

Family Cites Families (13)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP3352893B2 (ja) * 1996-12-11 2002-12-03 株式会社日立製作所 デバッグ情報作成方法、デバッグ方法及びデバッグシステム
WO2000034866A1 (fr) * 1998-12-07 2000-06-15 Sony Corporation Ordinateur, support d'enregistrement stockant un programme de traitement d'exceptions et procede de traitement d'exceptions
JP2001236243A (ja) * 2000-02-22 2001-08-31 Nec Microsystems Ltd デバッグ方法、および、デバッグ用プログラムを記録した記録媒体
US6857063B2 (en) 2001-02-09 2005-02-15 Freescale Semiconductor, Inc. Data processor and method of operation
EP1387265A1 (en) 2002-08-02 2004-02-04 Telefonaktiebolaget L M Ericsson (Publ) Optimised code generation
US7225431B2 (en) 2002-10-24 2007-05-29 International Business Machines Corporation Method and apparatus for setting breakpoints when debugging integrated executables in a heterogeneous architecture
WO2004040445A1 (en) 2002-10-29 2004-05-13 Freescale Semiconductor, Inc. Method and apparatus for selectively optimizing interpreted language code
US7631356B2 (en) * 2005-04-08 2009-12-08 Microsoft Corporation System and method for foreign code detection
US8453132B2 (en) 2006-07-28 2013-05-28 Hewlett-Packard Development Company, L.P. System and method for recompiling code based on locality domain and thread affinity in NUMA computer systems
US7475214B2 (en) 2006-08-16 2009-01-06 International Business Machines Corporation Method and system to optimize java virtual machine performance
CN100485637C (zh) 2006-10-13 2009-05-06 中兴通讯股份有限公司 一种基于嵌入式应用系统实现硬件寄存器的方法
CN100474266C (zh) 2007-04-24 2009-04-01 上海华龙信息技术开发中心 一种用于数字信号处理器的调试系统及其调试方法
US8286152B2 (en) 2007-08-22 2012-10-09 International Business Machines Corporation Systems, methods, and computer products for just-in-time compilation for virtual machine environments for fast application startup and maximal run-time performance

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2004054807A (ja) * 2002-07-24 2004-02-19 Hitachi Ltd 情報処理方法および装置
EP1491999A2 (en) * 2003-06-26 2004-12-29 Microsoft Corporation Software development infrastructure
US20090172648A1 (en) * 2007-12-28 2009-07-02 Gerginov Georgi A Byte code analysis library

Also Published As

Publication number Publication date
KR20110060822A (ko) 2011-06-08
US8627303B2 (en) 2014-01-07
JP5602597B2 (ja) 2014-10-08
CN102081546A (zh) 2011-06-01
JP2011118901A (ja) 2011-06-16
US20110131561A1 (en) 2011-06-02
CN102081546B (zh) 2013-12-18

Similar Documents

Publication Publication Date Title
KR101699981B1 (ko) 외래 정보를 분할함에 의한 가상 머신 코드의 메모리 최적화
CN110096338B (zh) 智能合约执行方法、装置、设备及介质
US10089119B2 (en) API namespace virtualization
US10620926B2 (en) Linking optimized entry points for local-use-only function pointers
US10606574B2 (en) Executing optimized local entry points and function call sites
US10585652B2 (en) Compiling optimized entry points for local-use-only function pointers
US10209972B2 (en) Executing optimized local entry points
US10360005B2 (en) Local function call tailoring for function pointer calls
US10579353B2 (en) Loading optimized local entry points for local-use-only function pointers
US10534594B2 (en) Optimized entry points and local function call tailoring for function pointers
US20110314459A1 (en) Compiler with user-defined type inference rules
CN110059456B (zh) 代码保护方法、代码保护装置、存储介质与电子设备
US20180113689A1 (en) Local Function Call Site Optimization
CN106033370B (zh) 64位Java虚拟机的实现方法及装置
US20180113697A1 (en) Executing Local Function Call Site Optimization
CN111767056A (zh) 一种源码编译方法、可执行文件运行方法及终端设备
US20210141613A1 (en) Systems and/or methods for error-free implementation of non-java program code on special purpose processors
US10102109B2 (en) Exception resolution in a software development session
CN107632934B (zh) 一种C-sharp中函数复制方法及装置
US11144288B1 (en) System and method for compiling rules set into bytecode using switch and class hierarchies
US20150220310A1 (en) Object field optimization
CN116010100A (zh) 区块链系统中的合约调用方法、装置、设备及存储介质
CN117540124A (zh) 埋点数据生成方法、系统、计算设备及存储介质
CN118151934A (zh) 代码编译方法、装置、电子设备及计算机可读存储介质
CN114547559A (zh) 符号混淆方法、装置、介质和计算设备

Legal Events

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