我在java8中遇到了一个错误,这对其他人来说似乎不是什么大问题,所以甲骨文不会在java9之前修复它。
这个bug有Bug-ID 7172749 (也注意到相关的和重复的错误),它总是发生在特定的linux机器上。
我在jdk1.8.0_u66的Ubuntu14.04.3LTS上遇到了这个问题。
但是,在另一个带有Ubuntu12.04.3LTS和相同JDK版本的盒子上,我根本无法重现这个问题。
令我困惑的是,这似乎并不是其他人的表演秀,所以我想我可能犯了一个特别的错误。我运行的是Oracle(而不是OpenJDK),因为我们的客户使用相同的版本(尽管是在windows上),并且我们的想法是接近他们的环境。
所以,我的问题是,如何绕过这个问题(例如安装x11库xy,用一个神奇的-XXjava2dfailsafe参数或类似的东西启动我的java程序)。
加入一群能舒舒服服地等待神谕解决实际问题的人吗?
向托比问好
顺便说一句,我的堆栈看起来是这样的:
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: sun.awt.image.BufImgSurfaceData cannot be cast to sun.java2d.xr.XRSurfaceData
at sun.java2d.xr.XRPMBlitLoops.cacheToTmpSurface(XRPMBlitLoops.java:145)
at sun.java2d.xr.XrSwToPMBlit.Blit(XRPMBlitLoops.java:353)
at sun.java2d.SurfaceDataProxy.updateSurfaceData(SurfaceDataProxy.java:498)
at sun.java2d.SurfaceDataProxy.replaceData(SurfaceDataProxy.java:455)
at sun.java2d.SurfaceData.getSourceSurfaceData(SurfaceData.java:233)
at sun.java2d.pipe.DrawImage.renderImageCopy(DrawImage.java:566)
at sun.java2d.pipe.DrawImage.copyImage(DrawImage.java:67)
at sun.java2d.pipe.DrawImage.copyImage(DrawImage.java:1014)
at sun.java2d.SunGraphics2D.drawImage(SunGraphics2D.java:3318)
at sun.awt.image.ImageRepresentation.drawToBufImage(ImageRepresentation.java:813)
at sun.java2d.pipe.DrawImage.copyImage(DrawImage.java:1021)
[...]发布于 2016-06-26 13:00:32
我想出了一个解决问题的方法。
简而言之:使用参数-Dsun.java2d.xrender=false启动JVM。
有了这个选择,我再也没看到问题所在了。
背景信息
Bug JDK-7172749最近用jdk9 build 124进行了修正,并通过JDK-8158068将错误修复移植到jdk8更新112。您可以从这里下载jdk8u112构建预览:JDK8早期访问版本。
然而,运行这个构建并没有解决我的问题。
在我的情况下,我经历了这个bug:我正在运行jEdit,在我从挂起到内存中恢复Linux之后,我看到了这些ClassCastException。这是相同的堆栈跟踪:
10:04:10 [AWT-EventQueue-0] [error] AWT-EventQueue-0: java.lang.ClassCastException: sun.awt.image.BufImgSurfaceData cannot be cast to sun.java2d.xr.XRSurfaceData
10:04:10 [AWT-EventQueue-0] [error] AWT-EventQueue-0: at sun.java2d.xr.XRPMBlitLoops.cacheToTmpSurface(XRPMBlitLoops.java:145)此异常的效果是,jEdit或部件的整个窗口不会绘制并保持白色。
看看用于后端错误修复的修补程序,它实际上在另一个类(即sun.java2d.xr.XRRenderer中)中修正了一个ClassCastException。
所以,这并没有解决我的问题,这并不奇怪。
谷歌的另一项搜索显示了bug JDK-6975408,这让我意识到了sun.java2d.xrender的系统属性。
更多搜索:
-Dsun.java2d.xrender=true来启用。旧的X11配置可能无法支持XRender。详细的表单-Dsun.java2d.xrender=True可用于启用一条消息以指示是否实际启用了管道。我没有在发布说明中找到什么,但在源代码中,很明显,默认启用了XRender管道:根据第一个jdk8发行版的票证,改变这种情况的提交已经在2011年完成了。我想,我之前没有经历过这个错误的原因是,我可能很长时间使用java7作为运行时,eclipse没有受到影响。
再次仔细查看重复的bug报告,已经有一个与堆栈跟踪相匹配的:
它是bug JDK-8133723:sun.awt.image.BufImgSurfaceData不能被投给sun.java2d.xr.XRSurfaceData -它真的不是一个复制.然而,复制这个bug可能会很困难。它只在挂起到RAM循环之后才出现.
更新1-触发器
错误的触发是通过改变输出显示用xrandr。
xrandr --output eDP1 --auto --output DVI-1-0 --off会立即导致ClassCastException。当我在挂起之前关闭显示器时,我认为是暂停-恢复导致了这种情况,但这是错误的。
更新2-新Java Bug票证
现在有一个新的java bug票据:JDK-8160328
更新3-用jdk-9-ea-b 131修复
bug票证JDK-8160328已作为JDK-8147542的副本关闭-而这个bug票据已被java 9的最新EA构建修复(build 131及更高版本)。
我可以证实,我不再得到ClassCastException时,切换显示器与xrandr。
https://stackoverflow.com/questions/34188495
复制相似问题