我正在Java 5上编写一个客户端Swing应用程序(图形字体设计器).最近,我遇到了错误,因为我对内存使用情况并不保守.用户可以打开无限数量的文件,程序将打开的对象保存在内存中.经过快速研究后,我在5.0 Java虚拟机中找到了人体工程学,其他人在Windows机器上说JVM默认最大堆大小为.java.lang.OutOfMemoryError: Java heap space64MB
鉴于这种情况,我该如何处理这种约束?
我可以使用java的命令行选项增加最大堆大小,但这需要找出可用的RAM并编写一些启动程序或脚本.此外,增加到一些有限的最大值并不能最终摆脱这个问题.
我可以重写我的一些代码来经常将对象持久化到文件系统(使用数据库是一回事)来释放内存.它可以工作,但它可能也很重要.
如果您可以向我指出上述想法的细节或某些替代方案,如自动虚拟内存,动态扩展堆大小,这将是很好的.
我在执行多线程程序时遇到以下错误
java.lang.OutOfMemoryError: Java heap space
Run Code Online (Sandbox Code Playgroud)
上述错误发生在其中一个线程中.
据我所知,堆空间仅由实例变量占用.如果这是正确的,那么为什么在运行正常一段时间之后发生此错误,因为在创建对象时分配了实例变量的空间.
有没有办法增加堆空间?
我应该对我的程序进行哪些更改,以便它可以减少堆空间?
我是Java的新手,正在阅读非常大的文件,需要一些帮助来理解问题并解决它.我们有一些遗留代码必须进行优化才能使其正常运行.文件大小只能从10mb到10gb不等.只有文件启动超过800mb大小时才会启动麻烦.
InputStream inFileReader = channelSFtp.get(path); // file reading from ssh.
byte[] localbuffer = new byte[2048];
ByteArrayOutputStream bArrStream = new ByteArrayOutputStream();
int i = 0;
while (-1 != (i = inFileReader.read(buffer))) {
bArrStream.write(localbuffer, 0, i);
}
byte[] data = bArrStream.toByteArray();
inFileReader.close();
bos.close();
Run Code Online (Sandbox Code Playgroud)
我们收到了错误
java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2271)
at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:113)
at java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93)
at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:140)
Run Code Online (Sandbox Code Playgroud)
任何帮助,将不胜感激?
我写了一个波形渲染器,它接受一个音频文件并创建如下内容:

逻辑非常简单.我计算每个像素所需的音频样本数,读取这些样本,平均它们并根据结果值绘制一列像素.
通常情况下,我会在大约600-800像素上渲染一首完整的歌曲,因此波浪非常紧凑.不幸的是,这通常会导致视觉效果不佳,因为几乎整首歌都是以几乎相同的高度呈现的.没有变化.
有趣的是,如果你看一下SoundCloud上的波形,几乎没有一个像我的结果一样无聊.他们都有一些变化.这可能是什么诀窍?我不认为他们只是添加随机噪音.
我的项目中有一个上传文件场景.当我尝试上传大文件时,它会给我一个OutOfMemory错误.该错误与Java堆大小有关.
如何在Java中增加堆大小以及我需要为此更改哪个文件?我正在使用jboss 5.1服务器来运行我的应用程序.
这是我的计划的背景.
一个函数有50%的机会什么都不做,50%自称两次.该计划完成的概率是多少?
我写了这段代码,显然效果很好.对每个人来说可能并不明显的答案是,该计划有100%的机会完成.但是当我运行这个程序时,会出现一个StackOverflowError(有多方便;)),在Math.Random()中出现.有人能指出我从哪里来,并告诉我,如果我的代码可能是错的?
static int bestDepth =0;
static int numberOfPrograms =0;
@Test
public void testProba(){
for(int i = 0; i <1000; i++){
long time = System.currentTimeMillis();
bestDepth = 0;
numberOfPrograms = 0;
loop(0);
LOGGER.info("Best depth:"+ bestDepth +" in "+(System.currentTimeMillis()-time)+"ms");
}
}
public boolean loop(int depth){
numberOfPrograms++;
if(depth> bestDepth){
bestDepth = depth;
}
if(proba()){
return true;
}
else{
return loop(depth + 1) && loop(depth + 1);
}
}
public boolean proba(){
return Math.random()>0.5;
}
Run Code Online (Sandbox Code Playgroud)
.
java.lang.StackOverflowError
at java.util.Random.nextDouble(Random.java:394)
at java.lang.Math.random(Math.java:695)
Run Code Online (Sandbox Code Playgroud)
.我怀疑堆栈及其中的功能数量是有限的,但我真的没有看到这里的问题. …
是否有一个已经实现的数据结构,我可以使用它来分配给一个对象(在我的情况下是一个Edge),一个整数?我正在从一个文件,10密耳顶点,60密耳边缘读取图形,并使用地图(cost.put(e,cost))为每个边缘分配成本.
我以这种方式创建成本图:
costs = new HashMap<Edge,Integer>();
Run Code Online (Sandbox Code Playgroud)
它给出的例外是:
java.lang.OutOfMemoryError: Java heap space
at java.util.HashMap.resize(Unknown Source)
at java.util.HashMap.addEntry(Unknown Source)
at java.util.HashMap.put(Unknown Source)
Run Code Online (Sandbox Code Playgroud) 我得到一个java.lang.OutOfMemoryError:当我尝试运行下面的程序时,GC开销限制超出异常.该程序的主方法访问'指定目录并迭代包含.xlsx的所有文件.这工作正常,因为我在任何其他逻辑之前测试它.它调用xlsx的方法基本上将xlsx文件转换为csv并将其附加到现有文件也可以正常工作.但是当我把它放在for循环中时,这就是我得到这个异常的时候.我猜它有一个冲突,当它打开xlsx并转换它csv和它的时间打开第二个也许我必须以某种方式关闭这一行:
File inputFile = new File("C:\\Users\\edennis.AD\\Desktop\\test\\"+nameOfFile);
Run Code Online (Sandbox Code Playgroud)
这是我现在唯一的猜测,当这个文件在循环的第二次迭代到来时干扰时.我正在使用Apache POI库来操作excel文件.提前致谢!
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class ExcelMan {
public static void main(String[] args) throws FileNotFoundException {
int i =0;
File dir = new File("C:\\Users\\edennis.AD\\Desktop\\test\\");
for (File child : dir.listFiles()) {
//initializing whether the sheet sent to method is first or not, and //counting iterations for each time the for loop as run
boolean firstSheet = true;
i++;
String nameOfFile = …Run Code Online (Sandbox Code Playgroud) 我正在尝试读取一个大的 XLSX 文件。Excel 文件大约有 500K 行。我需要阅读第 2 列。
OPCPackage pkg;
pkg = OPCPackage.open("File path");
XSSFWorkbook myWorkBook = new XSSFWorkbook(pkg);
Sheet sheet = myWorkBook.getSheetAt(2);
Iterator<Row> rowIterator = sheet.iterator();
while (rowIterator.hasNext())
{
Row row = rowIterator.next();
if (row_num > ROW_ESCAPE)
{
Cell cell = row.getCell(2);
if (!cell.getStringCellValue().toString().trim().isEmpty())
{
System.out.println(cell.getStringCellValue().toString());
}
System.out.println("hi"+row_num);
}
row_num++;
}
Run Code Online (Sandbox Code Playgroud)
它打印到第 39723 行之后抛出以下异常
Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space
at java.util.regex.Matcher.<init>(Matcher.java:225)
at java.util.regex.Pattern.matcher(Pattern.java:1093)
at org.apache.poi.xssf.usermodel.XSSFRichTextString.utfDecode(XSSFRichTextString.java:482)
at org.apache.poi.xssf.usermodel.XSSFRichTextString.getString(XSSFRichTextString.java:297)
at org.apache.poi.xssf.usermodel.XSSFCell.getStringCellValue(XSSFCell.java:262)
at Main.get_titles(Main.java:484)
at Main.analyze_Importsheet(Main.java:461)
at Main.but_sel_imp_sheetActionPerformed(Main.java:220)
at …Run Code Online (Sandbox Code Playgroud)