特許第6505700号(P6505700)IP Force 特許公報掲載プロジェクト 2022.1.31 β版

知財求人 - 知財ポータルサイト「IP Force」

▶ オラクル・インターナショナル・コーポレイションの特許一覧

<>
  • 特許6505700-ランタイムメモリスロットリング 図000002
  • 特許6505700-ランタイムメモリスロットリング 図000003
  • 特許6505700-ランタイムメモリスロットリング 図000004
  • 特許6505700-ランタイムメモリスロットリング 図000005
< >
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】6505700
(24)【登録日】2019年4月5日
(45)【発行日】2019年4月24日
(54)【発明の名称】ランタイムメモリスロットリング
(51)【国際特許分類】
   G06F 9/445 20180101AFI20190415BHJP
   G06F 9/448 20180101ALI20190415BHJP
   G06F 8/41 20180101ALI20190415BHJP
【FI】
   G06F9/445 150
   G06F9/448 100
   G06F8/41 170
【請求項の数】13
【全頁数】12
(21)【出願番号】特願2016-534581(P2016-534581)
(86)(22)【出願日】2014年6月30日
(65)【公表番号】特表2016-528638(P2016-528638A)
(43)【公表日】2016年9月15日
(86)【国際出願番号】US2014044827
(87)【国際公開番号】WO2015023366
(87)【国際公開日】20150219
【審査請求日】2017年6月26日
(31)【優先権主張番号】61/866,223
(32)【優先日】2013年8月15日
(33)【優先権主張国】US
(73)【特許権者】
【識別番号】502303739
【氏名又は名称】オラクル・インターナショナル・コーポレイション
(74)【代理人】
【識別番号】110001195
【氏名又は名称】特許業務法人深見特許事務所
(72)【発明者】
【氏名】ドリスコル,ジェイムズ・ジョージ
【審査官】 三坂 敏夫
(56)【参考文献】
【文献】 特開2009−110213(JP,A)
【文献】 特表2002−522844(JP,A)
【文献】 米国特許出願公開第2013/0086625(US,A1)
【文献】 特開2000−242551(JP,A)
【文献】 中島 震 他,「リファクタリングの正しさのESC/Java2による形式検証」,電子情報通信学会技術研究報告,日本,社団法人電子情報通信学会,2006年 1月26日,第105巻 第596号,第7頁-第12頁
(58)【調査した分野】(Int.Cl.,DB名)
G06F 8/00− 8/77
9/44− 9/451
(57)【特許請求の範囲】
【請求項1】
コンピュータ読取可能命令を含むコンパイラプログラムであって、前記コンピュータ読取可能命令は、プロセッサによって実行されると、前記プロセッサにメモリ管理ポリシーを実行時に実現させるモジュールを生成するものであり
前記モジュールの生成は、
ソフトウェアコードのコンパイルの開始に応答して構文ツリーを受取ることと、
前記構文ツリー内の複数のコールを識別することと、
複数のメモリ変更済みコールを作成するために、前記複数のコールの各々を対応するメモリ変更済みコールにより変更することとを含み、各メモリ変更済みコールはメモリ管理クラスとリンクされ、前記変更することは、前記ソフトウェアコードのコンパイル中に生じ、さらに、
前記複数のコールの各々の変更に引続いて、前記複数のメモリ変更済みコールをコンパイルしてバイトコードを生成することを含み、
前記モジュールは、実行時に
メモリ変更済みコールを実行することと、
前記メモリ変更済みコールがメモリポリシーを満たすかどうかを判定することと、
前記メモリ変更済みコールがメモリポリシーを満たさない場合、メモリ例外を生成することとを実行するコンパイラプログラム。
【請求項2】
前記モジュールの生成はさらに、前記メモリ変更済みコールがメモリポリシーを満たさない場合、前記バイトコードの生成を停止させることを含む、請求項1に記載のコンパイラプログラム。
【請求項3】
前記変更することは、コンパイルされていないソフトウェアコードに1つ以上のアノテーションを付加することを含み、前記アノテーションは、操作クラスが呼出されるべきであることを示す、請求項1または2に記載のコンパイラプログラム。
【請求項4】
前記コンパイルされていないソフトウェアコードは、GROOVY言語として書込まれる、請求項3に記載のコンパイラプログラム。
【請求項5】
前記バイトコードは、JAVA仮想マシンによってマシンコードに変換される、請求項1〜4のいずれか1項に記載のコンパイラプログラム。
【請求項6】
前記メモリポリシーは、JAVAメモリ制約に基づく、請求項1〜5のいずれか1項に記載のコンパイラプログラム。
【請求項7】
前記ソフトウェアコードは、リモートの相手から受取られる、請求項1〜6のいずれか1項に記載のコンパイラプログラム。
【請求項8】
メモリ管理ポリシーを実行時に実現する方法であって、当該方法は、
ソフトウェアコードのコンパイルの開始に応答して構文ツリーを受取ることと、
前記構文ツリー内の複数のコールを識別することと、
複数のメモリ変更済みコールを作成するために、前記複数のコールの各々を対応するメモリ変更済みコールにより変更することとを含み、各メモリ変更済みコールはメモリ管理クラスとリンクされ、前記変更することは、前記ソフトウェアコードのコンパイル中に生じ、さらに、
前記複数のコールの各々の変更に引続いて、前記複数のメモリ変更済みコールをコンパイルしてバイトコードを生成することを含み、
前記複数のメモリ変更済みコールをコンパイルすることは、
メモリ変更済みコールを実行することと、
前記メモリ変更済みコールがメモリポリシーを満たすかどうかを判定することと、
前記メモリ変更済みコールがメモリポリシーを満たさない場合、メモリ例外を生成することとを含む、方法。
【請求項9】
ソフトウェアコンパイラであって、前記ソフトウェアコンパイラの命令は、プロセッサに結合されたメモリ装置に格納され、前記プロセッサによって実行されるとモジュールを生成するものであり、前記ソフトウェアコンパイラは、
ソフトウェアコードのコンパイルの開始に応答して構文ツリーを受取り、前記構文ツリー内の複数のコールを識別する識別モジュールと、
複数のメモリ変更済みコールを作成するために前記複数のコールの各々を対応するメモリ変更済みコールにより変更する変更モジュールとを含み、各メモリ変更済みコールはメモリ管理クラスとリンクされ、前記変更は、前記ソフトウェアコードのコンパイル中に生じ、さらに、
前記複数のコールの各々の変更に引続いて、前記複数のメモリ変更済みコールをコンパイルしてバイトコードを生成するコンパイラモジュールを含み、
前記モジュールは、実行時に
メモリ変更済みコールを実行することと、
前記メモリ変更済みコールがメモリポリシーを満たすかどうかを判定することと、
前記メモリ変更済みコールがメモリポリシーを満たさない場合、メモリ例外を生成することとを実行する、ソフトウェアコンパイラ。
【請求項10】
前記モジュールはさらに、前記メモリ変更済みコールがメモリポリシーを満たさない場合、前記バイトコードの生成を停止させる、請求項9に記載のソフトウェアコンパイラ。
【請求項11】
前記変更することは、コンパイルされていないソフトウェアコードに1つ以上のアノテーションを付加することを含み、前記アノテーションは、操作クラスが呼出されるべきであることを示す、請求項9または10に記載のソフトウェアコンパイラ。
【請求項12】
前記コンパイルされていないソフトウェアコードは、GROOVY言語として書込まれる、請求項11に記載のソフトウェアコンパイラ。
【請求項13】
前記バイトコードは、JAVA仮想マシンによってマシンコードに変換される、請求項9〜12のいずれか1項に記載のソフトウェアコンパイラ。
【発明の詳細な説明】
【技術分野】
【0001】
関連する出願の相互参照
本願は、2013年8月15日付けで提出された仮特許出願番号第61/866,223号の優先権を主張し、その内容を引用によって本明細書に援用する。
【0002】
分野
一実施形態は、概してコンピュータシステムに、特にソフトウェア命令をコンパイルするコンピュータシステムに向けられる。
【背景技術】
【0003】
背景情報
すべての種類のコンピュータシステムについて、メモリは限定されたリソースであり得る。コンピューティングシステムがどれほど高速になっても、ソフトウェアアプリケーションを実行するために有限量のメモリに常に依存している。その結果、ソフトウェア開発者は、ソフトウェアアプリケーションを書込んだり開発するときには、利用可能なメモリリソースを典型的に考慮する。
【0004】
JAVA(登録商標)プログラミング言語は、一度書けばどこでも実行できる移植性、マルチスレッド化プログラミングのための移植可能サポート、リモートメソッド起動およびガベージコレクションを含む分散型プログラミングのサポートなどの、大規模分散型システムの開発者の興味を引くいくつかの特徴を呈する。しかしながら、JAVAは、メモリが割り当ておよび割り当て解除されるやり方が、多くの従来のプログラミング言語とは異なる。CおよびC++などの多くのプログラミング言語は、アプリケーションプログラマ/開発者によるメモリの割り当ておよび割り当て解除を明白に考慮に入れている。対照的に、JAVA仮想マシン(VM)は、JAVAアプリケーションのプログラマにとって故意に不透明な構造によってメモリを管理する。メモリを使い切ったあるスレッドは他の実行中のスレッドを壊す可能性があるため、この不透明性は、サーバVMなどの共用ユーザ環境においてスクリプトを実行する際に問題となる。このスレッド間コンタミネーション(contamination)は、JAVA VM全体をシャットダウンさせる可能性がある。
【発明の概要】
【課題を解決するための手段】
【0005】
概要
一実施形態は、ソフトウェアコードのコンパイルの開始に応答して構文ツリーを受取るとメモリ管理ポリシーを実行時(runtime)に実現するシステムである。システムは、構文ツリー内の複数のコールを識別し、各複数のコールを対応するメモリ変更済みコールにより変更して、複数のメモリ変更済みコールを作成する。各メモリ変更済みコールはメモリ管理クラスとリンクされ、変更は、ソフトウェアコードのコンパイル中に生じる。複数のコールの各々の変更に引続いて、システムは、複数のメモリ変更済みコールをコンパイルしてバイトコードを生成する。
【図面の簡単な説明】
【0006】
図1】本発明の実施形態に係るコンピュータサーバ/システムのブロック図である。
図2】一実施形態に従って実行時にメモリをスロットリングする際の図1のメモリスロットリングモジュールの機能のフローチャートである。
図3】別の実施形態に従って実行時にメモリをスロットリングする際の図1のメモリスロットリングモジュールの機能のフローチャートである。
図4】別の実施形態に従ってコンパイル中に変更された構文ツリーを用いて作成されたバイトコードを実行するための図1のメモリスロットリングモジュールの機能のフローチャートである。
【発明を実施するための形態】
【0007】
詳細な説明
一実施形態は、メモリ内のプログラムをコンパイルしつつ、新たなオブジェクトを作成するすべてのコールを遮断し、JAVA VMメモリの注意事項/制約に鑑みて新たなオブジェクトを作成することができるかどうかをメモリポリシーに基づいて判定する。新たなオブジェクトの作成がメモリに悪影響を与えない場合は、オブジェクトを作成することができる。メモリ内オブジェクトの意図しない制御不能な作成(run-away creation)を阻止することによって、実施形態は、マルチユーザサーバ上で実行されるスクリプトをエンドユーザが入力することが可能となるシステムの安定性および性能を著しく向上させる。
【0008】
図1は、本発明の実施形態に係るコンピュータサーバ/システム10のブロック図である。単一のシステムとして示されているが、システム10の機能は分散型システムとして実現することができる。さらに、本明細書に開示される機能は、ネットワークで互いに結合され得る別個のサーバまたは装置上で実現することができる。さらに、システム10の1つ以上のコンポーネントは含まれなくてもよい。たとえば、ユーザクライアントの機能について、システム10は、プロセッサ、メモリおよびディスプレイを含むスマートフォンであってもよいが、図1に示される他のコンポーネントのうち1つ以上を含まなくてもよい。
【0009】
システム10は、情報を通信するためのバス12または他の通信機構と、情報を処理するためにバス12に結合されたプロセッサ22とを含む。プロセッサ22は、いずれかの種類の汎用または特定用途プロセッサであり得る。システム10は、情報とプロセッサ22によって実行される命令とを格納するためのメモリ14をさらに含む。メモリ14は、ランダムアクセスメモリ(RAM)、読取専用メモリ(ROM)、磁気もしくは光ディスクなどのスタティックストレージ、またはいずれかの他の種類のコンピュータ読取可能媒体のいずれかの組合せで構成することができる。システム10は、ネットワークへのアクセスを提供するために、ネットワークインターフェイスカードなどの通信装置20をさらに含む。したがって、ユーザは、直接的に、またはネットワークもしくはいずれかの他の方法によってリモートで、システム10と接続し得る。
【0010】
コンピュータ読取可能媒体は、プロセッサ22によってアクセスすることができ、揮発性媒体および不揮発性媒体の両方、取外し可能な媒体および取外し不可能な媒体、ならびに通信媒体を含むいずれかの利用可能な媒体であり得る。通信媒体は、コンピュータ読取可能な命令、データ構造、プログラムモジュール、または搬送波もしくは他の移送機構などの変調されたデータ信号中の他のデータを含んでもよく、いずれかの情報配信媒体を含む。
【0011】
プロセッサ22はさらに、バス12によって液晶ディスプレイ(LCD)などのディスプレイ24に結合される。キーボード26およびコンピュータマウスなどのカーソル制御デバイス28がバス12にさらに結合されて、ユーザがシステム10と接続することが可能となる。
【0012】
一実施形態では、メモリ14は、プロセッサ22によって実行されると機能を提供するソフトウェアモジュールを格納する。モジュールは、オペレーティングシステム機能をシステム10に提供するオペレーティングシステム15を含む。モジュールは、実行時にメモリをスロットリングするためのメモリスロットリングモジュール16と、本明細書に開示されるすべての他の機能とをさらに含む。システム10は、より大きなシステムの一部であり得る。したがって、システム10は、1つ以上の付加的な機能モジュール18を含んで、付加的なGROOVY(登録商標)またはJAVA関連機能などの付加的な機能を含むことができる。データベース17はバス12に結合されて、モジュール16および18に集中記憶装置を提供する。
【0013】
一実施形態は、コンパイルプロセス中に構文ツリーの変更を可能にするプログラミング言語を使用し、1つ以上のメモリスロットリングルール(以下「メモリポリシー」と称する)を実現する。一例として、ユーザは、コンパイルおよび実行のためにリモートコンピュータシステムからサーバにコードを送信し得る。このサーバは、ユーザとは別個の第三者によって操作されてもよく、第三者は、ある動作がユーザのコードによって行なわれることを防ぐメモリポリシーを強化することを所望し得る。(サーバに対してリモートまたはローカルな)ユーザによって送信されたコードはメモリポリシー機能を含んでいないことがあるが、サーバは、ユーザによって供給されたコードに基づいて構文ツリーにおけるメソッドコールを変更し得る。構文ツリーがコードに基づいて作成されると、構文ツリーの解析が行なわれ得る。解析は、メモリポリシーに従って厳しく禁止される様々なメソッド、コンストラクタアクセス、および/またはプロパティアクセスを識別することができる。メモリポリシーのこれらの妨害は、コードがバイトコードにコンパイルされるのを妨げることがあり、例外が出力されることになり得る。例外の表示はユーザに提示され得る。
【0014】
一実施形態では、プログラミング言語は「GROOVY」プログラミング言語、またはバイトコード(またはマシンコード)が生成される前のコンパイルプロセス中に構文ツリーへのアクセスを許可する何らかの他のプログラミング言語である。GROOVYは、JAVAプラットフォームのためのオブジェクト指向プログラミング言語である。一般に、GROOVYはJAVAの上位セットであり、したがってJAVAコードはGROOVYにおいて構文的に有効である可能性がある。GROOVYは、JAVAにおいて利用可能なものに加えて、付加的な構文および特徴を含む。JAVAと同様に、GROOVYコードはバイトコードにコンパイルすることができる。このバイトコードは、仮想マシン(VM)によってマシンコードに変換することができる。
【0015】
GROOVYコードがコンパイルされているとき、バイトコードが生成される前に、抽象構文ツリー(abstract syntax tree:AST)がコードに基づいて作成される。構文ツリーの形態にある間、実施形態は、バイトコードが作成される前にASTを編集する。したがって、バイトコードの作成、およびバイトコードが実行時にどのように実行することになるかに影響することになるASTに対して様々な変更をなすことができる。GROOVYを用いる代わりに、他の実施形態は、バイトコード(またはマシンコード)にコンパイルする前の構文ツリーレベルでのコードの編集を考慮に入れたいずれかのプログラミング言語を用いることができる。
【0016】
一般に、GROOVYを用いる実施形態は以下の機能を含む。(1)(自動的にまたは手作業で)GROOVYコードに配置されるアノテーション(annotation)、(2)メソッドおよびプロパティアクセスの書直しを行なうAST操作クラス、および(3)実行時にメモリ制約を強化するオプションのQuotaPolicyクラス。3つの部分はすべて、用途(たとえば埋込み使用とスタンドアロン使用と)の違いを考慮に入れるために複数の重複する実現例を有することができる。
【0017】
一実施形態のアノテーションは、標準的なGROOVY ASTアノテーションである。GROOVY AST操作クラスが呼出されるべきであることを、(コマンドラインまたはGroovyShell.parse()のいずれかによって呼出される)GROOVYコンパイラに通知するために用いられる。たとえば、ある種類のアノテーションをGROOVYスクリプトコードに用いることができる一方、別のものをGROOVYクラスコードに用いることができる。
【0018】
Groovy AST操作はすべてのループコードを遮断し、それに新しいコードをラップする。これは、ループが何らかの許可されたメモリクォータ(つまりメモリポリシー)を越えたかどうかを判定する役割を担う。同様に、すべての収集クラスおよびストリングスがサイズについて監視され、作成され再びクォータに供されるメモリ集約的なオブジェクトの数を数えるために付加的なチェックが追加され得る。他の方法では無害のオブジェクトの組合せなどの不適当な量のシステムリソースを消費し得る他の動作について、付加的なチェックも追加され得る。AST操作が完了すれば、Java VM内のいずれかの他のクラスと同じように、メモリ不足に対する何らかの保証をもってクラスにアクセスすることができる。
【0019】
クォータは、システム全体の識別されたプロパティによって、QuotaPolicyクラスの使用によって、スクリプトに関連付けられたメタデータによって、エンドユーザによりスクリプトに配置された変数によって、または何らかの他の方法もしくは方法の組合せによって、判定され得る。
【0020】
図2は、一実施形態に従って実行時にメモリをスロットリングする際の図1のメモリスロットリングモジュール16の機能のフローチャートである。一実施形態では、図2のフローチャートの機能ならびに以下の図3および図4は、メモリまたは他のコンピュータ読取可能なもしくは有形の媒体に格納されたソフトウェアによって実現され、プロセッサによって実行される。他の実施形態では、当該機能は、(たとえば特定用途向け集積回路(ASIC)、プログラマブルゲートアレイ(PGA)、フィールドプログラマブルゲートアレイ(FPGA)等の使用により)ハードウェア、またはハードウェアおよびソフトウェアのいずれかの組合せによって行なわれ得る。
【0021】
210において、構文ツリー内のコールが識別される。構文ツリーは、ユーザによって書込まれたかまたは他の方法で提供されたコードに基づいて作成された抽象構文ツリーであり得る。構文ツリーは、コードをコンパイルするプロセスの一部として作成され得る。いくつかのプログラミング言語では、構文ツリーが生成された後でコードを編集することが可能である。たとえば、GROOVYコードをコンパイルすることは、構文ツリーが生成された後であるがバイトコードが生成される前のコードの変更を可能にし得る。1つ以上の構文ツリー操作クラスが呼出されるべきであることを示す1つ以上のアノテーションをユーザがコードに追加している場合がある。メソッドコールを識別することに加え、コンストラクタコールおよび/またはプロパティアクセスコールが識別され得る。メソッドコール、コンストラクタコール、および/またはプロパティアクセスコール(コール)の識別は、構文ツリーを構文解析することによって遂行され得る。
【0022】
220において、識別された各メソッドコールをメモリ変更済みコールで置換する。メソッドコールに加えて、コンストラクタコールおよび/またはプロパティアクセスコールもメモリ変更済みコールで置換され得る。メモリ変更済みコールは、以下に詳細に開示されるように、メモリポリシーに基づくコールの許可についてのチェックを生じさせる。コールをメモリ変更済みコールで置換することは、コールが実行される前に許可が付与されるかどうかを判定するためにメモリクラスが評価されるように、メモリクラスにコールを関連付けることを含み得る。たとえば、メソッドコールをメモリ変更済みメソッドコールで置換することは、メモリポリシーに対してメソッドコールがチェックされるようにメソッドコールがメモリクラスコールにおいてラップされるかまたは他の方法で変更されることを含み得る。メソッドコールはメモリクラスのパラメータとなり得、したがってメモリ変更済みメソッドコールを作成する。メモリチェックの結果、メソッドコールが許容可能であると識別された場合、メソッドコールのみが実行され得る。そのため、メモリポリシーに基づくメモリクラスは、メソッドコールが行なわれる前にメソッドコールを行なうための許可についてチェックされることになる。コンストラクタコールおよび/またはプロパティアクセスコールについて、同様の関連付けおよび/またはラッピングが生じ得る。
【0023】
230において、置換に引続いて、1つ以上のメモリ変更済みメソッドコール、メモリ変更済みコンストラクタコール、および/またはメモリ変更済みプロパティアクセスコール(メモリ変更済みコール)を含み得る構文ツリーがコンパイルされる。変更済み構文ツリーのコンパイルの結果、マシンコードに解釈されて実行されるように構成されたバイトコードが作成されることになる。実行されると、各メモリ変更済みコールは、メモリクラスを用いてメモリポリシーに対してチェックされる。メモリ変更済みコールがメモリポリシーに合格しなければ、バイトコードは実行が中止され、例外が生成される。例外は、格納し、かつ/またはユーザに出力することができる。いくつかの実施形態では、違反しているメモリ変更済みコールをスキップし、バイトコードを実行し続けるよう試みることが可能であり得る。
【0024】
図3は、別の実施形態に従って実行時にメモリをスロットリングする際の図1のメモリスロットリングモジュール16の機能のフローチャートである。
【0025】
310において、メモリポリシーが受取られる。メモリポリシーは、過度のメモリ使用のために、コンパイルされたコードの実行中に許可されないことがあり、静的解析中に検出され得る一種のメソッドコール、コンストラクタコールおよび/またはプロパティアクセスコールを識別する1つ以上のメモリルールを含むことができる。メモリポリシーは、コードをコンパイルしているエンティティによって提供された、または当該エンティティに提供されたデフォルトメモリポリシーであってもよく、かつ/またはカスタマイズされたメモリポリシーであってもよい。一実施形態のメモリポリシーは、JAVA VMまたはそのライブラリ内の既存のメモリアレイのサイズの知識を使用し、サイズをより大きくすることができるかどうかを判定するか、またはすべての新たなオブジェクト作成を単一のアレイに限定する。メモリサイズの制約は、動的に調整し、変更することができる。
【0026】
一実施形態のメモリポリシーは、コードをコンパイルして実行するシステムによって格納される。いくつかの実施形態では、メモリポリシーはリモートで格納され得るが、コードをコンパイルして実行するシステムにアクセス可能であり得る。
【0027】
320において、コンパイルされていないコードが受取られる。このコードは、ユーザがコードを書込むかまたはコードを含む1つ以上のファイルを提供する形態で受取られ得る。いくつかの実施形態では、ユーザは、ユーザコンピュータシステムによって、コンパイルされ実行されるリモートサーバに、ウェブベースのインターフェイスを介してコードを送信し得る。リモートサーバは、コンパイルされていないコードを受取り、それをコンパイルし、ユーザコンピュータシステムからリモートコードを実行し得る。コードは、リモートユーザコンピュータシステムの他に、他のソースから受取られてもよい。
【0028】
325において、コンパイルされていないコードに1つ以上のメモリ管理アノテーションが付加される。メモリ管理アノテーションは、(GROOVY AST操作クラスなどの)操作クラスが呼出されるべきであることをコンパイラに示す役割を果たす。スクリプトコード(たとえばGROOVYスクリプトコード)についてのアノテーションおよび/またはクラスコード(たとえばGROOVYクラスコード)についてのアノテーションを付加することができる。そのようなメモリ管理アノテーションは、ユーザにより手作業で、または自動的に、付加することができる。GROOVYを用いる実施形態では、メモリ管理アノテーションは、全文変形または局所変形のいずれかとして付加されてもよく、コマンドラインから、またはGroovyShell.parse()などのGROOVYアプリケーションプログラミングインターフェイス(API)からであり得るコンパイルステップでトリガされ得る。いくつかの実施形態では、アノテーションの代わりに、構成スイッチ、プロパティファイルまたは環境変数などの何らかの他のトリガ機構を用いることができる。
【0029】
330において、コードのコンパイルが開始され、320で受取られたコンパイルされていないコードに基づいて抽象構文ツリーが作成される。ASTは、GROOVYなどのプログラミング言語で書かれた、320で受取られたコンパイルされていないコードのツリー表示である。ASTの各ノードは、一実施形態のコンパイルされていないコードの要素に対応する。GROOVYなどの、いくつかの実施形態について用いられるプログラミング言語は、バイトコード(またはマシンコード)をコンパイルするために構文ツリーが用いられる前に構文ツリーを編集することを許可する。
【0030】
335において、構文ツリーを構文解析することによって、330で作成された構文ツリー内のコールが識別される。これは、メソッドコール、コンストラクタコールおよび/またはプロパティアクセスコールを含み得る。
【0031】
340において、310で受取られたメモリポリシーを用いて、構文ツリーの静的解析を行なう。静的解析は、メモリポリシーを破ることになる(つまりメモリポリシー下で許可されない)1つ以上のコンストラクタコール、メソッドコール、および/またはプロパティアクセスコールを識別する。たとえば、大きいことが知られているエクステンシブル・マークアップ・ランゲージ(XML)ファイルを読出す際、メモリ内のドキュメント全体を保持するドキュメント・オブジェクト・モデル(DOM)法を用いることは、スクリプトのコンパイルの不許可をもたらす可能性がある。別の例として、非常に大きな静的ストリングオブジェクトのアレイを作成することも、大きいことが知られているファイルまたはデータベースからそれらのストリングスを読出すことができるように、スクリプトのコンパイルの不許可をもたらす可能性がある。
【0032】
1つ以上のコンストラクタコール、メソッドコールおよび/またはプロパティアクセスコールが、メモリポリシーに従って許可可能ではない場合、機能は390まで継続する。
【0033】
390において、340における1つ以上の不合格のコールに基づいて、メモリ例外が生成され、出力される。一実施形態では、320で受取られたコンパイルされていないコードがウェブインターフェイスによってユーザから受取られた場合、ウェブインターフェイスを用いて、当該1つ以上の不合格のコールをユーザに示すことができる。少なくともメモリ例外がコンパイルされていないコードにおいて訂正されるまで、バイトコードへの構文ツリーのコンパイルが阻止され得る。
【0034】
340における静的解析がメモリポリシーに従っていずれのメモリ例外も識別しなければ、機能は370に続く。370において、335で識別された各メソッドコールについて、メソッドコール、コンストラクタコールおよび/またはプロパティアクセスコールを変更することによってメモリ変更済みメソッドコールが置換される。メソッドコールをメモリ変更済みメソッドコールで置換することは、メソッドコールが実行されることが許可されるかどうかを判定するためにメモリクラスが評価されるように、メモリクラスにメソッドコールを関連付けることを含む。メモリチェックの結果、メソッドコールが許可可能なものとして識別されることになった場合、メソッドコールのみが実行され得る。メソッドコールをメモリ変更済みメソッドコールで置換することは、メソッドコールがメモリクラスコールにおいてラップされることを含み得る。そのため、メモリクラスを用いて、メソッドコールが行なわれる前にメソッドコールを行なう許可についてチェックする。コンストラクタコールおよび/またはプロパティアクセスコールについて、同様の関連付けおよび/またはラッピングが生じ得る。いくつかの実施形態では、構文ツリーが構文解析されるにつれて、335および370の機能がともに行なわれる。たとえば、第1のメソッドコールは、第2のメソッドコールが識別される前に識別され、メモリ変更済みメソッドコールで置換され得る。
【0035】
380において、370で置換が完了するのに引続いて、1つ以上のメモリ変更済みメソッドコール、メモリ変更済みコンストラクタコール、および/またはメモリ変更済みプロパティアクセスコールを含む構文ツリーがコンパイルされる。変更済み構文ツリーのコンパイルは、仮想マシンによってマシンコードに解釈されて実行されるように構成されたバイトコードをもたらす。いくつかの実施形態では、マシンコードは、コンパイラによって直接に作成されてもよい。
【0036】
図4は、別の実施形態に係るコンパイル中に変更された構文ツリーを用いて作成されたバイトコードを実行するための図1のメモリスロットリングモジュール16の機能のフローチャートである。バイトコードは、図3の機能を用いて作成された可能性がある。図4の機能は、図1のシステム10とは別個のシステムによっても実行され得る。
【0037】
410において、バイトコードの第1のメモリ変更済みコールが実行されるように試みられる。コールは、メモリ変更済みメソッドコール、メモリ変更済みコンストラクタアクセスコール、またはメモリ変更済みプロパティアクセスコールであり得る。実行される際、コールを直接実行するのではなく、コールに関連付けられたメモリクラスが用いられてもよい。
【0038】
420において、メモリポリシーおよび既存のクォータに基づいて、メモリ変更済みコールについてのメモリチェックが行なわれる。コールがメモリポリシーに合格しなければ、機能は430において続く。430において、メモリ例外が生成され、出力される。バイトコードがさらに実行されることが妨げられる場合があり、ユーザに例外が通知される。
【0039】
420においてコールがメモリポリシーを満たせば、440においてコールが実行される。したがって、図3の370においてメモリ変更済みコールを作成するために第1のコールが用いられた場合、メソッドコールがメモリポリシーと一致していれば、440において第1のコールが実行されることになる。440の実行が成功した場合に引続いて、機能は410に続き、別のメモリ変更済みコールが実行される。これは、バイトコードが完全に実行されるまで続くことになる。
【0040】
開示されているように、実施形態はコンパイルコールを遮り、コンパイル中にメモリポリシーに基づいてコールを許可するか、またはコールを不許可とする。メモリ内オブジェクトの意図しない制御不能な作成を阻止することによって、実施形態は、JAVA VMを有するGROOVYなどの、マルチユーザサーバ上で実行されるスクリプトをエンドユーザが入力することを可能にするシステムの安定性および性能を著しく向上させることができる。実施形態はJAVA VMへの変更に依存しないため、現在実現されているJAVA VMで用いることができる。
【0041】
いくつかの実施形態が本明細書に具体的に例示され、かつ/または説明される。しかしながら、開示した実施形態の変更および変形例は、発明の精神および意図される範囲から逸脱することなく、上記の教示によって添付の請求項の範囲内に包含されることが認識されるであろう。
図1
図2
図3
図4