我如何解决 java2d 中的 ClassCastException(错误 ID 7172749)

2024-02-16

我很不幸遇到了 java8 的 bug, 对于其他人来说这似乎不是什么大问题,因此 Oracle 不会在 java9 之前修复它。
该错误有错误 ID 7172749 http://bugs.java.com/bugdatabase/view_bug.do?bug_id=7172749(另请注意相关和重复的错误) 它就这样发生了每时每刻在某台linux机器上。
我在使用 jdk1.8.0_u66 的 Ubuntu 14.04.3 LTS 上遇到了该问题。
然而,在另一个装有 Ubuntu 12.04.3 LTS 的机器上sameJDK版本,我根本无法重现该问题。

让我困惑的是,这似乎对其他人来说并没有什么大不了的,所以我想也许我犯了一个特别严重的错误。 我正在运行 Oracle-JDK(而不是 OpenJDK),因为我们的客户使用相同的版本(尽管在 Windows 上)并且想法是接近他们的环境。

所以,我的问题是,如何解决这个问题(例如安装 X11-library xy,使用神奇的 -XXjava2dfailsafe 参数启动我的 java 程序或类似的东西)
并加入一群可以轻松等待 Oracle 解决实际问题的人中?

此致 飞鸟

顺便说一句,我的 stackstrace 看起来像这样:

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)
[...]

我想出了一个解决方法对于这个问题。

简而言之:使用参数启动 JVM-Dsun.java2d.xrender=false.

有了这个选项,我就不再看到问题了。

背景信息

The 错误 JDK-7172749 https://bugs.openjdk.java.net/browse/JDK-7172749最近已使用 jdk9 build 124 进行了修复,并且该错误修复已通过向后移植JDK-8158068 https://bugs.openjdk.java.net/browse/JDK-8158068到 jdk8 更新 112。您可以从这里下载 jdk8u112 构建预览:JDK8 早期访问版本 https://jdk8.java.net/download.html.

然而,运行这个构建并没有解决我的问题。

我的情况,我遇到了这个错误:我正在运行 jEdit,并且在我从挂起到 RAM 恢复 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 的整个窗口或部分窗口不会绘制并保持白色。

看着向后移植的错误修复补丁 http://hg.openjdk.java.net/jdk8u/jdk8u-dev/jdk/rev/907689a62eab,它实际上修复了另一个类中的 ClassCastException,即sun.java2d.xr.XRRenderer.

因此,这并没有解决我的问题也就不足为奇了。

另一个谷歌搜索显示错误 JDK-6975408 https://bugs.openjdk.java.net/browse/JDK-6975408这让我意识到了系统属性sun.java2d.xrender.

更多搜索:

  • 该选项的描述见Java 2D 技术的系统属性 https://docs.oracle.com/javase/8/docs/technotes/guides/2d/flags.html#xrender

    Quote:

    xrender

    有可能的使用:为基于 X11 的现代桌面启用基于 XRender 的 Java 2D 渲染管道,从而提供改进的图形性能。

    介绍:Java SE 7

    默认值: false

    如何使用:默认情况下禁用管道,但可以通过设置命令行属性来启用-Dsun.java2d.xrender=true。较旧的 X11 配置可能无法支持 XRender。冗长的形式,-Dsun.java2d.xrender=True,可用于向标准输出启用一条消息,指示管道是否实际已启用。

  • 是的,这是 Java7 中添加的一个功能:Xrender 管道现在位于 JDK7 master 中 http://linuxhippy.blogspot.de/2010/06/xrender-pipeline-now-in-jdk7-master.html

    也可以看看Java SE 7 中的增强功能 https://docs.oracle.com/javase/8/docs/technotes/guides/2d/enhancements70.html

  • 对于 Java8,现在默认启用它:Java8:默认启用 Xrender Java2D 管道 http://linuxhippy.blogspot.de/2014/03/java8-xrender-java2d-pipeline-enabled.html

    根据此博客的评论,XRender 管道仅与 Java2D、AWT 和 Swing 相关 - 其​​他 GUI 框架(JavaFX、SWT...)不受影响:

    基于 Swing/AWT 的应用程序应该会受益,SWT/JavaFX/lwjgl/jogl 使用与 Java2D 不相关的其他代码路径。

    我在发行说明中没有找到任何内容,但在源代码中,很明显,默认情况下启用了 XRender 管道:sun/awt/X11GraphicsEnvironment.java http://hg.openjdk.java.net/jdk8u/jdk8u-dev/jdk/file/b44d695f738b/src/solaris/classes/sun/awt/X11GraphicsEnvironment.java The commit http://hg.openjdk.java.net/jdk8u/jdk8u-dev/jdk/rev/6664b47ddfd9根据ticket https://bugs.openjdk.java.net/browse/JDK-7077423它总是在第一个 jdk8 版本中出现。 我想,我之前没有遇到这个错误的原因是,我可能使用 java7 作为运行时很长一段时间,并且 eclipse 不受影响。

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

It's 错误 JDK-8133723 https://bugs.openjdk.java.net/browse/JDK-8133723: sun.awt.image.BufImgSurfaceData 无法转换为 sun.java2d.xr.XRSurfaceData - 它实际上不是重复的...... 然而,重现这个错误可能很困难。它仅在挂起至 RAM 周期后出现。

更新 1 - 触发器

该错误是通过使用 xrandr 更改输出显示来触发的,例如

xrandr --output eDP1 --auto --output DVI-1-0 --off

将立即引发 ClassCastException。当我在挂起之前关闭显示器时,我认为这是挂起恢复导致的,但这是错误的。

更新 2 - 新的 Java 错误单

现在有一个新的 java bug 票证:JDK-8160328 https://bugs.openjdk.java.net/browse/JDK-8160328

更新 3 - 使用 jdk-9-ea-b131 修复

错误票JDK-8160328 https://bugs.openjdk.java.net/browse/JDK-8160328已作为以下重复项被关闭JDK-8147542 https://bugs.openjdk.java.net/browse/JDK-8147542- 这个已经被修复了java 9 的最新 EA 版本 https://jdk9.java.net/download/(版本 131 及更高版本)。

我可以确认,使用 xrandr 切换监视器时不再出现 ClassCastException。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我如何解决 java2d 中的 ClassCastException(错误 ID 7172749) 的相关文章

  • HAProxy SSL终止+客户端证书验证+curl/java客户端

    我希望使用我自己的自签名证书在 HAProxy 上进行 SSL 终止 并使用我创建的客户端证书验证客户端访问 我通过以下方式创建服务器 也是 CA 证书 openssl genrsa out ca key 1024 openssl req
  • Reactive Spring 不支持 HttpServletRequest 作为 REST 端点中的参数?

    我创建了一个 RestController 如下所示 RestController public class GreetingController RequestMapping value greetings method RequestM
  • 文本在指定长度后分割,但不要使用 grails 打断单词

    我有一个长字符串 需要将其解析为长度不超过 50 个字符的字符串数组 对我来说 棘手的部分是确保正则表达式找到 50 个字符之前的最后一个空格 以便在字符串之间进行彻底的分隔 因为我不希望单词被切断 public List
  • 删除优先级队列的尾部元素

    如何删除优先级队列的尾部元素 我正在尝试使用优先级队列实现波束搜索 一旦优先级队列已满 我想删除最后一个元素 优先级最低的元素 Thanks 没有简单的方法 将元素从原始元素复制到新元素 最后一个除外 PriorityQueue remov
  • 后台分叉无法正常工作[重复]

    这个问题在这里已经有答案了 我运行这个程序 在前景和背景中 int main int pid printf App Start pid d n getpid while 1 pid fork if pid 0 printf Child n
  • 为自定义驱动程序创建 GraphicsDevice

    我正在开发一个在嵌入式系统中使用 Java 的项目 我有用于屏幕和触摸输入的驱动程序 以及用于文本输入的虚拟键盘 我的屏幕驱动程序有一个Graphics2D您可以绘制的对象和repaint Rectangle 更新方法 类似地 触摸驱动器能
  • 为什么Iterator接口没有add方法

    In IteratorSun 添加了remove 方法来删 除集合中最后访问的元素 为什么没有add方法来向集合中添加新元素 它可能对集合或迭代器产生什么样的副作用 好的 我们开始吧 设计常见问题解答中明确给出了答案 为什么不提供 Iter
  • 如何检测图像是否像素化

    之前有人在 SO 上提出过这样的问题 在Python中检测像素化图像 https stackoverflow com questions 12942365 detecting a pixelated image in python还有关于q
  • Java中的断点和逐步调试?

    抱歉我的问题名称很奇怪 我不知道如何寻找这个 因为我不知道这些东西是如何称呼的 Visual Studio 中至少有一个功能 您可以单击代码左侧并设置一个大红点的起点 然后运行程序 您可以通过按 f8 或 f5 实际上是不同的 f 来跟踪步
  • 从直方图计算平均值和百分位数?

    我编写了一个计时器 可以测量任何多线程应用程序中特定代码的性能 在下面的计时器中 它还会在地图中填充花费了 x 毫秒的调用次数 我将使用这张图作为我的直方图的一部分来进行进一步的分析 例如调用花费了这么多毫秒的百分比等等 public st
  • 从休眠乐观锁定异常中恢复

    我有一个这样的方法 Transactional propagation Propagation REQUIRES NEW public void doSomeWork Entity entity dao loadEntity do some
  • 用于缓存的 Servlet 过滤器

    我正在创建一个用于缓存的 servlet 过滤器 这个想法是将响应主体缓存到memcached 响应正文由以下方式生成 结果是一个字符串 response getWriter print result 我的问题是 由于响应正文将不加修改地放
  • 我们如何测试包私有类?

    我正在看书Effective Java in Item 13 Minimize the accessibility of classes and members 它提到 为了方便测试 您可能想让类 接口或成员更易于访问 这在某种程度上是好的
  • 无法在 Java/Apache HttpClient 中处理带有垂直/管道栏的 url

    例如 如果我想处理这个网址 post new HttpPost http testurl com lists lprocess action LoadList 401814 1 Java Apache 不允许我这么做 因为它说竖线 是非法的
  • IntelliJ 组织导入

    IntelliJ 是否具有类似于 Eclipse 中的组织导入功能 我拥有的是一个 Java 文件 其中多个类缺少导入 例子 package com test public class Foo public Map map public J
  • 如何让 Emma 或 Cobertura 与 Maven 一起报告其他模块中源代码的覆盖率?

    我有一个带有 Java 代码的多模块 Maven 设置 我的单元测试在其中一个模块中测试多个模块中的代码 当然 这些模块具有相互依赖性 并且在测试执行之前根据需要编译所有相关模块中的代码 那么 如何获得整个代码库覆盖率的报告 注意 我不是问
  • 源值 1.5 的错误已过时,将在未来版本中删除

    我使用 scala maven plugin 来编译包含 scala 和 java 代码的项目 我已经将源和目标设置为1 7 但不知道为什么maven仍然使用1 5 这是我在 pom xml 中的插件
  • 使用 Java https 上传到 Imgur v3 错误

    我目前正在尝试使用他们当前的 API v3 上传到 imgur 但是我不断收到错误 错误 javax net ssl SSLException 证书中的主机名不匹配 api imgur com imgur com OR imgur com
  • 记录类名、方法名和行号的性能影响

    我正在我的 java 应用程序中实现日志记录 以便我可以调试应用程序投入生产后可能出现的潜在问题 考虑到在这种情况下 人们不会奢侈地使用 IDE 开发工具 以调试模式运行事物或单步执行完整代码 因此在每条消息中记录类名 方法名和行号将非常有
  • try-with-resources 中出现死代码警告,但翻译后的 try-catch-finally 中没有出现死代码警告

    以下代码使用try 有资源 https docs oracle com javase specs jls se7 html jls 14 html jls 14 20 3Java 8 中引入的构造 偶尔抛出 方法被声明为抛出一个偶尔的异常

随机推荐

  • 为什么“rails runner -e production”不起作用?

    为了解决我的问题 该问题在 生产中的 will paginate 错误未定义方法 paginate https stackoverflow com questions 19577344 will paginate error in prod
  • 如何使用查找和替换在 Xcode 中用单个新行替换多个新行

    在Xcode项目中 我们编写程序时一般不会关注行间距 那么编码完成后 如何用一行删除所有多余的换行符呢 在文本搜索字段中 可以使用以下方法进行多行 非打印字符 搜索 替换 假设我想替换所有实例 This is a comment with
  • 我的 Cocos2D-iPhone 游戏可以支持 VoiceOver 吗?

    我正在制作一款游戏 玩家通过动作对声音做出反应 由于玩游戏不需要视觉元素 而且许多人都是闭着眼睛玩的 所以不完全兼容 VoiceOver 似乎很遗憾 我目前正在使用 Cocos2D iPhone 和 CocosDenshion 来处理音频
  • php图像显示无需在邮件中下载

    您好 我想使用 php 邮件程序类发送 html 格式的图像 但图像下载后显示在邮件中 但我想显示图像而不下载 邮件程序类中是否有任何选项或者有另一种方法 或者我必须以其他格式发送图像 好吧 可能的答案只有两种 您不想在电子邮件中嵌入实际的
  • 使用 IO 在 C# 中读取十六进制

    我是从 Java 转向 C 的新手 我正在尝试使用十六进制 IO 读取文件 当我读取第一个字节时 我看不到我在十六进制编辑器中看到的内容 我在用着 StreamReader reader new StreamReader fileDirec
  • 如何获得与 Apple 推送通知一起播放的自定义声音?

    我正在尝试在发送 Apple 推送通知时播放自定义声音 显示弹出消息 徽章也会更新 但我总是播放默认的 iPhone 声音 而不是我的自定义声音 这是我发送的 JSON 数据 aps sound sound caf badge 2 aler
  • 将值返回给不同的 Activity

    我有一个应用程序 基本上看起来像附图中的设计 可以看到 有4个Activity 部分Activity有碎片 我想将测试的答案返回到用户的个人资料中 到目前为止 我一直将结果上传到服务器 并让应用程序在用户每次返回时更新用户的个人资料简介活动
  • ng-repeat 过滤器“显示所有”项目(如果未选择过滤器)

    我有一个ng repeat过滤器使用
  • iOS 7 UIWebView 键盘问题

    我必须像这里一样删除这个栏link https stackoverflow com questions 13101642 ios keyboard style in webview但对于 iOS 7 此代码不起作用 我们通过一些 Objec
  • 忽略触发器中的错误

    我有一个存储过程 在插入 更新 删除时的触发器内调用 问题是这个 SP 中有一个不重要的代码块 因此我想忽略此代码块引起的任何错误 我将此代码块插入到 TRY CATCH 块中 但令我惊讶的是我收到了以下错误 当前事务无法提交 并且无法支持
  • 如何在 AWS Step Function 中获取纪元时间

    我们可以使用 State EnteredTime 引用AWS Step函数中的当前时间 但这给出了ISO格式 有没有办法获取纪元秒 毫秒 我想基于此在 DynamoDB 中添加 TTL 值 这可能吗 或者我是否必须仅为时间戳调用 Lambd
  • 观察对象的所有元素(除了一个元素)

    我的代码中有一块手表 scope watch foo function true 这确保了如果对象 foo 中的任何属性发生更改 则将调用此监视 我想对此破例 如果 foo 中除一个属性之外的任何属性发生更改 我想调用此监视 如果该属性发生
  • 如何使用从密码派生的密钥正确加密和解​​密文件

    我正在尝试找出使用 PBEWithHmacSHA256AndAES 256 标准加密和解密文件的正确过程 据我了解 看这个示例代码 https docs oracle com javase 8 docs technotes guides s
  • 如何从文件中获取 Unix 权限掩码? [复制]

    这个问题在这里已经有答案了 如何使用 python 在 nix 上获取文件的权限掩码 例如 644 或 755 有没有任何函数或类可以做到这一点 非常感谢 os stat是一个包装器stat 2 http linux die net man
  • 谷歌绘图 API [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一种方法来创建谷歌绘图 https docs google com drawings通过 A
  • docker 存储库名称组件必须匹配

    我正在尝试使用此插件构建我的图像 https github com spotify docker maven plugin use a dockerfile https github com spotify docker maven plu
  • 使用jetpack导航将自定义过渡动画添加到底部导航设置

    我正在开发一个使用 jetpack 组件的应用程序 我用三个片段缝合了底部导航 如guide https developer android com topic libraries architecture navigation navig
  • 来电时系统级别会发生什么?

    我已经从以下位置下载了 master 分支的完整源代码https android googlesource com platform frameworks base master https android googlesource com
  • 带有数学运算符的递归函数

    我想构建一个函数 它接受两个自然数 n 和 m 并返回以 n 开头并以 m 1 结尾的所有自然数的平方的元组 如果 m 小于 n 我能够决定函数是否应该返回 但它不应该崩溃或返回某种错误消息 因此 squares tuple 3 7 返回
  • 我如何解决 java2d 中的 ClassCastException(错误 ID 7172749)

    我很不幸遇到了 java8 的 bug 对于其他人来说这似乎不是什么大问题 因此 Oracle 不会在 java9 之前修复它 该错误有错误 ID 7172749 http bugs java com bugdatabase view bu