user3205479:
私たちは、オンラインコーディングテストを作成するために私たちのクライアントのいずれかのJavaコードコンパイラを構築しようとしています。私たちは、エンドポイントにREST APIを介してソースコードを掲示しています。次に、我々は戻って、その結果をクライアントに返すその後、テストファイルに対する出力をコンパイルして実行しています。
ここでの課題は、私たちは、プロセスをスピンアップされているjavac - compile code
とjava - execute code
、実際にすべてのプロセスのためのRAMと600ミリ秒の30メガバイトを取るすべての要求に。
これは、我々はオクタコアと16ギガバイトのRAMに1000人のユーザの負荷を処理することができない非常に巨大です。私たちは、一度に200個の要求を取得した場合、それは重く、他の要求をキューに登録されている200のプロセスを生成しています。
私たちが考えることができるソリューション
- 起動しないでください
javac
、毎回それを再利用するが、どのように(コンパイルが行われた後のjavacが自分自身を殺しますか)? javac
むしろファイルからよりも、文字列の入力をコンパイルする必要があります。
私たちは、オンラインコーディング競争のプラットフォームは、これらの問題を解決しないかだけ興味がありますか?我々は、Javaのためにのみターゲットとしています。すべてのヘルプは大歓迎です。
https://www.journaldev.com/937/compile-run-java-program-another-java-program
ルーク・ウッドワード:
Javaの1.6以来、Javaはサブプロセスを使用せずにJavaコンパイラにアクセスするためのプログラムAPIがありました。開始点として、参照JavaCompilerクラスのドキュメントを。