最近线上的一个app 经常oom,为了定位这个问题首先先搞到oom 的dump 文件
启动参数加上 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=dump.hprof
然后使用mat 分析dump 文件
然后在leak suspects 中就看到了oom 的栈
image.png
从栈中可以看出是StringBuilder.toString方法引起的OOM。经排查代码,发现这个业务是由java 执行linux 命令,然后记录stdout和stderr,由于stdout 太大了,导致OOM。
因此引出一个java 常识-java 中string 长度有限制吗
答案是:有
编译阶段是65535
运行时是Integer.MAX_VALUE
原因是由于string 底层数据结构是数组,数组最大长度有限制
网友评论