JDK版本:

JDK8u192

bug:

https://bugs.openjdk.org/browse/JDK-8206333

堆栈:

"Common-Business-Thread-572" Id=1723 BLOCKED

at java.security.Provider.getService(Provider.java:1035)

at sun.security.jca.ProviderList.getService(ProviderList.java:332)

at sun.security.jca.GetInstance.getInstance(GetInstance.java:157)

at java.security.Security.getImpl(Security.java:695)

at java.security.MessageDigest.getInstance(MessageDigest.java:167)

at net.rubyeye.xmemcached.HashAlgorithm.computeMd5(HashAlgorithm.java:204)

at net.rubyeye.xmemcached.HashAlgorithm.hash(HashAlgorithm.java:133)

at net.rubyeye.xmemcached.impl.KetamaMemcachedSessionLocator.getSessionByKey(KetamaMemcachedSessionLocator.java:200)

at net.rubyeye.xmemcached.XMemcachedClient.catalogKeys(XMemcachedClient.java:1219)

at net.rubyeye.xmemcached.XMemcachedClient.getMulti0(XMemcachedClient.java:1156)

at net.rubyeye.xmemcached.XMemcachedClient.get(XMemcachedClient.java:1055)

at net.rubyeye.xmemcached.XMemcachedClient.get(XMemcachedClient.java:1088)

"Common-Business-Thread-119" Id=255 BLOCKED

at java.security.Provider.getService(Provider.java:1035)

at sun.security.jca.ProviderList.getService(ProviderList.java:332)

at sun.security.jca.GetInstance.getInstance(GetInstance.java:157)

at java.security.Security.getImpl(Security.java:695)

at java.security.MessageDigest.getInstance(MessageDigest.java:167)

at org.apache.commons.codec.digest.DigestUtils.getDigest(DigestUtils.java:68)

at org.apache.commons.codec.digest.DigestUtils.getMd5Digest(DigestUtils.java:98)

at org.apache.commons.codec.digest.DigestUtils.md5(DigestUtils.java:260)

at org.apache.commons.codec.digest.DigestUtils.md5Hex(DigestUtils.java:296)

问题分析:

  1. 频繁调用了MessageDigest.getInstance,就会调用Provider.getService (有synchronized关键字)
  2. DigestUtils.md5Hex 每次调用都会去调用MessageDigest.getInstance,而HashAlgorithm.computeMd5则是只有线程第一次计算MD5,才会去调用MessageDigest.getInstance

目前解决方案:

  1. 升级JDK版本 参考:https://bugs.java.com/bugdatabase/view_bug.do?bug_id=7092821 (建议这一步,但是高版本jdk要收费)
  2. 优化DigestUtils,效仿HashAlgorithm.computeMd5,把MessageDigest 存到去线程变量中,减少MessageDigest.getInstance调用

    代码调整:
// DigestUtils.md5Hex 变成Hex.encodeHexString(HashAlgorithm.computeMd5)

@Test
public void test() {
String data = "HELLO WORLD";
String expect = DigestUtils.md5Hex(data);
//
byte[] bytes = HashAlgorithm.computeMd5(data);
String actual = Hex.encodeHexString(bytes);
Assert.assertEquals(expect, actual);
}

java.security.provider.getservice blocked的更多相关文章

  1. java.security KeyPairGenerator

    KeyPairGenerator 类用于生成公钥和私钥对.密钥对生成器是使用 getInstance 工厂方法(返回一个给定类的实例的静态方法)构造的. 特定算法的密钥对生成器可以创建能够与此算法一起 ...

  2. Exception | java.security.NoSuchProviderException: no such provider: BC

    背景 今天在用PGP key做JWT签名和验签的时候,转换报了如下错误: org.bouncycastle.openpgp.PGPException: exception on setup: java ...

  3. 解决 java 使用ssl过程中出现"PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target"

    今天,封装HttpClient使用ssl时报一下错误: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorExc ...

  4. java.security.NoSuchAlgorithmException: Cannot find any provider supporting DESede/CBC/PKCS5Padding

    最近在做3DES加密,在本地window下面运行ok的程序,放到linux环境上竟然报错: Java.security.NoSuchAlgorithmException: Cannot find an ...

  5. java.security.NoSuchProviderException: no such provider: BC 的问题解决

    第一种方式 1.修改以下两个文件 %JDK_Home%\jre\lib\security\java.security %JRE_Home%\jre\lib\security\java.security ...

  6. java程序中访问https时,报 PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

    在java中使用https访问数据时报异常: Caused by: sun.security.validator.ValidatorException: PKIX path building fail ...

  7. 【问题记录】Java服务发起HTTPS请求报错:PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException

    问题报错 今天上线了我开发的一个OAuth2单点登录客户端的实现,在测试系统验证没问题,到生产环境由于单点登录服务端HTTPS协议,报错如下: I/O error on POST request fo ...

  8. Java Security:Java加密框架(JCA)简要说明

    加密服务总是关联到一个特定的算法或类型,它既提供了密码操作(如Digital Signature或MessageDigest),生成或供应所需的加密材料(Key或Parameters)加密操作,也会以 ...

  9. What is the reason for - java.security.spec.InvalidKeySpecException: Unknown KeySpec type: java.security.spec.ECPublicKeySpec

    支付中心Project重构完成,经过本地测试,并未发现问题.发布到测试环境后,测试发现请求光大扫码https接口时,出现了如下的异常: javax.net.ssl.SSLException: Serv ...

  10. How to resolve "your security settings have blocked an untrusted application from running" in Mac

    If you encounter the error "your security settings have blocked an untrusted application from r ...

随机推荐

  1. ORACLE存储过程中使用SELECT INOT语句避免NO_DATA_FOUND的方法

    oracle存储过程中使用了类似如下语句,当查询不到记录时,会触发"数据未发现"异常 SELECT col INTO v_col FROM t_table 来自网络的方法 1)使用 ...

  2. 玩转云端|天翼云边缘安全加速平台AccessOne实用窍门之上传下载极速推进,纵享丝滑体验!

    本文分享自天翼云开发者社区<玩转云端|天翼云边缘安全加速平台AccessOne实用窍门之上传下载极速推进,纵享丝滑体验!>,作者:天翼云社区官方账号 随着传媒行业数字化转型驶入深水区,如何 ...

  3. Linux 服务器防火墙开放端口命令(iptables、firewalld和ufw)

    本文主要介绍Linux中,Centos.Ubuntu和Debian开放防火墙端口的命令(iptables.firewalld和ufw)方法. 1.Centos中开放端口 1.systemctl sta ...

  4. 浅说 c++20 cppcoro (三)

    浅说 c++20 cppcoro (三),https://www.cnblogs.com/bbqzsl/p/18679860 接着上一篇浅说 c++20 coroutine (二) ,继续没说完的事. ...

  5. Vue3响应式编程三剑客:计算属性、方法与侦听器深度实战指南

    在Vue3开发中,计算属性.方法和侦听器是处理数据逻辑的核心工具.它们各自有不同的作用和适用场景,合理使用这些工具可以显著提升代码的可读性和性能.本篇将深入探讨这三者的定义.使用场景以及实际案例,并通 ...

  6. OpenLayers 绘制带箭头的LineString

    <!--******************************************************************** * Copyright 2000 - 2022 ...

  7. autMan奥特曼机器人-Linux、Windows、docker安装教程

    autMan简介 autMan是机器人牵引的扩展性极强的一站式解决方案 原生支持对接qq框架.qq频道.微信框架(酷V西瓜可爱猫千寻鲲鹏). 内置微信.微信客服.公众号.钉钉.飞书.tg客户端.tg机 ...

  8. AGC015D题解

    简要题意 给定一个区间 \([l,r]\),从中选出若干整数按位或,求可能出现的数的方案数. 数据范围:\(1\le l\le r\le2^{60}\). 思路 首先对于 \([l,r]\) 里的数全 ...

  9. 【配置化】C# dapper是怎么实现的?精短ORM

    目录 一.什么是dapper 二.实现问题与思路 & 源码参考 三.小结 一.什么是dapper dapper是个组件,一个dll文件,可以通过NuGet下载. 作用:快速访问数据库并自动完成 ...

  10. Web前端入门第 11 问:HTML 常用标签有多少?全量标签有多少?

    HELLO,这里是大熊学习前端开发的入门笔记. 本系列笔记基于 windows 系统. 截止发文,MDN 收录的 HTML 全量标签有 126 个,有 18 个标记已弃用. 名词解释:MDN --- ...