mapdb是什么

mapdb是一个快速、易用的嵌入式java数据库,主要提供map和set形式的数据存储,使用起来就像是在操作java本身的map,set,

mapdb可以提供内存级别和磁盘级别的缓存,MapDB 提供了并发的 TreeMap 和 HashMap ,使用基于磁盘的存储。快速、可伸缩性以及易用,它提供了基于磁盘或者堆外(off- heap允许Java直接操作内存空间, 类似于C的malloc和free)存储的并发的Maps、Sets、Queues。MapDB的前身是JDBM,已经有15年的历史。

它的jar包只有200KB,且无其它依赖,非常轻量。MapDB目前相对来说功能已经稳定,并有全职 的开发者支持开发。

mapdb引起app-6028-security应用CPU消耗异常问题定位案例

最近2天在测试的过程中发现基础应用服务app-6028-security应用存在一个奇怪的问题,该应用在运行一段时间后,发现这个服务的cpu经常在200%多,即使不做任务业务操作,

cpu的使用率一段时间后仍然飙升到200%,所以很奇怪,现象是运行一晚上后,就会出现这个cpu高的问题,重启应用后过一段的时间又会重新复现,

该应用主要是做一些敏感数据的加密和解密的服务(比如身份证、银行卡、姓名、手机号等数据加密和解密)。

由此确定这个cpu消耗最多的进程是app-6028-security应用

通过top -Hp 29868

发现其中的2个线程,消耗异常,始终消耗cpu 99%

登录docker通过jstack查看:

jstack 57 | grep "nid=0x98" -A30

到此,基本确定这段代码肯定存在问题

为了验证问题的准确性,接着登录我们的准生产环境,看看这个问题是否存在:

登录准生产后,查看如下:

发现准生产也存在这个问题,其实问题就是这两个线程导致的

然后让运维去线上查看这个服务的cpu消耗,占据了也是200%,也让运维拿到上面的docker环境里的进程号:

printf "%x\n" tid

nid=0xaf

nid=0xb3

APP项目中调用到mapdb的代码如下:

查看1.0.9版本代码中的代码逻辑如下:

通过和架构师讨论,建议升级到该版本的下一个版本,从当前的1.0.9版本升级到2.0的版本,如果版本跨度,怕不兼容,所以为了安全起见,暂时这样解决,最新版本的是支持jdk1.8 而我们项目是jdk1.7版本

老版本的源码如下

新版本的源码如下:

通过对比mapdb插件源码,发现存在问题的源码已经改动了,所以将mapdb从1.0.9版本升级到2.0-beta13版本后,观察2天三夜,问题不在复现

目前问题已经解决

其实这个问题很容易,但是主要是他对性能的影响不大,在和运维获取线上的这个服务的cpu占用时候,运维都觉得影响不大,cpu消耗占用都不大,但是作为性能测试人员,一定要严格要求项目,任何问题不要放过

但是说明以前的测试,没有重视和解决这个问题,毕竟这个问题已经在线上运行了2年以上了

参考文章:

https://mvnrepository.com/artifact/org.mapdb/mapdb

https://blog.csdn.net/qy20115549/article/details/53207093

https://blog.csdn.net/abc86319253/article/details/53020432

https://blog.csdn.net/u014401141/article/details/79132224

http://www.sohu.com/a/136901812_494947

https://blog.csdn.net/Appleyk/article/details/79880655

http://www.mapdb.org/

https://www.jianshu.com/p/b6f43302338e

开源jar包bug导致的CPU消耗200%问题分析案例的更多相关文章

  1. Java运用第三方开源jar包sigar.jar获取服务器信息

    通过使用第三方开源jar包sigar.jar我们可以获得本地的信息 一.准备工作 (1)下载jar包和相关文件 资源链接:百度云:链接:https://pan.baidu.com/s/1nxccJHJ ...

  2. flink clickhouse-jdbc和flink-connector 写入数据到clickhouse因为jar包冲突导致的60 seconds.Please check if the requested resources are available in the YARN cluster和Could not resolve ResourceManager address akka报错血案

    一.问题现象,使用flink on yarn 模式,写入数据到clickhouse,但是在yarn 集群充足的情况下一直报:Deployment took more than 60 seconds. ...

  3. Java常用开源jar包

    转:http://blog.csdn.net/kevingao/article/details/8125683 activation~与javaMail有关的jar包,使用javaMail时应与mai ...

  4. 如何在gradle项目中添加额外非开源jar包并提交代码

    前提:项目开发中,遇到一个地方需要用到公司自定义的jar包,然后要放到代码里又不方便提交到私服 具体实施: 首先在项目中增加一个 libs目录,然后把这种非开源又不在私服上的jar包扔进去, 然后打开 ...

  5. Spark On YARN使用时上传jar包过多导致磁盘空间不够。。。

    今天测试过程中发现YARN Node变成Unhealthy了,后来定位到硬盘空间不够..... 通过查找大于100M的文件时发现有N多个spark-assembly-1.4.0-SNAPSHOT-ha ...

  6. 项目红色感叹号eclipse因Web App Libraries中的jar包missing导致项目红色感叹号

    症状: 如题 分析: 修改.更换或者删除了WEB-INF/lib中的jar包 解决方案: 右击项目>build path>Libraries 直接remove Web App Librar ...

  7. 修改jar包bug的方式

    第一种方式 1. 直接在项目同样的包名里面新建同样的class,会优先jar包的class加载,等同于覆盖. 第二种方式 2. 拿到第一步打包后的jar或者war,找到相应的java类的.class文 ...

  8. 自定义API(Jar包)的创建与使用(简单实现案例)

    @ 目录 学习内容 1. 自定义工具类 2. 导出jar 3. 加载Jar包 4. 调用自定义的API方法 总结 学习内容 1. 自定义工具类 新建一个java项目,然后创建包和工具类StringUt ...

  9. Java去除掉HTML里面所有标签的两种方法——开源jar包和自己写正则表达式

    Java去除掉HTML里面所有标签,主要就两种,要么用开源的jar处理,要么就自己写正则表达式.自己写的话,可能处理不全一些自定义的标签.企业应用基本都是能找开源就找开源,实在不行才自己写…… 1,开 ...

随机推荐

  1. Linux进阶知识和命令

    一.Linux目录结构 目录 说明 /lost found系统修复 /bin 二进制命令所在的目录. /boot 系统引导程序所需的文件目录.安装系统分区的时候一般单独要分一个boot分区,大小可谓1 ...

  2. 基于jeesite的cms系统(二):整体设计

    一.菜单设计 在系统管理-菜单管理中可以设置内容管理菜单(自动生成) 注意:归属模块应属于核心模块core.如果新加的的菜单设置为内容管理模块cms,系统下次重启时会重置本次设置,具体原因不详. 二. ...

  3. docker部署archery

    一.centos7部署docker 1 通过 uname -r 命令查看你当前的内核版本 uname -r 2  确保 yum 包更新到最新. yum update 3 卸载旧版本 yum remov ...

  4. 读取FTP上的某个文本文档内容到本地

    /// <summary> /// 读取FTP服务器文本内容 /// </summary> /// <param name="strPath"> ...

  5. 工作经验-PLSQL连接远程数据库

    复制远程Oracle,tnsnames.ora 放到[D:\OneDrive\PLSQL\instantclient_11_2\network\admin] PLSQL->Tools > ...

  6. LOJ #6485 LJJ 学二项式定理

    QwQ LOJ #6485 题意 求题面中那个算式 题解 墙上暴利 设$ f(x)=(sx+1)^n$ 假设求出了生成函数$ f$的各项系数显然可以算出答案 因为模$ 4$的缘故只要对于每个余数算出次 ...

  7. spring.http.multipart.maxFileSize提示无效报错问题处理

    在SpringBoot项目中,配置spring.http.multipart.maxFileSize用于限定最大文件上传大小. 但是,SpringBoot版本不同,关于这一块的配置也不相同. 1.Sp ...

  8. 415 DOM 查找列表框、下拉菜单控件、对表格元素/表单控件进行增删改操作、创建元素并且复制节点与删除、 对表格操作、通用性和标准的事件监听方法(点击后弹窗效果以及去掉效果)

    DOM访问列表框.下拉菜单的常用属性: form.length.options.selectedindex.type       使用options[index]返回具体选项所对应的常用属性:defa ...

  9. 从输入URL到浏览器显示页面发生了什么

    1.输入网址 当你开始输入网址比如www.cnblogs.com时游览器就可以在书签或者历史记录里面去搜索相关的网址推荐给你. 2.游览器查找域名的IP地址 ① 请求发起后,游览器首先会解析这个域名, ...

  10. Non-decreasing Array

    Given an array with n integers, your task is to check if it could become non-decreasing by modifying ...