Excel文件在进行解析的时候,在Windows环境中,没用报错,但是在Linux环境中,出现了如下的报错: nested exception is javalang.OutofMemoryError: Java heap space (OOM)
一、内存溢出和栈溢出有什么区别:
OOM (Out of Memory) 和栈溢出 (Stack Overflow) 都是与内存相关的问题,但是发生的原因和影响略有不同。
OOM 是指程序在执行过程中,申请的内存超过了系统可用的物理内存和虚拟内存总和,导致系统无法继续为程序分配所需的内存空间,从而导致程序异常终止或系统崩溃。这通常是由于程序占用的内存超过了系统的限制,或者程序存在内存泄漏的问题。
栈溢出则是在程序执行过程中,函数调用栈中的栈帧数量超过了栈的最大限制或者栈空间不足,导致栈无法容纳更多的函数调用栈帧。栈是一种有限的数据结构,当函数调用过程中层层嵌套调用的栈帧过多时,栈的容量可能会耗尽,导致栈溢出。一般情况下,栈溢出是由于递归调用没有正确结束或者函数调用嵌套层数过多导致的。
总结起来,OOM 是程序请求的内存超出系统可用内存限制,而栈溢出是由于函数调用栈空间耗尽或调用嵌套层数过多。OOM 导致整个程序或系统崩溃,而栈溢出通常只会导致当前函数执行异常或程序终止。解决 OOM 的方法通常是优化程序的内存使用和管理,而解决栈溢出需要检查和修复递归和函数嵌套问题。
二、解决思路和方法
网上关于出现java.lang.OutOfMemoryError的最常见原因主要说法是:
- Java堆空间错误很简单—您试图将占用内容很大的应用程序放入相对小的Java堆空间中。也就是说,应用程序只是需要比正常运行所需的更多的Java堆空间。
- 由编程错误引起的
数据量的峰值:应用程序的设计目的是处理一定数量的用户或一定数量的数据。当用户数量或数据量突然激增并超过预期阈值时,在峰值之前正常运行的操作将停止操作并触发java.lang.OutOfMemoryError: Java堆空间错误。
内存泄漏:特定类型的编程错误会导致应用程序不断消耗更多内存。每次使用应用程序的泄漏功能时,都会将一些对象留在Java堆空间中。随着时间的推移,泄漏的对象将消耗所有可用的Java堆空间,并触发已经熟悉的java.lang.OutOfMemoryError: Java堆空间错误。(内存泄露是指在程序运行过程中,分配的内存没有被正确地释放或回收,导致这些内存无法再被使用,最终导致系统的可用内存逐渐减少。这种情况下,程序会占用越来越多的内存资源,直到耗尽系统的内存资源,进程可能会变得非常缓慢或崩溃。内存泄露通常发生在程序中使用动态内存分配的情况下,例如在程序中使用 new 或 malloc 分配内存空间,但忘记释放或回收这些内存空间。内存泄露可能导致程序出现不可预测的行为,例如程序崩溃、死锁或系统资源耗尽等问题。为了避免内存泄露,开发者应该养成良好的内存管理习惯,确保在使用完内存后进行释放或回收。例如,在使用 new 或 malloc 分配内存后,应该及时使用 delete 或 free 函数释放该内存。同时,使用智能指针等内存管理工具也可以帮助自动管理内存资源的释放。)
其实也不用想太多,按照第一种思路方式来解决。没用内存,那就给内存,在win环境中可以运行,那就说明win中的IDEA运行内存肯定比Linux的内存大,于是我将Linux的内存又扩大一个G后再运行,发现程序正常可以了。