gpt4 book ai didi

java - 在创建 PDF 时减少 Java 堆空间消耗

转载 作者:行者123 更新时间:2023-11-30 07:23:02 24 4
gpt4 key购买 nike

我在使用 iText 时遇到了问题。

我正在创建包含大量图像的 PDF,因此 Java 堆空间很容易耗尽。

尝试使用 Eclipse Memory Analyzer 分析 dmp,发现每个图像使用大约 10MB 的堆空间。但他们在 HD 上只有大约 350KB

是否有机会将堆刷新到 HD 并继续创建?

还有其他常见的泄漏吗?

不幸的是,我还没有发现任何有用的东西。

Heap

这就是一张图片堆的样子

一般来说,我认为添加的元素保留在缓存中......我怎样才能把它们弄出来?

类似于this可能吗?

这是我当时使用的代码:

Document document = new Document();
PdfWriter writer = null;
try {
writer = PdfWriter.getInstance(document, new FileOutputStream(this.savePath));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (DocumentException e) {
e.printStackTrace();
}

document.open();

Paragraph pdfTitle = new Paragraph();
pdfTitle.add(new Phrase("Title"));

try {
document.add(pdfTitle);
document.add(Chunk.NEWLINE);

} catch (DocumentException e) {
e.printStackTrace();
}

for(int x = 0; x < 10; x++){
//chapter
Paragraph chapterName = new Paragraph("Chapter "+x, FONT[1]);
ChapterAutoNumber chapter = new ChapterAutoNumber(chapterName);

try {
document.add(chapterhapter);
} catch (DocumentException e) {
e.printStackTrace();
}

for(int y = 0; y < 10; y++){
//sec
Paragraph sectionName = new Paragraph("Section "+y, FONT[2]);

Section section = chapter.addSection(sectionName);

for(int z = 0; z < 10; z++){
//subSec
Section subSection = null;

Image image = null;
try {
image = Image.getInstance(path);
} catch (BadElementException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

image.scalePercent(50);

image.setCompressionLevel(9);
Paragraph subDesc = new Paragraph("Desc "+z, FONT[3]);

subSection = section.addSection(subDesc);

picSection.add(image);

try {
document.add(subSection);
} catch (DocumentException e) {
e.printStackTrace();
}

}

}

}

document.close();

最佳答案

我是 iText 的原始开发人员,我否决了你的问题,因为你的代码全错了。

例如:您创建了一个章节对象,但您从未将它添加到文档中。相反,您要添加一个未在任何地方定义的 picSection 对象。

然而,我的主要批评是,您正在使用实现 LargeElement 接口(interface)的 ChapterAutoNumber 对象,并提示内存使用。这就像在说:我每天吃一 jar 蛋黄酱,我在想:我怎么这么胖?

为什么要使用章节?如果书签是选择这些对象的主要原因,如果你想减少使用的内存,你应该切换到使用 PdfOutline。因为现在,您正在通过将对象添加到 Chapter 对象来构建一大堆对象,而这些对象只能在您将章节添加到文档时释放。在那一刻之前,进行垃圾收集是没有用的,因为垃圾收集器不能丢弃存储在 Chapter 对象中的内容。

如果你沉迷于使用 Chapter 类,看看 setComplete() 方法,定期将章节的小部分添加到文档中,这样对象就可以一点一点地释放。第一种方法(不使用 Chapter 类)比第二种方法好得多。

如果我看到更多这样的问题,我可能会决定从 iText 中删除 Chapter/Section 类。

关于java - 在创建 PDF 时减少 Java 堆空间消耗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12298104/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com