但这是不可能的,或者无法发现JIT破坏了您的代码。
時不時地查看一些代碼,并認為它不可能是錯誤的。 一旦您排除了簡單的程序員搞砸代碼/代碼中的敵對行為(確保您閱讀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破坏了您的代码。的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 手机怎样用电脑升级rom(怎么用电脑给手
- 下一篇: 苹果平板电脑ipad6什么时候出(苹果平