当前位置:首页 > 内存 > 正文

java内存溢出怎么解决

  • 内存
  • 2024-06-08 03:48:27
  • 3236

一、解决java读取大文件内存溢出问题,如何在不

1.传统的内存读取

读取文件行的​​默认方式是在内存中读取Guava和ApacheCommonsIO都提供了快速读取文件行的​​方法,如下:

这种方法的问题在于,文件中的所有行都存储在内存中,当文件足够大时,很快就会导致程序抛出OutOfMemoryError异常。
例如:读取大约大小的文件。1G:

该方法一开始只占用很少的内存:(消耗0Mb左右内存)

但是当所有文件都读入内存后,我们终于可以看到(大约消耗了2GB内存):

这意味着这个过程大约使用了2.1GB内存——原因很简单:现在文件中的所有行都存储在内存中。
将文件的全部内容放入内存中会很快耗尽可用内存——无论实际可用内存有多少,这是显而易见的。
此外,我们通常不需要一次将文件的所有行提交到内存中-相反,我们只需要迭代文件的每一行,进行适当的处​​理,并在处理后丢弃它。因此,这正是我们要做的-迭代而不是将所有行保留在内存中。
2.文件流
现在让我们看看这个解决方案-我们使用r类扫描文件内容并连续逐行读取:

此方案将迭代文件中的所有行-以便可以在不引用它的情况下处理每一行。简而言之,它们不存储在内存中:(大约消耗150MB内存)

3ApacheCommonsIO流
也可以使用CommonsIO-库来实现,它提供了CustomLineIterator:

由于整个文件不存储在内存中,这导致非常保守的内存消耗:(大约消耗150MB内存)

4结论
这篇短文介绍了如何在不重复读取和耗尽内存的情况下处理大文件——这提供了处理大文件的解决方案。


二、javabase64内存溢出提问者是想问“javabase64内存耗尽怎么办”吗?
1.首先检查系统是否包含使用大量内存或无限循环的代码。
2。其次,通过添加JVM配置来限制内存使用。
3。最后,可以通过减少javabase64内存参数来减少内存容量。