StringTable暴涨导致的OutOfMemoryError案例分析

简介: StringTable暴涨导致的OutOfMemoryError案例分析

jdk8中的StringTabel是放在堆空间的,我们分析一个案例说明。

public class Jvm1_6 {
    public static void main(String[] args) {
        List<String> list=new ArrayList<>();
        int i=0;
        try {
            for(int j=0;i<20000;j++){
                list.add(String.valueOf(j).intern());
            }
        }catch (Throwable e){
            e.printStackTrace();
        }finally {
            System.out.println(i);
        }
    }
}

默认的堆空间比较大,我们需要限制堆空间的大小,加上启动参数:

-Xmx10m

运行结果如下:

java.lang.OutOfMemoryError: GC overhead limit exceeded
  at java.lang.Integer.toString(Integer.java:401)
  at java.lang.String.valueOf(String.java:3099)
  at Jvm1_6.main(Jvm1_6.java:14)
148707

我们发现暂时还看不出是内存溢出,只看到GC超过某限制导致的问题。

这个问题我们通过官网文档查询参数解释如下:

XX:+UseGCOverheadLimit

Enables the use of a policy that limits the proportion of time spent by the JVM on GC before an OutOfMemoryError exception is thrown. This option is enabled, by default and the parallel GC will throw an OutOfMemoryError if more than 98% of the total time is spent on garbage collection and less than 2% of the heap is recovered. When the heap is small, this feature can be used to prevent applications from running for long periods of time with little or no progress. To disable this option, specify -XX:-UseGCOverheadLimit

这里大致的意思是说JVM花费了超过98%的时间确回收 了少于2%的内存,这种情况基本就是崩溃了,这个特性就会被用来阻止应用运行下去了,当然禁用的方法就是-XX:-UseGCOverheadLimit。

我们加上这个选项再运行:

java.lang.OutOfMemoryError: Java heap space
  at java.lang.Integer.toString(Integer.java:401)
  at java.lang.String.valueOf(String.java:3099)
  at Jvm1_6.main(Jvm1_6.java:14)
150453

看到了我们意料之中的堆内存溢出了。

目录
相关文章
|
2月前
|
Java
堆内存的溢出案例分析
堆内存的溢出案例分析
10 0
|
2月前
|
算法 Java UED
【JVM】分代收集算法:提升Java垃圾回收效率
【JVM】分代收集算法:提升Java垃圾回收效率
53 0
|
10月前
|
存储 Java 应用服务中间件
JVM各种情况内存溢出分析
JVM各种情况内存溢出分析
201 0
|
12月前
|
算法 安全 Java
JVM学习日志(十一) 对象进入老年代的情况 及 空间担保机制
对象进入老年代的情况 及 空间担保机制 简述
372 0
JVM学习日志(十一) 对象进入老年代的情况 及 空间担保机制
|
11月前
|
存储 算法 Java
JVM 收集算法 垃圾收集器 元空间 引用
JVM 收集算法 垃圾收集器 元空间 引用
86 0
|
12月前
|
存储 缓存 监控
37-大厂面试题:什么是内存溢出?在哪些区域会发生内存溢出?请解释下直接内存OOM
什么是内存溢出?在哪些区域会发生内存溢出?请解释下直接内存OOM
110 0
|
IDE Java 开发工具
JVM-03内存区域与内存溢出异常(下)【OutOfMemoryError案例】
JVM-03内存区域与内存溢出异常(下)【OutOfMemoryError案例】
90 0
|
Java fastjson 数据库
线上环境内存溢出-OutofMemoryError
公司线上环境,出现内存溢出异常,发生时,cpu占用360%。系统可用内存不足。
246 1
线上环境内存溢出-OutofMemoryError
|
存储 Java 数据库连接
JVM之常见内存溢出(OutOfMemoryError)异常 ✨ 每日积累
JVM之常见内存溢出(OutOfMemoryError)异常 ✨ 每日积累
JVM之常见内存溢出(OutOfMemoryError)异常 ✨ 每日积累
|
Dubbo Java 应用服务中间件
线上报了内存溢出异常,又不完全是内存溢出
最近一直忙于对付即将上线的系统,期间也碰到了很多问题。最近印象比较深的是一个内存溢出的报错。测试告诉我最近某个功能总是没有效果,于是我就去线上看了一下错误日志,这不看不知道,一看吓一跳,满屏的OutOfMemoryError ,出于隐私保护,这里只展示其中的一点异常信息: