我有一个循环,产生一个很大的线程。这些线程包括,除其他事项外,2(块状)StringBuilder的对象。这些线程然后运行,并做好自己的事情。

不过,我注意到,有一定量的线程后,我得到了奇怪的崩溃。我知道这是因为这些StringBuilder的,因为当我减少他们的初始容量,我就可以开始有更多的线程。现在对这些StringBuilders,它们被创建这样在线程对象的构造:

StringBuilder的一个新的= StringBuilder的(30000);结果 StringBuilder的B =新的StringBuilder(30000);

,其中它通常崩溃点是约550个线程,这导致在一点点比62MB以上。与程序的其他部分相结合使用的内存是最有可能的64MB,这是我在网上读的地方是JVM内存分配池的大小defaulf。我不知道这是否是真还是假。

现在,是不是我做错了,不知怎的,由于设计的,我分配内存以错误的方式?或者这是唯一的办法,我应该告诉JVM增加其内存池?还是其他?

另外,请不要告诉我要设置一个较低的能力,我知道在需要的时候,这些StringBuilders自动增加自己的能力,但我想有一个解决这个问题。

有帮助吗?

解决方案

其他提示

如果您要存储大量的信息在一个StringBuilder,你打算在某个时候回到参考呢?如果没有,那么只是把它写到另一个介质(DB,文件等)。该方案具有的资源都是有限的,它不能容纳所有的整个系统的状态的一次。 -Xmx会给你更多的存储空间,内存,但它不会让你的存储能力是无限的。

考虑使用ThreadPoolExecutor,并且池的大小设置为在机器上的CPU的数量。比CPU创建多个线程被仅仅增加开销。

ExecutorService service = Executors.newFixedThreadPool(cpuCount))

另外,你可以写你的字符串的文件,而不是与StringBuilders他们留在记忆减少内存使用。

假设每个线程1MB。这是创建的每一个,在通过它的进程分配的内存以上的RAM成本。

正如格雷戈里说,给JVM中,一些选择像-Xmx。

还要考虑使用一个线程池或执行人,以确保只有线的给定量的同时运行。这样的存储器的量可以在不减速保持有限(作为处理器不能够在同一时间运行的线程550的反正)。

当你使用一个Executor不创建在构造函数中StringBuilders,但在运行方法。

可以使用 FileWriter的输出文本文件,然后将其回用的FileReader。这样,你只需要到文件名存储在内存中,而不是字符串的全部内容。

要削减的线程,你可以使用一个ExecutorService,或简单地使用读出队列的线程数。

我的猜测是,与稍微修改一下你也许可以让你的程序到不需要太多的记忆力。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top