スポンサーサイト


上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

JBossがVMエラーで異常終了した


EclipseからJBossを起動して画面(IE)で動作を確認していたところ、
"ページを表示できません"というIEのエラー画面が表示された。

Eclipseのコンソールを確認すると、以下のメッセージが表示されていた:
#
# HotSpot Virtual Machine Error, Internal Error
# Please report this error at
# http://java.sun.com/cgi-bin/bugreport.cgi
#
# Java VM: Java HotSpot(TM) Client VM (1.4.2_03-b02 mixed mode)
#
# Error ID: 434F444523414348450E43505000CF
#
# Problematic Thread: prio=5 tid=0x21532128 nid=0x94c runnable
#

Heap at VM Abort:
Heap
def new generation total 8192K, used 1084K [0x10010000, 0x108f0000, 0x109e0000)
eden space 7296K, 11% used [0x10010000, 0x100e2750, 0x10730000)
from space 896K, 27% used [0x10810000, 0x1084cbb8, 0x108f0000)
to space 896K, 0% used [0x10730000, 0x10730000, 0x10810000)
tenured generation total 107156K, used 60912K [0x109e0000, 0x17285000, 0x18010000)
the space 107156K, 56% used [0x109e0000, 0x1455c358, 0x1455c400, 0x17285000)
compacting perm gen total 27136K, used 26986K [0x18010000, 0x19a90000, 0x1c010000)
the space 27136K, 99% used [0x18010000, 0x19a6a8c8, 0x19a6aa00, 0x19a90000)

VMの中身がぶっ壊れてよく分からんということだと思う。
後半のメモリのアドレスらしき文字列は、見る人が見れば何か分かるんだろうか。

エラーIDが出ていたのでこれで検索してみたところ、
どうもJavaのバグであったようだ。

Bug ID: 4951689 JVM crashes during deoptimization phase

バージョンも全く同じ。
ver. 1.4.2_06 で修正されているようだ。

スポンサーサイト

JBossを二重起動したときのエラー


EclipseからJBossを二重に起動すると、以下のようなエラーがコンソールに表示される:

XX:XX:XX,XXX ERROR [WebService] Starting failed
java.net.BindException: Address already in use: JVM_Bind
.....
XX:XX:XX,XXX WARN [ServiceController] Problem starting service jboss:service=WebService
java.net.BindException: Address already in use: JVM_Bind
.....
XX:XX:XX,XXX ERROR [NamingService] Starting failed
java.rmi.server.ExportException: Port already in use: 1098; nested exception is:
.....
XX:XX:XX,XXX ERROR [JRMPInvoker] Starting failed
java.rmi.server.ExportException: Port already in use: 4444; nested exception is:
java.net.BindException: Address already in use: JVM_Bind
.....
XX:XX:XX,XXX ERROR [Http11Protocol] エンドポイントを初期化中のエラーです
java.net.BindException: Address already in use: JVM_Bind:8080
.....
XX:XX:XX,XXX ERROR [EmbeddedTomcatService] Starting failed
LifecycleException: プロトコルハンドラの初期化に失敗しました: java.net.BindException: Address already in use: JVM_Bind:8080

現象やエラーメッセージとしては
JBoss起動時にExportException, CommunicationExceptionが発生する
と似ている。

上記エラーの他に、以下のエラーも見られる:
SQLException
JBossResourceException
SpyJMSException


うっかりJBoss二重起動してしまったときはすぐに気付けるのだが、
厄介なのがEclipseが固まって異常終了するなどして、
JBossのプロセスが残ってしまった場合。
この場合もJBossを二重起動したのと同じ状態となり、上記のエラーが表示される。

この状態でタスクマネージャのプロセスを見ると、
Javaのプロセス(javaw.exe)が3つ(Eclipse本体とJBoss×2)確認できる:


EclipseとJBossを終了しても、まだJavaのプロセスが一つ残るはずなので、
このプロセスを終了して再度JBossを起動すれば正常に起動できるはず。


JBoss起動時にBindExceptionが発生する


JBossは起動し、アプリケーションの動作には問題ないように見えても、
コンソールにエラーをはいているときがある。

現象としてはこれと似ている:
JBoss起動時にExportException, CommunicationExceptionが発生する

エラーメッセージはこんな感じ:

XX:XX:XX,XXX ERROR [TrapdService] Cannot instantiate trap session
XX:XX:XX,XXX ERROR [TrapdService] Starting failed
java.net.BindException: Address already in use: Cannot bind
....
XX:XX:XX,XXX WARN [ServiceController] Problem starting service jboss.jmx:name=SnmpAgent,service=trapd,type=logger
java.net.BindException: Address already in use: Cannot bind
....
[ObjectName: user:name=JBossBootService
state: CREATED
I Depend On:
Depends On Me: , ObjectName: jboss.jmx:name=SnmpAgent,service=trapd,type=logger
state: FAILED
I Depend On:
Depends On Me: java.net.BindException: Address already in use: Cannot bind]


前回はポートが既に使われている旨のメッセージだったが、
今回はアドレスが既に使われていると出ている。

JBossを一度停止してActivePorts(Active Portsをインストールする参照)で
使用されているポートを調べてみると、
1098は使用されていなかったが、1099が使用されていた(使用していたアプリケーションは不明)。

マシン再起動したら現象が発生しなくなってしまったので、
エラーが出ていた理由としては"Port already in use"のエラーと同じだと思われるが、
エラーが出ていてもJBossが一見正常に起動したかに見えて、
実際問題なく使えていたというのが腑に落ちない。

エラーの内容が違うのは使用されていたポートが1099だけだったからだと思う。
としても、エラーの中に"1099"が出てこないのは何でだろう?

うーむ、もっと勉強せねば。。。


JBossのヒープメモリサイズを調整する


Eclipse + JBossで開発を行っているが、OutOfMemoryErrorが発生してしまうことがある。
JBossを起動し直すと改善する場合もあるが、
根本的に解決するにはJBossヒープメモリのサイズを変更する。

現在のメモリサイズをコンソール画面で確認する


まずは現在のメモリサイズの確認。
JBossを起動して
http://localhost:8080/web-console/index.html
にアクセスすると、以下のような画面が表示される:



画面左下の"Max Memory"となっているのが最大メモリサイズ。
Java VMのデフォルト値が64MBなので"63 MB"と表示されている。
※ なぜ1MB少ないのかは不明(要調査)

ヒープメモリのサイズを変更する


Eclipseからlombozプラグイン経由で起動すると、VMのデフォルトのヒープメモリサイズ(64MB)が適用される。
これを変更するには、以下のように行う:
EclipseVM引数を指定する
Eclipseで、

メニューバーの 実行 → デバッグ → デバッグダイアログ起動
構成でJBossを選択
"引き数"タブの"VM 引き数"欄に
-Xmx128M
などと入力してデバッグボタン押下(下図参照)



起動後にコンソール画面で確認すると"127 MB"となっている(やはり1MB少ない...)。


※ これを設定してもlomboz経由の起動を再度行うと設定が無効になり、
適用したVM引数もクリアされてしまう。
それならばJBossを起動すればいいのかと思ったのだが、、、

JBossのrun.batファイルを編集する ※ lomboz経由だと反映されない?


一応、以下のようにすればJBoss起動時のヒープメモリサイズを変更できる:

<JBoss_Home>/bin/run.bat内の、以下の記述を探す:

rem Sun JVM memory allocation pool parameters. Uncomment and modify as appropriate.
rem set JAVA_OPTS=%JAVA_OPTS% -Xms128m -Xmx512m

この2行目のコメントアウトを解除し、

set JAVA_OPTS=%JAVA_OPTS% -Xms128M -Xmx256M

のように変更し、保存する。
※ -Xmsには起動時のメモリサイズ、-Xmxには最大メモリサイズを指定する。

ちなみに、Unixの場合は同じフォルダにあるrun.confを編集すればよいようだ。

----------

結局


Eclipseと連携させずにJBossを動かすときはこれでいいと思われるが、
lomboz経由でJBossを起動するとやはりデフォルトの設定が適用されてしまう。

EclipseVM引数を指定して起動すれば一応何とかなるのでこれ以降はよく調べてないのだが、
Eclipse + lombozのバージョンの問題とかかなぁ。
lombozの後継といわれるWTPならVM引数の指定もできるのかなぁ。
いずれ調査する。

ヒープメモリサイズを検討する


最適なヒープメモリサイズはどれくらいかということについては、以下のページが参考になりそう:
ガベージコレクタの仕組みを理解する

----------

ぼくは今のところ単体(開発)環境でしかJBossを使っていないので、
それほどシビアにパフォーマンスチューニングする必要はないのだが
(基本的にはデフォルトの64Mで、必要なら128Mに設定する程度)、
このあたりもいずれ本格的に調査したい。


JBoss起動時にExportException, CommunicationExceptionが発生する


Eclipse + lomboz + JBossで開発を行っていて、EclipseからJBossを起動しようとしたところ、起動はしたようなのだがエラーをはきまくっていたので見てみると、
ExportExceptionやらCommunicationExceptionやらが発生して、最終的にはEJBの名前解決ができないという内容だった。

エラーはこんな感じ(抜粋):

XX:XX:XX,XXX ERROR [NamingService] Starting failed
java.rmi.server.ExportException: Port already in use: 1098; nested exception is:
java.net.BindException: Address already in use: JVM_Bind
....
Caused by: java.net.BindException: Address already in use: JVM_Bind
....
XX:XX:XX,XXX WARN [NamingContext] Failed to connect to localhost:1099
javax.naming.CommunicationException: Failed to connect to server localhost:1099 [Root exception is javax.naming.ServiceUnavailableException: Failed to connect to server localhost:1099 [Root exception is java.net.ConnectException: Connection refused: connect]]
....
Caused by: javax.naming.ServiceUnavailableException: Failed to connect to server localhost:1099 [Root exception is java.net.ConnectException: Connection refused: connect]
....
Caused by: java.net.ConnectException: Connection refused: connect
....
XX:XX:XX,XXX ERROR [JRMPInvoker] Starting failed
javax.naming.CommunicationException: Receive timed out [Root exception is java.net.SocketTimeoutException: Receive timed out]
....
Caused by: java.net.SocketTimeoutException: Receive timed out
....


JBossさんは、ポート10981099が既に使われますよ、と言っている。
このポートはJBossのJNPサービス、RMIネーミングサービスのために確保されるポートなのだが、これらはエフェメラルポート(ephemeral ports, ephemeralは[短命の]の意)と呼ばれる"一時的な通信のために自由に利用できるポート"であるために、JBossを起動させようとしている端末内の他のアプリケーションによって既に使用されている場合がある。

これを解決するには3つの方法がある:
(1) ポート1098, 1099を使用しているアプリケーションを探して終了する
(2) JBossが使用するポートを変更する
(3) ポート1098, 1099など、JBossが使用するポートをエフェメラルポートから除外する

続きを読む


テーマ : トラブル
ジャンル : コンピュータ

Adsense
ブログ内検索
カテゴリー
最近の記事
カレンダー
09 | 2017/10 | 11
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -
月別アーカイブ
feedmeter & あわせて読みたい
フィードメーター - あるシステム屋によるJava開発の記録
あわせて読みたいブログパーツ
プロフィール

kamii

Author:kamii
ピタゴラスイッチ好きなシステム開発屋@二児の父です。

メールフォーム

名前:
メール:
件名:
本文:

カウンター
checker
ページランク


ブログチャート
現在時刻
全エントリ表示

全てのエントリを表示する

RSSフィード
リンク
ブロとも申請フォーム

この人とブロともになる

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。