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

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

目录
相关文章
elementUI el-upload上传组件实战使用
elementUI el-upload上传组件实战使用
|
Linux
Linux基础命令---mput上传ftp文件
mput 使用lftp登录ftp服务器之后,可以使用put指令将文件上传到服务器。mput指令可以使用通配符,而put指令则不可以。 1、语法 mput [-c] [-d] [-a] [-E] [-O base] files 2、选项列表 -d 穿件与文件...
4626 0
|
SQL 监控 数据处理
SQL数据库数据修改操作详解
数据库是现代信息系统的重要组成部分,其中SQL(StructuredQueryLanguage)是管理和处理数据库的重要工具之一。在日常的业务运营过程中,数据的准确性和及时性对企业来说至关重要,这就需要掌握如何在数据库中正确地进行数据修改操作。本文将详细介绍在SQL数据库中如何修改数据,帮助读者更好
2218 4
svn: E175002: Commit failed (details follow): svn: E175002: Unexpected HTTP status 502Bad Gateway on
svn: E175002: Commit failed (details follow): svn: E175002: Unexpected HTTP status 502Bad Gateway on
645 1
|
SQL 存储 关系型数据库
达梦数据库字段类型 varchar 转 text
本文介绍了在达梦数据库中将字段类型从 `varchar` 转换为 `text` 的两种方法:一是通过 DM数据迁移工具导出表结构和数据,修改后重新导入;二是通过添加临时字段、转移数据、删除原字段并重命名临时字段的方式实现转换。针对不同数据量的表,提供了灵活的解决方案。
|
机器学习/深度学习 计算机视觉 网络架构
YOLOv9这么快就来了,赶紧学起来~
YOLOv9这么快就来了,赶紧学起来~
|
SQL Oracle 关系型数据库
Entity Framework Core 实现多数据库支持超厉害!配置连接、迁移与事务,开启多元数据库之旅!
【8月更文挑战第31天】在现代软件开发中,为了满足不同业务需求及环境要求,常需支持多个数据库系统。Entity Framework Core(EF Core)作为一款强大的对象关系映射(ORM)框架,通过数据库提供程序与多种数据库如SQL Server、MySQL、PostgreSQL、Oracle等交互。开发者可通过安装相应NuGet包并配置`DbContextOptionsBuilder`来指定不同数据库连接,从而实现多数据库支持。
1536 0
|
缓存 API Python
Python实战演练之全国地震预警
Python实战演练之全国地震预警
|
存储 弹性计算 固态存储
阿里云服务器ESSD云盘性能级别PL0、PL1、PL2和PL3区别参考
目前阿里云大部分云服务器的系统盘和数据盘默认都是ESSD云盘,而我们在选择ESSD云盘时会有PL0与PL1这两个性能等级可选,部分本地SSD实例规格族还支持选择PL2和PL3,四种性能级别核心差异在于单盘性能上限的不同。
3369 0
阿里云服务器ESSD云盘性能级别PL0、PL1、PL2和PL3区别参考