IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> 一次OOM异常解决 -> 正文阅读

[开发测试]一次OOM异常解决

问题:操作1000条数据库查出的数据导致的OOM

JDK版本:1.8
问题代码:

	//list里有一千条数据
    List<Map> listMap = dao.select("xxx");
    String otherText = null;
    if (listMap != null && listMap.size() > 0) {
        //遍历结果,获取map中的value将其转化成json并拼接
        for (Map map : listMap) {
            if (map != null) {
                if (otherText == null) {
                    otherText = JsonObjectUtils.converObjectTojson(map.containsKey("xxxx") ? (String) map.get("xxxx") : null);
                } else if (otherText != null && StringUtils.isNotBlank(String.valueOf(map.get("xxxx")))) {
                    //OOM  ---  执行后堆内存占用骤增
                    otherText = JsonObjectUtils.converObjectTojson(otherText) + "," + JsonObjectUtils.converObjectTojson(map.get("xxxx"));
                }
            }
        }
    }

异常提示:
请添加图片描述
OOM后提示的是 Java heap space --由此基本可以判断出现OOM的区域是jvm堆,堆内存储的是Java实例,那么可以初步猜测导致出现OOM的几种情况
1、实例创建时jvm堆无法申请足够的内存
2、无法GC的实例过多导致内存溢出

使用内存插件VisualVM Launcher查看执行过程中JVM内存区域的情况:
在这里插入图片描述

请添加图片描述
可以看到堆内存在短时间内骤增近4G,堆的使用量也瞬间超过2G
在这里插入图片描述
而笔者本地的内存不足以支持堆的内存扩展 因此抛出了OOM异常;

查看问题代码:
JsonObjectUtils.converObjectTojson()
是对ObjectMapper.writeValueAsString(Object value)封装的一个工具类
writeValueAsString:

public String writeValueAsString(Object value)
        throws JsonProcessingException
    {        
        // alas, we have to pull the recycler directly here...
        SegmentedStringWriter sw = new SegmentedStringWriter(_jsonFactory._getBufferRecycler());
        try {
            _configAndWriteValue(_jsonFactory.createGenerator(sw), value);
        } catch (JsonProcessingException e) { // to support [JACKSON-758]
            throw e;
        } catch (IOException e) { // shouldn't really happen, but is declared as possibility so:
            throw JsonMappingException.fromUnexpectedIOE(e);
        }
        return sw.getAndClear();
    }

每调用一次writeValueAsString都会创建一个SegmentedStringWriter对象
SegmentedStringWriter:

public SegmentedStringWriter(BufferRecycler br)
    {
        super();
        _buffer = new TextBuffer(br);
    }

每创建一个SegmentedStringWriter对象都会同时创建一个TextBuffer对象
相当于每次调用JsonObjectUtils.converObjectTojson这个方法都会创建两个对象
代码中循环一千次,相当于一次请求在这个循环中就创建两千个对象,加上请求前后的创建使得内存消耗瞬间提升加上操作系统给每个进程分配的内存空间是有限的导致OOM

优化代码:

    List<Map> listMap = dao.select("xxx");
    String otherText = null;
    if (listMap != null && listMap.size() > 0) {
        //遍历结果,获取value直接拼接
        for (Map map : listMap) {
            if (map != null) {
                if (otherText == null) {
                    otherText = map.containsKey("xxxx") ? (String) map.get("xxxx") : null;
                } else if (otherText != null && StringUtils.isNotBlank(String.valueOf(map.get("xxxx")))) {
                    otherText = otherText + "," + map.get("xxxx");
                }
            }
        }
    }
    //根据","拆分字符串将每个单元转成json最后再拼接成字符串
    if (otherText.contains(",")) {
        otherText = Arrays.asList(otherText.split(",")).stream().map(str -> JsonObjectUtils.converObjectTojson(str)).collect(Collectors.joining(","));
    }

优化后的JVM运行时堆内存监测:
请添加图片描述

  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2022-03-21 21:22:01  更:2022-03-21 21:24:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/18 0:37:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码