StringBuffer内存溢出 Out Of Memory
程序员文章站
2022-04-27 08:04:55
...
今天用线程做视频转码的时候,爆出了一个错误:java.lang.OutOfMemoryError: Java heap space
我没有懊恼,反而很开心,终于遇到你了,内存溢出(堆内存溢出)!
上图:
报错信息:
代码:
@Override
public void run() {
StringBuffer msgBuffer = new StringBuffer();
try {
if (ffmpegConfig != null && ffmpegConfig.isDebug()) {
logger.info("线程启动:[{}]", id);
while (downloadStatus) {
if (Strings.isNotEmpty(br.readLine())) {
ohm.parse(id, br.readLine());
}
msgBuffer.append(br.readLine());
}
if (!downloadStatus) {
logger.info("线程停止:[{}]", id);
}
} else {
Thread.yield();
}
} catch (IOException e) {
stop();
throw new CameraException("IOException===>" + e.getMessage());
} finally {
stop();
}
}
这段代码写的比较low,但是不妨碍找到内存溢出的问题点,就在我创建的StringBuffer上,
msgBuffer.append(br.readLine());
这个语句只要线程不停,就会一直append,导致StringBuffer一直在变大,耗费内存。
查看了一下源码,是在扩充内存的时候报的错误:
红框里面的意思是最小扩容比整型的最大值还要大,因此报了OOM异常。
注:Integer.MAX_VALUE的最大值是2的31次方 -1
/**
* A constant holding the maximum value an {@code int} can
* have, 2<sup>31</sup>-1.
*/
@Native public static final int MAX_VALUE = 0x7fffffff;
解决办法:(1)可以调整jvm配置,扩大容量:
< jvm-arg>-Xms3062m < / jvm-arg>
后续会写一下如何增大jvm内存的文章,有不对的地方欢迎指正!
上一篇: 《代码整洁之道读书笔记》
下一篇: 利用原型共享数据
推荐阅读
-
【性能】Android中的内存溢出(Out Of Memory,OOM)
-
PHP内存溢出有关问题Fatal error: Out of memory
-
curl out of memory window下PHP调用curl报内存不够
-
curl out of memory window下PHP调用curl报内存不够
-
PHP内存溢出Allowed memory size of 解决方法
-
StringBuffer内存溢出 Out Of Memory
-
PHP内存溢出Allowed memory size of 解决方法
-
curl out of memory window下PHP调用curl报内存不够_PHP教程
-
【性能】Android中的内存溢出(Out Of Memory,OOM)