时不时地查看一些代码,并认为它不可能是错误的。 一旦您排除了简单的程序员搞砸代码/代码中的敌对行为(确保您阅读Java Puzzlers或类似内容)或并发问题(阅读Java Concurrency或继续学习Heniz博士的出色课程 ),您应该坐下来花几天时间然后开始考虑JDK是否确实可以帮助您。 在我从事Java程序员的18多年中,我还没有见过如此狂野的家伙,所以这让我感到惊讶。

如果在大型Swing应用程序中针对JDK 8运行,则最终可能会看到很多次以下异常。 (除非您在日志记录代码中忘记了我在上一个博客中获得的教训,在这种情况下,您可能会看到很多ArrayOfOutBoundsException)

Caused by: java.lang.NullPointerException at javax.swing.text.GlyphView.getBreakSpot(GlyphView.java:799) at javax.swing.text.GlyphView.getBreakWeight(GlyphView.java:724) at javax.swing.text.FlowView$LogicalView.getPreferredSpan(FlowView.java:733) at javax.swing.text.FlowView.calculateMinorAxisRequirements(FlowView.java:233) at javax.swing.text.ParagraphView.calculateMinorAxisRequirements(ParagraphView.java:717) at javax.swing.text.BoxView.checkRequests(BoxView.java:935) at javax.swing.text.BoxView.getMinimumSpan(BoxView.java:568) at javax.swing.text.BoxView.calculateMinorAxisRequirements(BoxView.java:903) at javax.swing.text.BoxView.checkRequests(BoxView.java:935) at javax.swing.text.BoxView.setSpanOnAxis(BoxView.java:343) at javax.swing.text.BoxView.layout(BoxView.java:708) at javax.swing.text.BoxView.setSize(BoxView.java:397) ...

此错误特别隐蔽,因为它需要大约十分钟才能显示出来,有时甚至根本不需要。 如果您查看该类的代码,则所讨论的行以“ startsFrom = break”开头,仅访问两个局部变量,这两个局部变量先前已在该方法中进行了引用。

Segment s = getText(pstart, pend); s.first(); BreakIterator breaker = getBreaker(); breaker.setText(s); // Backward search should start from end+1 unless there's NO end+1 int startFrom = end + (pend > end ? 1 : 0); for (;;) { startFrom = breaker.preceding(s.offset + (startFrom - pstart))   + (pstart - s.offset); if (startFrom > start) { // The break spot is within the view bs[ix++] = startFrom; } else { break; } }

排除JIT错误的最直接方法是仅针对单个方法禁用编译,下面是一个示例。 但是您可以在命令行Java工具的文档中找到更多信息。

javaThing -XX:CompileCommand=exclude,javax/swing/text/GlyphView,getBreakSpot

添加此参数后,问题就消失了。 –由于我们已通过代码或并发问题排除了敌方行动,因此我们可以更加确定这是JIT问题。 现在,作为此错误记录的一部分,我输出了该单一方法的诊断信息,并发现直到第五次方法被JITted时,问题才出现。

javaThing -XX:CompileCommand=print,javax/swing/text/GlyphView,getBreakSpot

这是上面命令显示的一些诊断输出:

Compiled method (c2)  914078 33142       4       javax.swing.text.GlyphView::getBreakSpot (247 bytes)total in heap  [0x00002aaab0749e10,0x00002aaab0750fe0] = 29136relocation     [0x00002aaab0749f38,0x00002aaab074a1e8] = 688constants      [0x00002aaab074a200,0x00002aaab074a2a0] = 160main code      [0x00002aaab074a2a0,0x00002aaab074cde0] = 11072stub code      [0x00002aaab074cde0,0x00002aaab074ce40] = 96oops           [0x00002aaab074ce40,0x00002aaab074ce58] = 24metadata       [0x00002aaab074ce58,0x00002aaab074d058] = 512scopes data    [0x00002aaab074d058,0x00002aaab074ea20] = 6600scopes pcs     [0x00002aaab074ea20,0x00002aaab0750c50] = 8752dependencies   [0x00002aaab0750c50,0x00002aaab0750c80] = 48handler table  [0x00002aaab0750c80,0x00002aaab0750e90] = 528nul chk table  [0x00002aaab0750e90,0x00002aaab0750fe0] = 336
OopMapSet contains 113 OopMaps
#0
OopMap{[8]=Oop [32]=Oop [40]=Oop off=892}
#1
OopMap{[32]=Oop [40]=Oop off=960}
#2
OopMap{[32]=Oop [40]=Oop off=980}
#3
OopMap{[32]=Oop [40]=Oop [48]=Oop off=1048}
#4
OopMap{[32]=Oop [40]=Oop [48]=Oop off=1084}
#5
OopMap{[0]=Oop [24]=Oop [48]=Oop [56]=Oop [80]=Oop off=2500}
#6
OopMap{rbx=Oop rdi=Oop [32]=Oop [40]=Oop [112]=Oop off=2533}
#7
OopMap{rbx=Oop rdi=Oop r14=Oop [32]=Oop [112]=Oop off=3081}
#8
OopMap{rbx=Oop rdi=Oop r14=Oop [32]=Oop [40]=Oop [112]=Oop off=3190}
#9
OopMap{[8]=Oop [32]=Oop [40]=Oop off=4408}
#10
OopMap{[32]=Oop [40]=Oop [48]=Oop off=4640}
#11
OopMap{rbp=Oop [16]=Oop [24]=Oop [40]=Oop [64]=Oop off=5232}
#12
OopMap{rbp=Oop [0]=NarrowOop [32]=Oop off=5364}
#13
OopMap{[32]=Oop [40]=Oop [48]=Oop off=5408}
#14
OopMap{rbp=Oop [32]=Oop [40]=Oop [48]=Oop off=5436}
#15
OopMap{rbp=Oop [32]=Oop [40]=Oop [48]=Oop off=5468}
#16
OopMap{rbp=Oop [32]=Oop [40]=Oop [48]=Oop off=5524}
#17
OopMap{rbp=Oop [32]=Oop [40]=Oop [48]=Oop [88]=Oop off=5552}
#18
OopMap{[32]=Oop [40]=Oop [48]=Oop [64]=Oop [72]=Derived_oop_[64] [112]=Oop off=5608}
#19
OopMap{[8]=Oop [32]=Oop off=5680}
#20
OopMap{rbp=Oop off=5720}
#21
OopMap{rbp=Oop off=5752}
#22
OopMap{rbp=Oop [24]=NarrowOop [28]=NarrowOop [32]=Oop [40]=Oop [48]=Oop [56]=Oop [64]=Oop [88]=Oop off=5812}
#23
OopMap{rbp=Oop [16]=Oop [24]=Oop [40]=Oop [64]=Oop [88]=Oop off=5960}
#24
OopMap{[0]=Oop [24]=Oop [48]=Oop [56]=Oop [72]=Oop [88]=NarrowOop off=6056}
#25
OopMap{[40]=Oop off=6088}
#26
OopMap{[0]=Oop off=6120}
#27
OopMap{[8]=Oop [24]=Oop [56]=Oop [72]=Oop [112]=Oop off=6216}
#28
OopMap{[0]=Oop [32]=NarrowOop [40]=Oop off=6284}
#29
OopMap{rbp=Oop [16]=Oop [40]=Oop [64]=Oop [112]=Oop off=6384}
#30
OopMap{[0]=Oop off=6412}
#31
OopMap{[0]=Oop [16]=Oop [32]=NarrowOop [40]=Oop [48]=Oop off=6488}
#32
OopMap{rbp=Oop [16]=Oop [40]=Oop [48]=Oop off=6560}
#33
OopMap{[32]=Oop [40]=Oop [48]=Oop [64]=Oop [112]=Oop off=6608}
#34
OopMap{[8]=Oop [28]=NarrowOop [32]=Oop [40]=Oop [48]=Oop off=6768}
#35
OopMap{rbp=NarrowOop [0]=Oop [16]=Oop [32]=Oop [40]=NarrowOop off=6860}
#36
OopMap{[0]=Oop [16]=Oop [32]=NarrowOop [40]=Oop [48]=Oop off=6988}
#37
OopMap{rbp=Oop [32]=Oop off=7024}
#38
OopMap{rbp=NarrowOop [0]=Oop [24]=Oop [32]=Oop off=7260}
#39
OopMap{rbp=NarrowOop [0]=Oop [24]=Oop [32]=Oop off=7344}
#40
OopMap{rbp=Oop [16]=Oop [24]=Oop [40]=Oop [60]=NarrowOop [64]=Oop off=7452}
#41
OopMap{rbp=NarrowOop [32]=Oop off=7476}
#42
OopMap{rbp=NarrowOop [0]=Oop off=7524}
#43
OopMap{[32]=Oop [40]=Oop [48]=Oop off=7588}
#44
OopMap{[32]=Oop [40]=Oop [48]=Oop off=7616}
#45
OopMap{[32]=Oop [40]=Oop [48]=Oop off=7632}
#46
OopMap{rbp=NarrowOop [32]=Oop off=7676}
#47
OopMap{rbp=NarrowOop [0]=Oop off=7724}
#48
OopMap{[0]=Oop [16]=Oop [28]=NarrowOop [40]=Oop [48]=Oop [56]=NarrowOop [64]=Oop off=7868}
#49
OopMap{[8]=Oop [28]=NarrowOop [32]=Oop [40]=Oop [48]=Oop [56]=Oop off=7916}
#50
OopMap{rbp=Oop [16]=Oop [24]=NarrowOop off=8016}
#51
OopMap{rbp=Oop [16]=Oop [28]=NarrowOop off=8080}
#52
OopMap{rbp=NarrowOop [0]=Oop [24]=Oop [32]=Oop off=8152}
#53
OopMap{rbp=Oop [8]=NarrowOop off=8212}
#54
OopMap{rbp=NarrowOop [32]=Oop off=8236}
#55
OopMap{rbp=Oop [16]=NarrowOop off=8272}
#56
OopMap{rbp=NarrowOop [0]=Oop off=8320}
#57
OopMap{rbp=Oop [12]=NarrowOop off=8360}
#58
OopMap{rbp=NarrowOop [32]=Oop off=8400}
#59
OopMap{rbp=Oop [12]=NarrowOop off=8460}
#60
OopMap{rbp=NarrowOop [0]=Oop off=8508}
#61
OopMap{rbp=Oop [24]=NarrowOop [40]=Oop off=8572}
#62
OopMap{rbp=Oop off=8600}
#63
OopMap{rbp=Oop [8]=Oop [28]=NarrowOop off=8640}
#64
OopMap{rbp=Oop [8]=Oop [20]=NarrowOop [112]=Oop off=8704}
#65
OopMap{rbp=Oop [16]=Oop [24]=Oop [48]=Oop off=8788}
#66
OopMap{rbp=Oop [16]=Oop [24]=Oop [40]=Oop [64]=Oop off=8912}
#67
OopMap{rbp=Oop [16]=Oop [24]=Oop [40]=Oop [64]=Oop off=9036}
#68
OopMap{rbp=Oop [16]=Oop [24]=Oop [40]=Oop [64]=Oop off=9160}
#69
OopMap{rbp=Oop [16]=Oop [24]=Oop [40]=Oop [64]=Oop off=9284}
#70
OopMap{rbp=Oop [16]=Oop [24]=Oop [40]=Oop [64]=Oop off=9408}
#71
OopMap{rbp=Oop [16]=Oop [24]=Oop [40]=Oop [64]=Oop off=9532}
#72
OopMap{off=9556}
#73
OopMap{off=9580}
#74
OopMap{off=9604}
#75
OopMap{[112]=Oop off=9628}
#76
OopMap{rbp=Oop [8]=Oop [24]=Oop [32]=NarrowOop off=9696}
#77
OopMap{rbp=Oop [8]=Oop [24]=NarrowOop off=9760}
#78
OopMap{off=9784}
#79
OopMap{off=9812}
#80
OopMap{off=9836}
#81
OopMap{off=9860}
#82
OopMap{off=9884}
#83
OopMap{off=9908}
#84
OopMap{off=9932}
#85
OopMap{off=9956}
#86
OopMap{off=9980}
#87
OopMap{off=10004}
#88
OopMap{off=10028}
#89
OopMap{rbp=Oop [16]=Oop [28]=NarrowOop off=10092}
#90
OopMap{rbp=Oop [16]=Oop [24]=Oop [48]=Oop off=10176}
#91
OopMap{off=10200}
#92
OopMap{off=10224}
#93
OopMap{off=10248}
#94
OopMap{off=10272}
#95
OopMap{off=10296}
#96
OopMap{off=10320}
#97
OopMap{off=10344}
#98
OopMap{off=10368}
#99
OopMap{off=10392}
#100
OopMap{off=10416}
#101
OopMap{off=10440}
#102
OopMap{off=10464}
#103
OopMap{off=10488}
#104
OopMap{off=10512}
#105
OopMap{off=10536}
#106
OopMap{off=10560}
#107
OopMap{off=10584}
#108
OopMap{off=10608}
#109
OopMap{off=10632}
#110
OopMap{off=10656}
#111
OopMap{off=10680}
#112
OopMap{off=11028}
java.lang.NullPointerExceptionat javax.swing.text.GlyphView.getBreakSpot(GlyphView.java:799)at javax.swing.text.GlyphView.getBreakWeight(GlyphView.java:724)at javax.swing.text.html.InlineView.getBreakWeight(InlineView.java:150)at javax.swing.text.FlowView$LogicalView.getPreferredSpan(FlowView.java:733)at javax.swing.text.FlowView.calculateMinorAxisRequirements(FlowView.java:233)at javax.swing.text.ParagraphView.calculateMinorAxisRequirements(ParagraphView.java:717)at javax.swing.text.html.ParagraphView.calculateMinorAxisRequirements(ParagraphView.java:157)at javax.swing.text.BoxView.checkRequests(BoxView.java:935)at javax.swing.text.BoxView.getMinimumSpan(BoxView.java:568)at javax.swing.text.html.ParagraphView.getMinimumSpan(ParagraphView.java:270)at javax.swing.text.BoxView.calculateMinorAxisRequirements(BoxView.java:903)

现在,我仍在与JDK团队合作解决此问题。 但是我确实觉得我已经找到了一套有用的工具,可以提供一些证据来证明JIT编译器正在造成我的糟糕状况。 更重要的是,我有一种解决方法,因此可以运行测试,直到解决为止。

翻译自: https://www.javacodegeeks.com/2014/11/but-thats-impossible-or-finding-out-that-the-jit-has-broken-your-code.html

但这是不可能的,或者无法发现JIT破坏了您的代码。相关推荐

  1. 从言行合一到知行合一

    本篇记录突然的随想,偶尔停留 2022-01-17 rest不只是一个简单的api约束分享一本rest小手册,如何把东西变得 RESTful! 2021-12-06 规划 未来编程.   未来需要什么 ...

  2. 继承WebMvcConfigurer 和 WebMvcConfigurerAdapter类依然CORS报错? springboot 两种方式稳定解决跨域问题

    继承WebMvcConfigurer 和 WebMvcConfigurerAdapter类依然CORS报错???springboot 两种方式稳定解决跨域问题! 之前我写了一篇文章,来解决CORS报错 ...

  3. 程序主动进行电话短信报警,自定义电话、短信、钉钉报警通知

    程序主动进行电话短信报警,自定义电话.短信.钉钉报警通知 一. 规则说明 这里我们要利用到阿里云的云监控的手段,有一个叫做事件监控的东西,可以通过自定义事件上传来进行监控报警. 流程: 程序发现错误 ...

  4. Java 获取当前时间之后的第一个周几,java获取当前日期的下一个周几

    Java 获取当前时间之后的第一个周几,java获取当前日期的下一个周几 //获得入参的日期 Calendar cd = Calendar.getInstance(); cd.setTime(date ...

  5. mysql并发更新数据,多用户并发修改数据解决方案。

    mysql并发更新数据,多用户并发修改数据解决方案. 在系统中,有一些如余额.资产.积分的数据,是要保证数据一致性的.如,一个人使用两个设备同时进行消费操作,如何保证数据一致性的问题. 我们一起来思考 ...

  6. 是否存在分布式的【大泥球】?

    2021-11-11 15:08 是否存在分布式的[大泥球]? 人们往往把微服务架构当成一剂良药,用以解决单体应用内的大泥球问题.然而,大泥球的本质问题是因为代码都位于同一个进程里运行的吗?换言之,如 ...

  7. 阿里云K8S容器服务的使用

    使用阿里云k8s构建服务 一. 上传镜像 二. k8s运行 三. 服务配置导入 四. 服务路由 五. 节点亲和性和污点管理 一. 上传镜像 在阿里云控制台找到"容器镜像服务",开启 ...

  8. 系统架构升级要不要上微服务?历“久”弥新微服务——你真的需要升级微服务架构吗

    在 <微服务架构设计模式> 一书中,作者总结了关于微服务的一些"重点",原文如下: 中国企业和开发者对微服务架构的热情让我印象深刻.但如同我给所有客户的忠告一样,我想对 ...

  9. SpringBoot部署脚本,拿走即用!

    一个可以直接拿来使用的shell脚本,适用于springboot项目 #!/bin/bash # 这里可替换为你自己的执行程序,其他代码无需更改,绝对路径相对路径均可. # 若使用jenkins等工具 ...

  10. kotlin设置CORS跨域资源共享,java设置允许跨域,服务端如何设置 springboot中设置跨域资源共享

    CORS通信过程,都是浏览器或http插件自动完成,不需要 用户/开发人员 参与.对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码是完全一样的.浏览器一旦发现AJAX请求跨源,就会自动添 ...

最新文章

  1. 专注文本处理,达观数据完成B轮融资,累计融资超2亿元
  2. 解决 python pip install安装速度慢| 版本低|跨过个别错误包
  3. 对于模板渲染的页面,如何针对渲染出来的对象添加事件
  4. C语言实现:输入一串字符把里面的A、a字符替换成C输出
  5. Asp.NET获取文件及其路径
  6. [Leedcode][JAVA][第542题][01矩阵][BFS]
  7. mysql id还原_一次线上DB问题排查(MySQL、事务、MVCC)
  8. 《推荐系统学习(二)》PCA降维方法的数学推导
  9. ftp服务器端的编写 c语言6,linux下c语言编写的ftp服务器
  10. 数据分列将数字转换成文本格式
  11. 前端存储之websql
  12. 浅谈BCD码同二进制转换
  13. Spark机器学习实例
  14. 公关世界杂志公关世界杂志社公关世界编辑部2022年第14期目录
  15. 九大百度竞价操作技巧
  16. android 7 sl4a,SL4A蟒蛇作出android手机
  17. 使用QUuid生成唯一码
  18. 企业微信组织架构同步优化的思路
  19. android应用间相互调用
  20. 快速查询单号物流,导出详细信息生成表格

热门文章

  1. React中路由组件与一般组件
  2. (转)base64编码(严格说来,base64不算作加解密算法)
  3. SpringBoot连接多RabbitMQ源
  4. Java Springboot应用部署
  5. 使用腾讯云发送短信API接口实现(完整流程)
  6. java中抽象类继承抽象类_用Java中的抽象类扩展抽象类
  7. java使用迭代器删除元素_使用Java从地图中删除元素
  8. snmp与java集成_轻松地与Java完全集成
  9. java 交替_Java 8:使用交替接口公开的类型安全地图生成器
  10. java8 streams_Java 8 Streams API:对流进行分组和分区