StringBuilder 导致堆内存溢出
StringBuilder 导致堆内存溢出
原始问题描述:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:3332)
at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:124)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:448)
at java.lang.StringBuilder.append(StringBuilder.java:136)
at testpkg.Main.decDfs(Main.java:230)
定位到问题点:
/**
* For positive values of {@code minimumCapacity}, this method
* behaves like {@code ensureCapacity}, however it is never
* synchronized.
* If {@code minimumCapacity} is non positive due to numeric
* overflow, this method throws {@code OutOfMemoryError}.
*/
private void ensureCapacityInternal(int minimumCapacity) {
// overflow-conscious code
if (minimumCapacity - value.length > 0) {
value = Arrays.copyOf(value,
newCapacity(minimumCapacity));
}
}
问题的原因在于无脑 append 的时候,扩充内存使得 StringBuilder 的长度超过了上限触发OOM,查看后发现 StringBuilder 实际能使用的大小和 JVM 。
解决方法:
- 调大JVM参数,因为StringBuilder有时候没有到达上限,由于JVM堆空间太小,也会触发OOM
- 重新计算最大所需空间,增加 StringBuilder 数量,提前分散放置字符串
- 提前序列化部分结果,但是效率很低
StringBuilder 导致堆内存溢出的更多相关文章
- [JVM教程与调优] 了解JVM 堆内存溢出以及非堆内存溢出
在上一章中我们介绍了JVM运行时参数以及jstat指令相关内容:[JVM教程与调优] 什么是JVM运行时参数?.下面我们来介绍一下jmap+MAT内存溢出. 首先我们来介绍一下下JVM的内存结构. J ...
- 自己挖的坑自己填--jxl进行Excel下载堆内存溢出问题
今天在进行使用 jxl 进行 Excel 下载时,由于数据量大(4万多条接近5万条数据的下载),数据结构过于负责,存在大量大对象(虽然在对象每次用完都设置为null,但还是存在内存溢出问题),加上本地 ...
- Java抛出OutOfMemoryError:Java heap space堆内存溢出错误的分析方案
抛出堆内存溢出的错误一定要记得保留现场环境(导出堆内存信息到文件),否则如果无法进行分析,并从根本上解决问题,下次很有可能还会出现. 第一步:导出堆转储文件 我们可以使用Jdk自带的jmap工具.使用 ...
- OutOfMemoryError/OOM/内存溢出异常实例分析--堆内存溢出
Java堆内存溢出 只要不断创建对象,并且保证GC Roots到对象之间有可达路径来避免垃圾回收机制清除这些对象, 那么在对象数量到达最大堆的容量限制后就会产生内存溢出异常,代码如下: import ...
- 关于java堆内存溢出的几种情况(转)
[情况一]: java.lang.OutOfMemoryError: Java heap space:这种是java堆内存不够,一个原因是真不够,另一个原因是程序中有死循环: 如果是java堆内存不够 ...
- while死循环导致的内存溢出
场景:新开发的功能内测,新调用了其它模块的接口,一如既往的点鼠标,计费,但是许久都没有响应页面遮罩一直锁着,最后抛出了以下异常 咋一看这个异常信息,不就是锁表了吗?把锁表进程Kill掉,再来一遍,结果 ...
- 【Android】Eclipse Memory Analyzer 进行堆内存溢出分析
MAT 不是一个万能工具,它并不能处理所有类型的堆存储文件. 不同厂家的 JVM 所生成的堆转储文件在数据存储格式以及数据存储内容上有很多区别,但是比较主流的厂家和格式,例如 Sun, HP, ...
- eclipse:Tomcat设置jvm,解决java.lang.OutOfMemoryError: Java heap space 堆内存溢出
eclipse 有启动参数里设置jvm大小,因为eclipse运行时自己也需要jvm,所以eclipse.ini里设置的jvm大小不是具体某个程序运行时所用jvm的大小,这和具体程序运行的jvm大小无 ...
- JAVAFX之tableview界面实时刷新导致的内存溢出(自己挖的坑,爬着也要出来啊0.0)
这几天遇到了一个问题,不幸开发的一个cs架构的工具,客户端开启后,内存一直在缓慢增长最终导致进程卡死,花了4天时间,终于爬出来了... 客户端通过timer定时器每30秒查询一次数据库以及一些业务逻辑 ...
- JSP页面导致tomcat内存溢出一例
今天发现一个奇怪的问题,一个tomcat应用,里面只有一个单纯的jsp页面,而且这个jsp页面没有任何java代码——想用这个jsp页面配合tomcat完成一个性能验证.但是用jmeter压测了几分钟 ...
随机推荐
- LCP 34. 二叉树染色
class Solution: def maxValue(self, root: TreeNode, k: int) -> int: def dfs(root): # 空节点价值全为0 res ...
- HTTP身份认证
1.HTTP Basic认证 用户每次发送请求的时候,在请求头中携带能通过认证的身份信息:Authorization: <username>:<password> 1.1 交互 ...
- git合并指定分支的commit到主干上
1.先切换分支到master git checkout master 2.目前正处于主干上,执行命令,将分支从最后一个commit合并到主干上 git rebase --onto cb4023015f ...
- iOS 为 textView 添加 placeholder
OC : //自定义一个 placeholder 样式的 label UILabel *placeholder = [UILabel new]; placeholder.text = @"请 ...
- vue中form表单校验,一个form-item中有多个必填项如何操作?
普通的正则校验就不具体写了. 项目中遇到一个el-form-item含有多个input或者select,如何绑定值? // 一个form-item中有多个必填项 <el-form-item la ...
- 蓝桥2021 B组
2. 卡片(结果填空) 小蓝有很多数字卡片,每张卡片上都是数字 0 到 9. 小蓝准备用这些卡片来拼一些数,他想从 1 开始拼出正整数,每拼一个, 就保存起来,卡片就不能用来拼其它数了. 小蓝想知道自 ...
- Spring系列之资源-11
目录 `Resource` 内置`Resource`实现 `UrlResource` `ClassPathResource` `FileSystemResource` `ServletContextR ...
- nrm ls报错及npm镜像站点测速、切换
报错截图: 解决方法: 1.win键,搜索powershell,点击"以管理员身份运行" 2.粘贴下面命令,回车,敲y,回车 set-ExecutionPolicy RemoteS ...
- 内存、cpu、硬盘使用率测试方法
平时测试过程中经常需要测试页面展示的系统资源信息是否正确,比如CPU.内存.硬盘等,一般是需要测试服务器的资源情况,服务器一般部署在linux上,今天总结一下测试方法: 1.CPU测试:(使用shel ...
- c++ProgrammingConcept
本文做为总章简单介绍自己的c++学习过程(学习书籍:c++编程思想) 第三章:c++中的c(part1) 第三章:c++中的c(part2)