我尝试使用映射的字节缓冲区读取文件,并在 buffer.position(position); 行获得 OutOfMemoryError:JavaHeapSpace 。我不明白代码中的错误。错误的原因是什么?
private void readFile()
{
int lastPos = buffer.getInt();
int dirLen = buffer.getInt();
byte[] dirBytes = new byte[dirLen];
buffer.get(dirBytes);
this.dir = new String(dirBytes);
int filePatternLen = buffer.getInt();
byte[] filePatternBytes = new byte[filePatternLen];
buffer.get(filePatternBytes);
this.filePattern = new String(filePatternBytes);
int numFileMetaDatas = 0;
while (buffer.position() < lastPos)
{
numFileMetaDatas++;
int position = buffer.position();
//Size is needed as we are reserving some extra bytes
int size = buffer.getInt();
buffer.position(position + ByteUtil.SIZE_OF_INT + ByteUtil.SIZE_OF_BYTE + ByteUtil.SIZE_OF_LONG + ByteUtil.SIZE_OF_LONG + ByteUtil.SIZE_OF_LONG);
int fileNameLen = buffer.getInt();
byte[] fileNameBytes = new byte[fileNameLen];
buffer.get(fileNameBytes);
FileMetaData fileMetaData = new FileMetaData(buffer, size, position);
UniqueID uniqID = fileMetaData.getUniqueID();
uniqIdVsFileMetaData.put(uniqID, fileMetaData);
position = position + size;
buffer.position(position);
}
nextMetaStartPos = lastPos;
}
答案 0 :(得分:0)
在java中解决OutOfMemoryError的简单方法是使用JVM选项&#34; -Xmx512M&#34;来增加最大堆大小,这将立即解决您的OutOfMemoryError。当我在构建项目时在Eclipse,Maven或ANT中获得OutOfMemoryError时,这是我的首选解决方案,因为根据项目的大小,您可以轻松地耗尽内存。这是一个增加JVM最大堆大小的示例,还有更好的保留 - 如果在java应用程序中设置堆大小,则Xmx到-Xms比例为1:1或1:1.5
导出JVM_ARGS =&#34; -Xms1024m -Xmx1024m&#34;
2)在Java中解决OutOfMemoryError的第二种方法相当困难,当你没有大量内存时,甚至在增加最大堆大小之后,你仍然会得到java.lang.OutOfMemoryError,在这种情况下你可能想要分析您的应用程序并查找任何内存泄漏。您可以使用Eclipse Memory Analyzer检查堆转储,也可以使用Netbeans或JProbe等任何分析器。这是一个棘手的解决方案,需要一些时间来分析和发现内存泄漏。
-vm
C:/Program Files (x86)/Java/jdk1.6.0/bin/javaw.exe
-startup
plugins/org.eclipse.equinox.launcher_1.2.0.v20110502.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.1.100.v20110502
-product
com.springsource.sts.ide
--launcher.defaultAction
openFile
--launcher.XXMaxPermSize
384M//incease to 512 mb
-vmargs
-Dosgi.requiredJavaVersion=1.5
-Xmn128m
-Xms256m
-Xmx768m
-Xss1m
-XX:PermSize=128m// increase to 512 mb
-XX:MaxPermSize=384m//increase to 512 mb
答案 1 :(得分:-2)
转到eclipse配置设置文件,即ini文件更改烫发尺寸
以下评论告诉你增加permsize
-vm
C:/Program Files (x86)/Java/jdk1.6.0/bin/javaw.exe
-startup
plugins/org.eclipse.equinox.launcher_1.2.0.v20110502.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.1.100.v20110502
-product
com.springsource.sts.ide
--launcher.defaultAction
openFile
--launcher.XXMaxPermSize
384M//incease to 512 mb
-vmargs
-Dosgi.requiredJavaVersion=1.5
-Xmn128m
-Xms256m
-Xmx768m
-Xss1m
-XX:PermSize=128m// increase to 512 mb
-XX:MaxPermSize=384m//increase to 512 mb