私は、Jaxb2を使用してXMLにアンマーシャリングするコストを、いくらか長い(48文字)タグ名を持つ大きな(1.7mb)XMLペイロードを使用して測定しました。サンプリングモードでJProfilerを実行すると、文字列インターワーキング作業は時間の無駄な部分であることがわかりました。Jaxb2内の文字列インターンシップを無効にすると、Fastinfosetストリームからのアンマーシャリングが高速化されます。なぜそれを無効にするのは難しいですか?
私はいくつかの調査を行い、Jaxbは文字列を使わないモードで実行できることを発見しました。私の理論では、非マーシャリング中に文字列をインターンリングしないと、インターン処理中にすべてのタグ名文字列をハッシュする必要がないため、より多くのヒープメモリを使用してパフォーマンスを向上させることができます。
私はJAXBのインターンの挙動を抑制するために使用される方法は、(にXMLStreamReaderを実装して)私のFastinfoset「StAXDocumentParser」に「org.codehaus.stax2.internNames」と「org.codehaus.stax2.internNsUris」プロパティを設定することでした。 Jaxbが文字列をインターンに入れないようにするために、なぜこれらをtrueに設定しなければならないのかは、100%明確ではありませんが、それはどのように動作するのかです。
これらのJUnit駆動型テストは、私は、JAXBの文字列のインターン動作を無効にすると、大きなパフォーマンスの違いがあると結論するために使用するものです。
https://github.com/gjd6640/fastinfoset-performance-evaluation
だから私の質問は、マルチパートである:
1)重要なことを誤解していて、Jaxbの文字列インターンシップの動作を最初から無効にしようとしてはいけませんか?
2)Jaxbにインターンの文字列を渡すより良い方法はありますか? "StAXManager"クラスでは、これらのWoodstox指向のプロパティを設定することはできません。このテストでは、以下のようにStAXManagerを拡張して問題をハックしました。これは私が生産で使用したくないハックです。 JaxbがWoodstoxストリームからアンマーシャリングしているときに、Woodstoxがすでにインターンシップを行っているかどうか、そしてJaxbがそのプロセスのそのステップを無効にすることによって反応するかどうかを調べるというのが私の考えです。私はJaxbライブラリのロジックを抱いているので、これについてもっと良い方法が欲しいです。
package com.sun.xml.fastinfoset.stax;
public class JaxbStringInternSuppressionStaxManager extends StAXManager {
public JaxbStringInternSuppressionStaxManager() {
// Add to the allowable list of feature names so that the user may set these "StAXInputFactory" properties
super.features.put("org.codehaus.stax2.internNames", null);
super.features.put("org.codehaus.stax2.internNsUris", null);
}
}
更新:いつものように
、 "よく置く質問はハーフ答えです"。私はちょうど "com.sun.xml.internal.bind.v2.runtime.unmarshaller.StAXStreamConnector"クラスが "com.sun.xml"クラスかどうかを調べるというこの質問を起草している間に気づいた。内部 .fastinfoset.stax.StAXDocumentParser "は、あなたが使用しているXMLStreamReaderから割り当て可能であり、そうであれば文字列インターンを有効にしません。私の場合、私のストリームオブジェクトは "com.sun.xml.fastinfoset.stax.StAXDocumentParser"なので、インターンは無効になりません。問題は "なぜFastinfosetライブラリの内部の味のためにこれを行うのですか?"です。たぶん私は慎重にthis postを読んで答えを見つけるでしょう。
アクティブなデベロッパーユーザーグループなど、このような質問のためのより良いフォーラムがある場合は、その情報を共有してください。適切なユーザーにこの質問が表示されるように、この投稿にリンクする方法について見ていきます。
補足:Oracleの "com.sun.xml.bind:jaxb-impl"ライブラリバージョン "2.1-b02-fcs"のクラスをバンドルするように見えるJDK:64ビットjdk1.8.0_121を使用しています。 –