我运气不好,遇到了java8的bug,
这对其他人来说似乎不是什么大问题,因此 Oracle 不会在 java9 之前修复它。
该错误有 Bug-ID 7172749 (还要注意相关和重复的错误)
它只是发生在某台 Linux 机器上一直。
我在使用 jdk1.8.0_u66 的 Ubuntu 14.04.3 LTS 上遇到了这个问题。
但是,在装有 Ubuntu 12.04.3 LTS 和相同 JDK 版本的另一个机器上,我根本无法重现该问题。
令我困惑的是,这似乎对其他任何人来说都不是一个障碍,所以我想也许我犯了一个特别愚蠢的错误…… 我正在运行 Oracle-JDK(与 OpenJDK 相对),因为我们的客户使用相同的版本(尽管是在 Windows 上)并且想法是接近他们的环境。
所以,我的问题是,如何解决这个问题(例如,安装 X11-library xy,使用神奇的 -XXjava2dfailsafe 参数启动我的 java 程序,或类似这些)
加入可以轻松等待 Oracle 解决实际问题的人群?
最好的问候 托比
顺便说一句,我的堆栈跟踪看起来像这样:
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)
[...]
最佳答案
我找到了解决该问题的解决方法。
简而言之:使用参数-Dsun.java2d.xrender=false启动JVM。
有了这个选项,我就再也看不到问题了。
Bug JDK-7172749现在最近已用 jdk9 build 124 修复,错误修复已通过 JDK-8158068 向后移植到 jdk8 更新 112。您可以从此处下载 jdk8u112 构建预览:JDK8 Early Access Releases .
但是,运行这个构建并没有解决我的问题。
我遇到错误的情况:我正在运行 jEdit,在我将 Linux 从挂起恢复到 RAM 后看到这些 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 的整个窗口或部分未绘制并保持白色。
查看 patch for the backported bugfix ,它实际上修复了另一个类中的 ClassCastException,即 sun.java2d.xr.XRRenderer。
因此,这并没有解决我的问题也就不足为奇了。
另一个谷歌搜索显示bug JDK-6975408这让我意识到系统属性 sun.java2d.xrender。
更多搜索:
此选项在 System Properties for Java 2D Technology 中有描述
引用:
xrender
Intended use: To enable the XRender-based Java 2D rendering pipeline for modern X11-based desktops, offering improved graphics performance.
Introduced: Java SE 7
Default value: false
How to use: The pipeline is disabled by default, but may be enabled by setting the command line property
-Dsun.java2d.xrender=true. Older X11 configurations may not be able to support XRender. The verbose form,-Dsun.java2d.xrender=True, can be used to enable a message to stdout indicating whether the pipeline was actually enabled.
是的,它是Java7 中添加的一个特性:Xrender pipeline now in JDK7 master
对于 Java8,它现在默认启用:Java8: Xrender Java2D pipeline enabled by default
根据此博客的评论,XRender 管道仅与 Java2D、AWT 和 Swing 相关 - 其他 GUI 框架(JavaFX、SWT 等)不受影响:
Swing/AWT based application should benefit, SWT/JavaFX/lwjgl/jogl use other codepaths not related to Java2D.
我没有在发行说明中找到任何内容,但在源代码中,很明显,默认情况下启用了 XRender 管道:sun/awt/X11GraphicsEnvironment.java commit根据ticket,这改变了这一点,已经在 2011 年完成了它始终伴随着第一个 jdk8 版本。 我想,我之前没有遇到这个错误的原因是,我可能使用 java7 作为运行时相当长,而 eclipse 不受影响。
再次仔细查看重复的错误报告,已经有一个与堆栈跟踪相匹配:
是bug JDK-8133723 :sun.awt.image.BufImgSurfaceData 无法转换为 sun.java2d.xr.XRSurfaceData - 它真的不是重复的...... 但是,重现此错误可能很困难。它仅在挂起到 RAM 周期后出现。
该错误是通过使用 xrandr 更改输出显示触发的,例如
xrandr --output eDP1 --auto --output DVI-1-0 --off
将立即引发 ClassCastException。当我在挂起之前关闭我的显示器时,我认为这是挂起-恢复导致的,但这是错误的。
现在有一个新的 Java 错误票:JDK-8160328
漏洞票 JDK-8160328已作为 JDK-8147542 的副本关闭- 这个已经用 latest EA build for java 9 修复了(构建 131 及更高版本)。
我可以确认,在使用 xrandr 切换监视器时,我不再遇到 ClassCastException。
关于java - 我如何解决 java2d 中的 ClassCastException(错误 ID 7172749),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34188495/
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时
作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack