タツノオトシゴのブログ

主にJavaに関するものです。

仮想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
--------------------