Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中的图像渲染抛出内存不足错误(使用pdfbox)_Java_Image_Tesseract_Pdfbox_Heap Memory - Fatal编程技术网

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图像类不会导致此泄漏吗,因为我找不到我的代码泄漏。谁知道。。。除非有特定场景,否则我找不到内存泄漏。即使如此,也不可能总是复制它: