OutOfMemoryError可能来自Java自身对内存使用的限制.尝试使用一些参数
here来增加最大内存.
为了提高速度,Adam Bliss首先提出了一个很好的建议.如果这是一遍又一遍的同一个文件,那么我想有多个线程试图同时读取它可能会导致对文件锁定的大量争用.更多线程甚至意味着更多的争用,甚至可能导致更糟糕的整体性能.因此,请尽量避免这种情况,只需加载文件一次即可.即使它是一个大文件,你也有24 GB的RAM.您可以保存相当大的文件,但可能需要增加JVM允许的内存以允许加载整个文件.
如果正在使用多个文件,请考虑以下事实:您的磁盘一次只能读取一个文件.因此,如果线程没有花费太多时间处理,那么让多个线程同时尝试使用磁盘可能不会太有效.由于CPU占用率很低,因此线程可能会加载文件的一部分,然后在缓冲的部分上运行得非常快,然后花费大量时间等待文件的其余部分加载.如果你一遍又一遍地加载文件,那甚至可能仍然适用.
简而言之:磁盘IO可能是你的罪魁祸首.您需要努力减少它,以便线程不会如此争用文件内容.
编辑:
经过进一步考虑后,更有可能出现同步问题.尝试添加到结果列表时,线程可能会被阻止.如果访问频繁,这将导致对象上的锁的大量争用.考虑做一些事情,比如让每个线程将结果保存在本地列表中(如ArrayList,这不是线程安全的),然后将所有值复制到最终的共享列表中以尝试减少争用.