다소 긴 (48 자) 태그 이름을 가진 큰 (1.7mb) XML 페이로드를 사용하여 Jaxb2를 사용하는 객체에 XML을 언 마샬링하는 데 드는 시간 비용을 측정했습니다. 샘플링 모드에서 실행중인 JProfiler를 통해 스트링 인터네킹 작업은 소비 된 시간의 견고한 부분이었다.Jaxb2에서 문자열 interning을 비활성화하면 Fastinfoset 스트림에서 언 마샬링 속도가 향상됩니다. 비활성화하는 것이 왜 그렇게 어려운가요?
나는 약간의 조사를했고 Jaxb는 인턴 문자열이 아닌 모드에서 실행될 수 있음을 발견했다. 내 이론에 따르면 언 마샬링 중에 문자열을 인터링팅하지 않는 것이 인터 럽션 프로세스 중에 모든 태그 이름 문자열을 해시 할 필요가 없기 때문에 더 많은 힙 메모리를 사용하는 대신 성능을 향상시킬 수 있다는 이론이 있습니다.
Jaxb의 interning 동작을 억제하는 데 사용 된 방법은 Fastinfoset "StAXDocumentParser"(XMLStreamReader를 구현)에서 "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을 사용하고 있습니다. –