JVMデーモンはありますか?

JVMデーモンはありますか?

OSデーモンとして実行され、新しいプロセスを起動する必要があるときに分岐するJVMはありますか(Androidのinitまたはzygoteプロセスなど)。そうでなければなぜならないのですか?私はJVMのデーモンスレッドについて話していません。

JVMの起動時間が非常に遅く、スクリプトに大きな負担がかかるので、この質問をします。

答え1

JVMの起動時間は非常に遅く、スクリプトに大きな影響を与えます。 。 。 Javaプロセスの開始時間を大幅に最適化します。

他の答えは、有用な考慮事項であるユニバーサルアプリのリリースに関する質問に対する答えです。

しかし、主な問題は、Javaアプリケーションの起動パフォーマンスとjvmの起動によるオーバーヘッドのようです。これは私の質問でもした。私はこれを見つけました:

ユーザー分離セキュリティを犠牲にしたい場合は、次の点を確認してください。とても速いJava、Nailgun:

Nailgunは、JVM起動オーバーヘッドを発生させることなく、コマンドラインからJavaプログラムを実行するためのクライアント、プロトコル、およびサーバーです。プログラムはサーバー(Javaで実装)で実行され、すべてのI / Oを処理するクライアント(Cで作成)によってトリガーされます。

答え2

Androidは単一のZygoteプロセスを使用して新しいアプリケーションをフォークします。これらの最適化は、すべてのAndroidアプリケーションが同じ環境で実行されるために可能です。アプリケーションを実行するために実行する操作(主にユーザー設定とアプリケーションコードのロード)はほとんどありません。この最適化は、やることがほとんどないので効果的です。これは、Zygoteプロセスがすでにライブラリにリンクされているためです。

UNIXシステムでは、Zygoteの仮定は満たされません。各プロセスは、独自の環境変数、独自のオープンファイル、独自の使用制限、独自のユーザーとグループなどから始まります。これらの属性はすべて、あるプロセスから別のプロセスに転送することはできません。一部を送信することはできますが、開始時間はさらにかかります。さらに、さまざまなアプリケーションはさまざまなライブラリを使用します。各アプリケーションは独自にロードする必要があります。 Zygoteのような最適化は通常不可能であり、可能であっても多くの場合実際には役に立ちません。

デーモンとして機能するJavaプログラムを作成できます。アプリケーションごとに管理する必要があります。あなた(あなた)はできます。あなたのアプリケーションデーモンで始まり、新しい要求が受信されると分岐します。分割されたときに何をするかを決定することはあなた次第です。

答え3

Javaプログラムを含むすべてのプロセスはデーモンとして実行できます。実際の質問は、Java実装に「適切なデーモン」(シグナル処理、セッション/プロセスグループ処理など)を作成するためのすべてのシステムコールがあるかどうかです。一度見てみたいかもしれませんJavaデーモンAPI

さらに、オペレーティングシステムから分岐実行中のプログラムのコピーが作成され、開始コストはなく、オペレーティングシステム内で新しいプロセスデータ構造を生成するためのコストのみが発生します。その後の作業にはexec開始コストが発生する可能性があります。すでに安定したAPIがあるため、Javaプログラムは通常フォークの代わりにスレッドを使用します。

答え4

実際、JBossなどのアプリケーションサーバーは、ユーザーが必要とする機能と同じ(同じではありません)機能を提供します。つまり、Javaプロセスがバックグラウンドで実行され、サブアプリケーションを起動するように指示できます。ただし、このアプローチの欠点は、サブアプリケーションが別々のプロセスで起動されないため、安全に分離できないことです。つまり、ある仮想マシンがクラッシュするか、System.exit()を呼び出すか、すべてのスレッドをInterrupt()することにした場合、他のすべてのスレッドはハングします。サブアプリケーションも影響を受けます。

関連情報