你的程序没有char[]
所以如果你得到一个OutOfMemoryError,创建一个char []可以向我们展示执行此操作的代码行吗?
我打算发表评论,但时间太长了。
- 整个应用程序将一直存在,直到最后一个非守护程序线程退出。
- 您不需要设置优先级,它们通常不会按您的想法执行。
- 没有必要打断即将返回/完成的线程。
- 当您准确读取13个字节时刷新,但您从未发送确切的13个字节。
- 您的0长度数据不会发生阻塞连接,但如果确实如此,那么您的处理方式就不正确了,如果没有它,您最好不要这样做。
- copyStream复制数据直到流结束,但是你在循环中有这个,这意味着10秒后你将截断文件并替换它没有数据(因为流仍然关闭,你不附加日志文件)
- 您的“读者”会写入数据,但它不会读取任何内容。
- 你的“作家”线程都是读写。
- 你直接使用Thread,这被认为是不好的做法。您应该使用Runnable并使用Thread包装它或使用ExecutorService
- 你抓住了一些例外,但不打印出来。勇敢地假设你不需要知道它们什么时候被抛出,因为你的线程可能会无声地死去而你不会知道原因。
- 我假设CopyStreamException是一个异常,在这种情况下,您已经遇到了创建一个很好的异常以包装IOException的麻烦,以后您将丢弃它。
- 在启动阅读器和作者之间你不需要睡觉。
- 因为你当前的线程正在等待另外两个线程,你可以使用当前线程来编写“reader”并且只有一个后台日志记录线程。
- 该方法不会抛出FileNotFoundException。
- 您计算了复制的总数据,但从未使用过。
- 要复制流,建议您使用IOUtils.copy(InputStream,OutputStream)
你是否泄漏来自copyStream方法?你是怎么确定的?为了回应@Peter Lawrey初始语句,代码中引用char []的唯一位置是创建的实际字符串。由于你的程序运行了很长时间,所以总是创建要处理的字符串,并假设它们是唯一的字符串(即,不是由JVM的字符串池重用,而是为每个字符串创建一个新的字符串),这可以解释你的内存使用情况。你可能只是有很多字符串......