Jsoup хранит полный GC из-за слишком большого количества объектов ParserError? - PullRequest
0 голосов
/ 03 декабря 2011

Jsoup - очень удобный инструмент для анализа html, который используется в качестве базового утилиты в нашем проекте на гусеничном шасси.Но недавно я обнаружил, что наш сканер всегда делал полный сборщик мусора.

После сброса объекта с помощью 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

1 Ответ

0 голосов
/ 04 декабря 2011

@ BalusC спасибо за Вашу подсказку!

После тщательного прочтения исходного кода я обнаружил, что trackErrors открыт, и нет API, который бы устанавливал его как ложное, даже более того, 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()));
    }
...