查看 java heapspace_Java heap space 问题查找
在项目开发上线的过程中,最近发现一个Dubbo服务隔7天左右就会出现以下问题:
Exception in thread "Timer-0" java.lang.OutOfMemoryError: Java heap space
(一开始使用findBugs进行扫描,并未扫描出可用结果)
首先,介绍一个免费开源分析dump的软件Memory Analyzer,下载地址如下所示:(同事介绍)
ps aux | grep xxx 查询进程ID
jmap -dump:live,format=b,file=文件名.bin 进程ID
可将生成的dump文件下载到本地,使用Memory Analyzer打开其文件进行分析。
最好在进程刚刚开启时就生成一个dump文件,在服务使用一段时间后再生成一个dump文件,两个文件进行对比排除内存漏洞问题。
经过排查发现漏洞问题如下所示:
发现问题出现在了JceSecurity的verificationResults 属性上,在verificationResults 属性中存在了过多的BouncyCastleProvider,随着应用的使用正在不断的增多,未被GC回收。
对javax.crypto.JceSecurity进行反编译查看代码发现verificationResults 是static 类属性,GC不会自动对其永久代进行回收。
对项目代码进行排查,发现项目中使用代码BouncyCastleProvider使用代码如下所示:
Java代码
Cipher ci = Cipher.getInstance("RSA", new BouncyCastleProvider());
发现是坑张的代码,在服务每次使用的时候都会重新创建一个BouncyCastleProvider用来进行初始化密钥的工具类。
Java代码
public static final Cipher getInstance(String paramString, Provider paramProvider)
throws NoSuchAlgorithmException, NoSuchPaddingException{
if (paramProvider == null) {
throw new IllegalArgumentException("Missing provider");
}
Object localObject1 = null;
List localList = getTransforms(paramString);
int i = 0;
String str = null;
for (Iterator localIterator = localList.iterator(); localIterator.hasNext(); ) {
Transform localTransform = (Transform)localIterator.next();
Provider.Service localService = paramProvider.getService("Cipher", localTransform.transform);
if (localService == null)
continue;
Object localObject2;
Object localObject3;
if (i == 0){
localObject2 = JceSecurity.getVerificationResult(paramProvider);
if (localObject2 != null) {
localObject3 = "JCE cannot authenticate the provider " + paramProvider.getName();
throw new SecurityException((String)localObject3, (Throwable)localObject2);
}
i = 1;
}
if (localTransform.supportsMode(localService) == 0) {
continue;
}
if (localTransform.supportsPadding(localService) == 0) {
str = localTransform.pad;
}
try{
localObject2 = (CipherSpi)localService.newInstance(null);
localTransform.setModePadding((CipherSpi)localObject2);
localObject3 = new Cipher((CipherSpi)localObject2, paramString);
((Cipher)localObject3).provider = localService.getProvider();
((Cipher)localObject3).initCryptoPermission();
return localObject3;
} catch (Exception localException) {
localObject1 = localException;
}
}
if (localObject1 instanceof NoSuchPaddingException) {
throw ((NoSuchPaddingException)localObject1);
}
if (str != null) {
throw new NoSuchPaddingException("Padding not supported: " + str);
}
throw new NoSuchAlgorithmException("No such algorithm: " + paramString, localObject1);
}
可查看BouncyCastleProvider代码发现此类进行过特殊处理,每次new出的实例hashCode是相同的。又对JceSecurity.getVerificationResult方法代码进行了分析,代码如下所示:
Java代码
static synchronized Exception getVerificationResult(Provider paramProvider){
Object localObject1 = verificationResults.get(paramProvider);
if (localObject1 == PROVIDER_VERIFIED)
return null;
if (localObject1 != null) {
return (Exception)localObject1;
}
if (verifyingProviders.get(paramProvider) != null)
{
return new NoSuchProviderException("Recursion during verification");
}Exception localException2;
try {
verifyingProviders.put(paramProvider, Boolean.FALSE);
URL localURL = getCodeBase(paramProvider.getClass());
verifyProviderJar(localURL);
verificationResults.put(paramProvider, PROVIDER_VERIFIED);
localException2 = null;
return localException2;
}
catch (Exception localException1){
verificationResults.put(paramProvider, localException1);
localException2 = localException1;
return localException2; } finally { verifyingProviders.remove(paramProvider); }
}
查找到这里发现自己越来越矛盾,每次new出来的BouncyCastleProvider具有相同的hashCode,放在verificationResults 属性Map中怎么会越来越多,后一个应当会将前一个覆盖才对,怎么会导致内存溢出。
最终实在无头绪请教同事,发现一个verificationResults属性定义的居然是IdentityHashMap,此Map在存储类的时候并不是使用类的equals方法来判断是否Key已经存在,而是使用==来判断是否Key已经存在的。换句话说就是当两个对象不==那此Map就会将两个对象都存进去。
找到这里问题的解决方案就已经非常明了了,只要给BouncyCastleProvider定义成单例就可以了。
查看 java heapspace_Java heap space 问题查找相关推荐
- bat查看java进程 过滤_通过查找.BAT中使用的端口来终止进程
回答(14) 2 years ago 这是一个让你入门的命令: FOR /F "tokens=4 delims= " %%P IN ('netstat -a -n -o ^| fi ...
- java perm heap 区别_JVM虚拟机选项:Xms Xmx PermSize MaxPermSize区别
java虽然是自动回收内存,但是应用程序,尤其服务器程序最好根据业务情况指明内存分配限制.否则可能导致应用程序宕掉. 举例说明含义: -Xms128m 表示JVM Heap(堆内存)最小尺寸128MB ...
- 应用jacob组件造成的内存溢出解决方案(java.lang.OutOfMemoryError: Java heap space)
http://www.educity.cn/wenda/351088.html 使用jacob组件造成的内存溢出解决方案(java.lang.OutOfMemoryError: Java heap s ...
- yarn中MR作业报错Java heap space
hue页面提交到hive中的作业,被转换成了MR作业运行在yarn集群中.作业报错 //0,报错内容摘要 我们hadoop-2.7集群用的执行引擎不是Tez,而是mr(是老集群) Error: Jav ...
- Hive集成Tez引擎跑任务出现的问题(Java heap space问题)
问题1:Hive集成Tez引擎跑任务出现异常:TaskAttempt 3 failed, info=[Error: Error while running task ( failure ) : att ...
- Java heap space设置方法记录
近被 OutOfMemory Error折腾得够呛,记载一点设置JVM虚拟机内存Java heap space的方法. Tomcat 7 参考: http://www.davidghedini.com ...
- kafka 出现Java heap space的解决方法
问题: 测试环境异常,经过查看server.log日志,发现:java.lang.OutOfMemoryError: Java heap space,具体如下: server.log: [2021-0 ...
- PermGen space 与 Java heap space
1.java.lang.OutOfMemoryError: PermGen space PermGen space的全称是Permanent Generation space,是指内存的永久保存区域O ...
- caused by: java.lang.outofmemory_hadoop运行java.lang.OutOfMemoryError:java heap space错误。
在map任务中,导入了99M的文件,运行时出现下面的问题: java.lang.RuntimeException:java.lang.reflect.InvocationTargetException ...
最新文章
- 微信十年,张小龙下一步要干什么?
- 一分钟了解阿里云产品:阿里云解析五大热点技术问题分析
- 九宫重排_康拓展开_bfs
- php中图片上传_php实现图片上传并进行替换操作
- 十一资讯 | 字节跳动进军汽车云;Twitch被黑;Facebook宕机;Netfilx收购游戏公司……...
- java web空白xml_【图片】我做的JSP+Servlet程序,插入信息提交后出现空白页面,不知道是…【java吧】_百度贴吧...
- mysql定时增量备份_Mysql日常自动备份和增量备份脚本
- tf.data.TextLineDataset()
- Linux7/Redhat7/Centos7 安装Oracle 12C_配置VNC远程安装数据库_03
- bat脚本 git pull_Git遇到错误时如何解决的一些坑
- Linux 任务计划、周期性任务计划
- 南非看世界杯通信问题全攻略(世界杯与通信1)
- SSIS实践入门1:我的第一个SSIS程序开发
- S-function入门及案例详解(1)——S-function基础介绍及基本案例
- web网页简繁汉字转换
- 基于R语言的方差分析
- 更改docker ip
- 《天才在左疯子在右》读后感
- 类的加载、连接和初始化
- jupyter添加快捷方式
热门文章
- CentOS SELinux
- win7向虚拟机linux传文件,如何实现主机windows与虚拟机liunx之间互传文件
- python装饰器测试_python 装饰器
- python sqlite3 带密码_Python实现ATM提款机系统
- python三本经典书籍-《python编程入门经典》python之父推荐这三本书让你更快入门...
- 学python需要什么基础-学Python需要什么基础知识?零基础可以学Python吗?
- python 下载文件-Python实现http文件下载
- python常用代码总结-Python常用功能函数系列总结(一)
- s7300plc串口通信_s7-300串口通讯.ppt
- 计算机信息安全技术计算题,计算机信息安全技术练习题.doc