대부분의 iText7 예제는 PdfFontFactory.createFont()
을 사용하여 텍스트 작업을 위해 PdfFont 인스턴스에 핸들을 가져옵니다. 중재와 함께, 이것은 괜찮아요 ...하지만 PdfFont는 PdfDocument가 닫힐 때까지 사라지지 않는 것 같은 꽤 무거운 짐 객체 (PdfEncoding)입니다. 이 PdfFont 인스턴스는 하나 이상의 PdfDocument에 걸쳐 사용할 수 없습니다 나타나기 때문에PdfFont의 메모리 소비를 제한하기위한 iText7 전략
for (int i = 0; i < someLargeNumber; i++) {
list.add(
new ListItem("never gonna give")
.setFont(PdfFontFactory.createFont("Helvetica-Oblique"))
)
}
정적을 사용하여 솔루션에서 사소한 시도가 실패 : 그래서 다음과 같은 무고한 블록은 거 메모리를 중얼된다. 그리고 내 실제 경우 위의 예제보다 더 복잡하기 때문에, 꽤 깊은 스택을 통해 PdfFont 참조를 잔뜩 통과하고 싶지 않아요. iText7 API의
- 는 PdfDocument 기존 PdfFont 년대를 반복하는 방법 (이?)
- 이)가 당신이 원하는만큼 여러 번 사용할 수 있습니다 단순히 PdfFont 사용에 대한 규칙이다 없다 b) 즉, 단일 PdfDocument 인스턴스
(내 단순히 PdfDocument + PdfFontProgram 키로? 캐시 PdfFont 인스턴스)
위에서 제안한 cacheKey는 좋지 않습니다. FontProgram 인스턴스가 정적 Map에 캐시 된 것처럼 보입니다. 즉, weakRef 캐시 키가 항상 사용 중이며 결과적으로 PdfDocument도 메모리에 유지됩니다. 더 나은 접근 방법은지도의지도 인 것 같습니다. - WeakHashMap> –