java中的图像渲染抛出内存不足错误(使用pdfbox)
我试图渲染一幅图像,但这一行出现内存不足错误java中的图像渲染抛出内存不足错误(使用pdfbox),java,image,tesseract,pdfbox,heap-memory,Java,Image,Tesseract,Pdfbox,Heap Memory,我试图渲染一幅图像,但这一行出现内存不足错误 try{ BufferedImage image = pdfRenderer.renderImageWithDPI(page-1, 300,ImageType.GRAY); ImageIOUtil.writeImage(image,"G:/Trial/tempImg.png", 300); int bpp = image.getColorModel().getPixelSize(); int bytespp
try{
BufferedImage image = pdfRenderer.renderImageWithDPI(page-1, 300,ImageType.GRAY);
ImageIOUtil.writeImage(image,"G:/Trial/tempImg.png", 300);
int bpp = image.getColorModel().getPixelSize();
int bytespp = bpp / 8;
int bytespl = (int) Math.ceil(image.getWidth() * bpp / 8.0);
int height = image.getHeight();
int width = image.getWidth();
TessAPI1.TessBaseAPISetImage(handle, ImageIOHelper.convertImageData(image), width, height, bytespp, bytespl);
TessAPI1.TessBaseAPISetPageSegMode(handle, TessPageSegMode.PSM_AUTO);
//codes
}
finally
{
//some code so that this function could be called again with next pdf
//some code to release resources
}
在这个代码段中,我首先将一个特定页面从pdf文档呈现到BuffereImage,然后将BuffereImage转换为字节,然后再将其提供给tesseract。正是在这一点上,我得到了一个内存不足的错误
通常,当您遇到内存不足错误时,您会在它旁边看到一条消息,要么是堆外消息,要么是perm外消息。但是,这里我得到的只是一个内存不足的错误。请解释一下
当我调试这段代码时,我注意到代码并没有在我将图像转换为字节的那一行终止,而是转到finally block(我对这段代码使用try和finally block)。
所以我在finally中加了continue,瞧,我的代码在下一组PDF中运行得非常好
所以我的问题是,我的程序如何在内存不足错误后不退出(不是我不希望它工作),但是如果内存真的满了,那么代码如何加载下一组PDF。
对这一点的洞察将是非常美妙的。
谢谢
另一方面,由于黑客攻击,这个问题得到了解决,我的代码正在运行,但我很好奇为什么会发生这种情况。请发布堆栈跟踪我会尽快发布堆栈跟踪,目前我的电脑没有空闲,我无法运行2个使用tesseract的程序实例。巧合的是,我在一个对250000个PDF文件运行PDFBox预飞行的应用程序中也观察到了同样的情况。它调用
e.printStackTrace(PrintWriter)
到catch(Throwable e)
段中的文件,有时只会出现第一行。我当时的想法是,内存管理非常混乱,没有资源打印堆栈跟踪。@TilmanHausherr,我认为你是对的。基本上,这段代码是我在许多pdf文件上运行OCR的项目的一部分。由于一些图像很大,我得到了上面的错误,使用finally绕过了这个错误,但是在运行代码7-8小时后,我发现我的代码绕过了evry pdf(经过一定的限制)。我只能断定这是由于记忆问题。jvm没有足够的资源来呈现更多的图像。我想我的程序有内存泄漏。你能确认pdfbox图像类不会导致此泄漏吗,因为我找不到我的代码泄漏。谁知道。。。除非有特定场景,否则我找不到内存泄漏。即使如此,也不可能总是复制它:请发布堆栈跟踪我会尽快发布堆栈跟踪,目前我的电脑没有空闲,我无法运行2个使用tesseract的程序实例。巧合的是,我在一个对250000个PDF文件运行PDFBox preflight的应用程序中观察到了同样的情况。它调用e.printStackTrace(PrintWriter)
到catch(Throwable e)
段中的文件,有时只会出现第一行。我当时的想法是,内存管理非常混乱,没有资源打印堆栈跟踪。@TilmanHausherr,我认为你是对的。基本上,这段代码是我在许多pdf文件上运行OCR的项目的一部分。由于一些图像很大,我得到了上面的错误,使用finally绕过了这个错误,但是在运行代码7-8小时后,我发现我的代码绕过了evry pdf(经过一定的限制)。我只能断定这是由于记忆问题。jvm没有足够的资源来呈现更多的图像。我想我的程序有内存泄漏。你能确认pdfbox图像类不会导致此泄漏吗,因为我找不到我的代码泄漏。谁知道。。。除非有特定场景,否则我找不到内存泄漏。即使如此,也不可能总是复制它: