2011-12-03 39 views
0

Jsoup是一個非常方便的工具來解析html,並將其用作我們的抓取工程中的基本實用工具。但是最近我發現我們的抓取工具有時候一直在做全GC。因爲太多的ParserError對象,Jsoup保持完整的GC狀態?

通過jmap轉儲對象之後,我驚奇地發現有太多的ParseError對象。通過閱讀源代碼,它不是一個例外,而是一個對象。當一個html有問題時,它可能會導致很多錯誤。所以它應該在控制之下以防止創建對象的瘋狂。

一些詳細信息如下,希望能幫助您找到解決方案。

java.lang.Thread.State: RUNNABLE 
     at org.jsoup.parser.Tokeniser.error(Tokeniser.java:211) 
     at org.jsoup.parser.TokeniserState$47.read(TokeniserState.java:1170) 
     at org.jsoup.parser.Tokeniser.read(Tokeniser.java:42) 
     at org.jsoup.parser.TreeBuilder.runParser(TreeBuilder.java:101) 
     at org.jsoup.parser.TreeBuilder.parse(TreeBuilder.java:53) 
     at org.jsoup.parser.Parser.parse(Parser.java:24) 
     at org.jsoup.Jsoup.parse(Jsoup.java:44) 

num  #instances   #bytes class name 
---------------------------------------------- 
    1:  30110820  1204432800 org.jsoup.parser.ParseError 
    2:   33076  156025088 [Ljava.lang.Object; 
    3:   68836  98796360 [C 
    4:   65808  9778264 <constMethodKlass> 
    5:   65808  8959520 <methodKlass> 
    6:   12044  8524088 [B 
    7:   6424  7447912 <constantPoolKlass> 
    8:  102203  5494560 <symbolKlass> 
    9:   6424  4909064 <instanceKlassKlass> 
    10:   5271  4171032 <constantPoolCacheKlass> 
    11:  105257  3368224 java.lang.String 
+0

我已致信Jsoup的作者,但得到任何答覆至今。 – passover

+0

[你如何禁用Jsoup Tokeniser中的錯誤跟蹤?](http://stackoverflow.com/questions/8030303/how-do-you-disable-error-tracking-in-jsoups-tokeniser) – BalusC

回答

0

@BalusC感謝您的提示!

仔細閱讀源代碼後,我發現trackErrors是開放的,沒有API將它設置爲false,甚至更多,trackErrors是無用的。 我解決了這個問題並重新發布了這個包,但我對此仍然很陌生,這是否是一個錯誤?

code1: 
    private boolean trackErrors = true; 

code2: 
    void error(TokeniserState state) { 
     if (trackErrors) 
      errors.add(new ParseError("Unexpected character in input", reader.current(), state, reader.pos())); 
    }