首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在ClassCastException中运行java2d (Bug 7172749)?

如何在ClassCastException中运行java2d (Bug 7172749)?
EN

Stack Overflow用户
提问于 2015-12-09 20:37:07
回答 1查看 7.7K关注 0票数 13

我在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程序)。

加入一群能舒舒服服地等待神谕解决实际问题的人吗?

向托比问好

顺便说一句,我的堆栈看起来是这样的:

代码语言:javascript
复制
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)
[...]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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。这是相同的堆栈跟踪:

代码语言:javascript
复制
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的系统属性。

更多搜索:

  • 此选项在Java 2D技术的系统特性中描述。 引用: x呈现 的预期用途:支持基于XRender的Java2D渲染管道,用于基于X11的桌面,提供更好的图形性能。 介绍的 Java 7 默认值: false 如何使用:管道默认禁用,但可以通过设置命令行属性-Dsun.java2d.xrender=true来启用。旧的X11配置可能无法支持XRender。详细的表单-Dsun.java2d.xrender=True可用于启用一条消息以指示是否实际启用了管道。
  • 是的,这是一个特性,它是用Java7:JDK7母版中的Xrender管道添加的 另见Java 7中的增强
  • 对于Java8,现在默认启用它:Java8:默认启用Java2D管道 根据本博客的评论,XRender管道仅适用于Java2D、AWT和Swing -其他GUI框架(JavaFX、SWT、.)不受影响: 基于Swing/AWT的应用程序应该受益,SWT/JavaFX/lwjgl/慢跑使用与Java2D无关的其他代码页。

我没有在发布说明中找到什么,但在源代码中,很明显,默认启用了XRender管道:根据第一个jdk8发行版的票证,改变这种情况的提交已经在2011年完成了。我想,我之前没有经历过这个错误的原因是,我可能很长时间使用java7作为运行时,eclipse没有受到影响。

再次仔细查看重复的bug报告,已经有一个与堆栈跟踪相匹配的:

它是bug JDK-8133723:sun.awt.image.BufImgSurfaceData不能被投给sun.java2d.xr.XRSurfaceData -它真的不是一个复制.然而,复制这个bug可能会很困难。它只在挂起到RAM循环之后才出现.

更新1-触发器

错误的触发是通过改变输出显示用xrandr。

代码语言:javascript
复制
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。

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34188495

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档