java执行字符串替换时内存溢出是啥原因

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java执行字符串替换时内存溢出是啥原因相关的知识,希望对你有一定的参考价值。

Download.java:244行的代码:text=text.replaceAll("<\\s*?/?\\s*?span\\s*?[^<]*?>","");
出错信息:
Exception in thread "Thread-1" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2882)
at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:100)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:390)
at java.lang.StringBuffer.append(StringBuffer.java:224)
at java.lang.StringBuffer.append(StringBuffer.java:284)
at java.util.regex.Matcher.appendReplacement(Matcher.java:746)
at java.util.regex.Matcher.replaceAll(Matcher.java:813)
at java.lang.String.replaceAll(String.java:2190)
at Test.Download.combineTextUnit(Download.java:244)
at Test.Download.getWebpage(Download.java:122)
at Test.Spider.run(Spider.java:74)
at java.lang.Thread.run(Thread.java:619)

被替换的字符串太长了,或者在启动程序时加大内存的大小追问

run configuration设置了一下-Xmx=500虽然运行等待了一会,但是没溢出,是这样设置对吗

追答

对,你可以根据机器内存的大小来设置这个参数,如果还不够,那只能将被替换的字符串拆分为若干个字串,然后分别替换后再合并。

追问

之前也想到先拆分,但是不知如何拆分,一行一行的拆分有可能把能匹配的部分拆到两个部分影响匹配了不是

追答

是有这个问题,那只能增大内存了,反正现在机器内存应该都不小,启动的时候设置到1024M应该足够用了。

追问

ok知道了 thank you~

参考技术A Java的那个好像有默认的大小,字符串超多多少好像就溢出了,我记着我学过,你可以下载网上的视频看看,毕向东的Java视频v教程追问

恩恩,原来是这样啊,这个字符串确实很长

追答

建议看看老毕的视频

php 执行mysql中查询时内存溢出怎么办

不要一次性从数据库中读出所有数据,例如使用原生PDO时,不要使用$db->query($sql)->fetchAll(); 方法,题主使用的ThinkPHP框架中,不要使用ORM模型的select()方法 参考技术A

内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。

内存泄漏缺陷具有隐蔽性、积累性的特征,比其他内存非法访问错误更难检测。因为内存泄漏的产生原因是内存块未被释放,属于遗漏型缺陷而不是过错型缺陷。此外,内存泄漏通常不会直接产生可观察的错误症状,而是逐渐积累,降低系统整体性能,极端的情况下可能使系统崩溃。

Valgrind 是一个用于构建动态分析工具的工具框架。它提供了一组工具,每个工具都执行某种调试、分析或类似的任务,以帮助您改进程序。Valgrind 的体系结构是模块化的,因此可以轻松地创建新工具,而不会影响现有的结构。

标配了许多有用的工具:

    Memcheck 是内存错误检测器。

    Cachegrind 是一个缓存和分支预测探查器。

    Callgrind 是一个生成调用图的缓存分析器。

    Helgrind 是线程错误检测器。

    DRD 还是线程错误检测器。

    Massif 是堆分析器。

    DHAT 是另一种堆分析器。

    SGcheck 是一种实验性工具,可以检测堆栈和全局阵列的溢出。

    BBV 是一个实验性 SimPoint 基本块矢量生成器。

    关于内存泄漏,我们需要使用 valgrind 的默认工具,也就是 memcheck 工具。

    Memcheck 是内存错误检测器。它可以检测以下和内存相关的问题:

    使用未初始化的内存

    读取/写入已释放的内存

    读取/写入 malloc 块的末端

    内存泄漏

    对 malloc/new/new[]与free/delete/delete[] 的不匹配使用

    双重释放内存

以上是关于java执行字符串替换时内存溢出是啥原因的主要内容,如果未能解决你的问题,请参考以下文章

java内存溢出是啥情况?

java程序内存溢出一般啥原因

java正则表达式中是啥意思

内存溢出和内存泄漏分别是啥意思?

java jdbc 批处理会造成内存溢出吗

java有内存溢出吗?如果有是啥情况?