現在、Windows XP Embedded スタート メニューの starup フォルダーに配置された .bat ファイルによって開始された jar によって実行される 4 つの異なる Java アプリがあります。Firefoxも起動します。ここで、Firefox または Java アプリのいずれかがシャットダウンします。メモリが不足していると思います(512 MB RAMのWin XP Embedded)。
4 つの Java アプリは、
- HMI バックエンド (Spark「マイクロ」フレームワークで構築)
- PLC から H2 データベースにデータを記録するロガー アプリ。これは Timer/Timertask を使用して
- h2 データベース サーバー
- 定期的なジョブを実行するスケジューラ。これはQuartzを使用することによって。
したがって、これらの Java アプリはそれぞれ独自の JVM で開始されます (私の知る限り)。最初の質問は、これら 4 つのアプリを 4 つではなく 1 つの JVM で実行することによって、これら 4 つのアプリのメモリ使用量を削減できないかということです。もしそうなら、これらの各アプリを起動するために使用するスレッドはありますか?
それ以外に、メモリ フットプリントを下げるために最初にすべき基本的なことは何ですか。私は「実際の」Java プログラミングにはまったく慣れていません。H2 接続プール、オブジェクトの再利用、他には? JconsoleとそのXmxのもの?
おそらく素朴ですが、GCが「すべて」を処理してくれると本当に思っていました。ないと思います?=)
編集: HMI バックエンドは Jetty Web サーバーを使用します。また、すべてのコードはオープン ソースまたは私が作成したものです。
編集 2: Web フレームワーク: http://www.sparkjava.com/。Jetty (jetty-webapp-7.3) ではなく、フレームワークを介して静的メディアを提供しています。これは、メモリ使用量を改善するために検討するものでしょうか? HMI Web アプリのその他のコンポーネントは、freemarker テンプレート エンジン、gson、servlet-api-3、slf4j、および log4j です。
おそらく、webapp の開始時にロガーとスケジューラーをスレッドで開始しようとする可能性があります。次に、2 つの JVM を実行するだけです。1 つは webapp 用、もう 1 つはデータベース サーバー用です。
Java 7 を使用していますが、これは 32 ビット システムです。うまくいけば、本番用になります(または私は困っています)。