仮想PCでJavaFXが起動しない(crash)する場合
VirutalBoxなどの仮想PC上でJavaFXのアプリを起動しようとした場合、HotSpotエラーがで出てJVMがcrashする場合がある。
JDK8のEarly Access版をLinuxで試そうかと思ったら、どうにも起動できない。
既存のJDK7の場合も同様だった。
HotSpotのエラーログを見ると、JavaFXのグラフィックエンジンのPrismでエラーが出ているっぽい。
仮想PCだから、グラフィックボードの種類が検知できなく落ちている模様。
結果、Prismを利用しないで、Java2Dで描画するように起動オプション「-Dprism.order=j2d」を指定すればよい。
Windowsの仮想環境だと何も指定しなくてもうまくいくので、単にLinuxが古い可能性もある。
今回使用したのは、CentOS6.4のKernel2.6系。
試してないけど、Ubuntuなどの最新版のKernel3.x系に対応しているものは、Prismが利用できるかも。
確か、JavaFXのグラフィックエンジンは、環境によって自動切り替えしてくれたような気がしたんだけど。
# 起動時のオプション java -Dprism.order=j2d -jar your.jar
-------- エラー内容抜粋 # JRE version: Java(TM) SE Runtime Environment (7.0_40-b43) (build 1.7.0_40-b43) # Java VM: Java HotSpot(TM) 64-Bit Server VM (24.0-b56 mixed mode linux-amd64 compressed oops) # Problematic frame: # C [libc.so.6+0x89871] memcpy+0x11 ・・・省略 Stack: [0x00007fb32b338000,0x00007fb32b439000], sp=0x00007fb32b436ab8, free space=1018k Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) C [libc.so.6+0x89871] memcpy+0x11 Java frames: (J=compiled Java code, j=interpreted, Vv=VM code) j com.sun.prism.es2.X11GLFactory.nInitialize([I)J+0 j com.sun.prism.es2.X11GLFactory.initialize(Ljava/lang/Class;Lcom/sun/prism/es2/GLPixelFormat$Attributes;)Z+73 j com.sun.prism.es2.ES2Pipeline.<clinit>()V+54 v ~StubRoutines::call_stub j java.lang.Class.forName0(Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class;+0 j java.lang.Class.forName(Ljava/lang/String;)Ljava/lang/Class;+8 j com.sun.prism.GraphicsPipeline.createPipeline()Lcom/sun/prism/GraphicsPipeline;+171 j com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.init()V+0 j com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run()V+1 j java.lang.Thread.run()V+11 v ~StubRoutines::call_stub --------------------