如何避免不直接由递归引起的StackOverflowError

时间:2015-01-15 14:41:13

标签: java stack-overflow threadpoolexecutor

我有一个Java应用程序,它读取Microsoft Word文档(* .docx)并从其内容中创建新内容。它在很多方面都是一个简单的批量应用程序。它来自从指定目录中获取的文档列表。它会递归此目录的所有子文件夹,并创建一个字符串列表,这些字符串是docx文档的名称。然后一次处理一个列表。它工作正常,在大约35分钟内处理所有288个文档,并为每个文档生成正确的输出。在它的单线程形式中,它已经被我使用了三年没有问题。在这种情况下"纠正"是我定义的,因为它是我的应用程序。我应该说我很少运行整个288 - 只有在我添加新功能时才会运行。

288份文件中有许多是大型的 - 400页或更多。由于我的PC是Core i7,它有4个内核,每个内核都有两个并发线程,我想同时运行其中一些文件来查看它是否更快。我尝试使用ThreadPoolExecutor来处理列表,但我在列表中获得了大约20%的StackOverflowError。显然,StackOverflowError不是由子文件夹递归引起的。

是否只是确保每个文档创建的对象自己超出范围,或者是否有推荐的方式强制"他们释放内存,比如最后设置为null?我试图将这两个部分都做成没有成功,我需要一个星期才能完成。是否有更好的或推荐的策略?

docx文件格式(Microsoft称之为Office Open XML)是一个包含XML文件的zip,我使用XSLT将其转换为我自己的格式。这部分非常简单 - 使用Java ZipFile和JAXP。

应用程序是根据库的原则编写的,即包含Shelf个对象的Book个对象包含Chapter个对象。每本书通常有10到20个章节,每本书大约300-500页,目前有288本书,还有100多本。

所有人告诉应用程序超过10,000行代码,因此无法发布代码。我删除了ExecutorService的几个实验代码行 - 它是一个非常简单的API包装Runnable,我使用的是来自googlable示例。我将尝试重新制作我所做的一个例子并发布它。

0 个答案:

没有答案