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

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

目录
相关文章
|
3月前
|
Java C++
Java内存区域于内存溢出异常
这篇文章详细解释了Java虚拟机的内存区域划分、各区域的作用以及可能遇到的内存溢出异常情况。
48 0
|
5月前
|
监控 Java Linux
JVM内存问题之如果堆内存一直缓慢上涨,如何解决
JVM内存问题之如果堆内存一直缓慢上涨,如何解决
632 1
|
7月前
|
Java
堆内存的溢出案例分析
堆内存的溢出案例分析
29 0
|
7月前
|
缓存 Java 双11
jvm性能调优 - 16案例实战_每日上亿请求量的电商系统 年轻代垃圾回收参数如何优化
jvm性能调优 - 16案例实战_每日上亿请求量的电商系统 年轻代垃圾回收参数如何优化
81 0
|
存储 Java 应用服务中间件
JVM各种情况内存溢出分析
JVM各种情况内存溢出分析
233 0
|
Java
40-对象太多了!堆内存实在是放不下,只能内存溢出!
之前通过三篇文章的分析,介绍了 直接内存、Metaspace和栈内存三块区域的内存溢出,同时给出了一些常见的引发内存溢出的场景以及对应解决方案,一般只要vm参数配置合理,代码上不出现大问题,一般不太容易引发对应的OOM
194 0
40-对象太多了!堆内存实在是放不下,只能内存溢出!
|
存储 缓存 监控
37-大厂面试题:什么是内存溢出?在哪些区域会发生内存溢出?请解释下直接内存OOM
什么是内存溢出?在哪些区域会发生内存溢出?请解释下直接内存OOM
147 0
|
IDE Java 开发工具
JVM-03内存区域与内存溢出异常(下)【OutOfMemoryError案例】
JVM-03内存区域与内存溢出异常(下)【OutOfMemoryError案例】
115 0
|
Java fastjson 数据库
线上环境内存溢出-OutofMemoryError
公司线上环境,出现内存溢出异常,发生时,cpu占用360%。系统可用内存不足。
277 1
线上环境内存溢出-OutofMemoryError
|
存储 Java 数据库连接
JVM之常见内存溢出(OutOfMemoryError)异常 ✨ 每日积累
JVM之常见内存溢出(OutOfMemoryError)异常 ✨ 每日积累
JVM之常见内存溢出(OutOfMemoryError)异常 ✨ 每日积累