在这段Java代码中如何处理堆外内存?
我正在使用JMatIO将Matlab.mat文件读入Java程序。但当我的代码执行时,它报告内存不足错误:在这段Java代码中如何处理堆外内存?,java,out-of-memory,Java,Out Of Memory,我正在使用JMatIO将Matlab.mat文件读入Java程序。但当我的代码执行时,它报告内存不足错误: java.lang.OutOfMemoryError: Java heap space 我的程序正在读取一个大约27M大小的mat文件。我已经尝试过使用几个-Xmx和-Xms虚拟机选项来增加堆大小,但没有效果。我的代码如下: public class ReadMat { private MatFileReader reader; public ReadMat(File
java.lang.OutOfMemoryError: Java heap space
我的程序正在读取一个大约27M大小的mat文件。我已经尝试过使用几个-Xmx
和-Xms
虚拟机选项来增加堆大小,但没有效果。我的代码如下:
public class ReadMat {
private MatFileReader reader;
public ReadMat(File f) {
try {
reader = new MatFileReader(f);
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
File matFile = new File("test.mat");
ReadMat rmat = new ReadMat(matFile);
}
}
test.mat
只是一个大约27M的MatlabMat文件。一旦我运行它,它将报告OutOfMemoryError
。那么如何解决这个问题呢?如果更改JVM堆的最小和最大大小并不能解决问题,那么您需要评估MatFileReader如何将test.mat读取到内存中。我敢打赌,读取文件期间MatFileReader的对象分配是导致OutOfMemoryError的原因。如果更改JVM堆的最小和最大大小并不能解决问题,那么您需要评估MatFileReader如何将test.mat读取到内存中。我敢打赌,读取文件期间MatFileReader的对象分配是导致OutOfMemoryError的原因。有两个问题。一个是在任何这样的转换例程中,在转换或加载源数组时,通常必须将其保存在内存中。因此,整个27M文件首先在内存中,这可能会更大,因为保留缓冲区可能会更大
其次,JMatIO可能正在将基本类型转换为对象。例如,如果原始文件中有短文件,每个文件最多使用2个字节,并且您将每个文件转换为一个对象,例如,占用16个字节,那么您的内存使用量将显著增加。有两个问题。一个是在任何这样的转换例程中,在转换或加载源数组时,通常必须将其保存在内存中。因此,整个27M文件首先在内存中,这可能会更大,因为保留缓冲区可能会更大
其次,JMatIO可能正在将基本类型转换为对象。例如,如果原始文件中有短文件,每个文件最多使用2个字节,并且您将每个文件转换为一个对象,例如,占用16个字节,那么您的内存使用量将显著增加。您使用了哪些
-Xmx
值?将文件处理成可由应用程序直接使用的结构的应用程序的内存使用量可能比原始文件的大小大一个数量级。-Xmx512m不起作用?奇怪,实际执行加载的代码在哪里?这段代码几乎不占用任何空间。获取更多RAM如何?@MichałKosmulski:我使用了-Xmx1024M,但仍然出现内存不足错误。您使用了-Xmx
的哪些值?将文件处理成可由应用程序直接使用的结构的应用程序的内存使用量可能比原始文件的大小大一个数量级。-Xmx512m不起作用?奇怪,实际执行加载的代码在哪里?这段代码几乎不占用任何空间。增加内存怎么样?@MichałKosmulski:我使用了-Xmx1024M,但仍然出现内存不足错误。