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()することにした場合、他のすべてのスレッドはハングします。サブアプリケーションも影響を受けます。