Java sun.security.provider.SHA2使用100%的cpu,并在一段时间后挂起5分钟

Java sun.security.provider.SHA2使用100%的cpu,并在一段时间后挂起5分钟,java,spring,jboss7.x,geoserver,Java,Spring,Jboss7.x,Geoserver,我有一种奇怪的行为,也许你能帮我 环境是 jdk_7u40(使用具有相同行为的jdk_7u51进行试验) debian 6.0(在windows上,我从未遇到过这个问题) jboss 7.1.1 基于spring框架的Geoserver 2.4.x(尝试了.3和.4,结果相同) 其他war模块(不是基于spring的,但geoserver对它们有一些依赖关系) 问题是jboss运行了几个小时后,当我尝试登录geoserver的web界面(j_spring_security servlet的帖

我有一种奇怪的行为,也许你能帮我

环境是

  • jdk_7u40(使用具有相同行为的jdk_7u51进行试验)
  • debian 6.0(在windows上,我从未遇到过这个问题)
  • jboss 7.1.1
  • 基于spring框架的Geoserver 2.4.x(尝试了.3和.4,结果相同)
  • 其他war模块(不是基于spring的,但geoserver对它们有一些依赖关系)
问题是jboss运行了几个小时后,当我尝试登录geoserver的web界面(j_spring_security servlet的帖子)时,花了很多时间(4-5分钟)才到达应用程序的欢迎页面

使用jstack,我发现有一个线程始终消耗100%的内核,进程在这里继续工作

at sun.security.provider.SHA2.lf_S(SHA2.java:162)
at sun.security.provider.SHA2.lf_sigma0(SHA2.java:171)
at sun.security.provider.SHA2.implCompress(SHA2.java:225)
at sun.security.provider.SHA2.implDigest(SHA2.java:118)
at sun.security.provider.DigestBase.engineDigest(DigestBase.java:186)
at sun.security.provider.DigestBase.engineDigest(DigestBase.java:165)
at java.security.MessageDigest$Delegate.engineDigest(MessageDigest.java:576)
at java.security.MessageDigest.digest(MessageDigest.java:353)
at java.security.MessageDigest.digest(MessageDigest.java:399)
at org.jasypt.digest.StandardByteDigester.digest(StandardByteDigester.java:979)
- locked <0x00000006f8c30bb0> (a java.security.MessageDigest$Delegate)
at org.jasypt.digest.StandardByteDigester.matches(StandardByteDigester.java:1099)
at org.jasypt.digest.StandardStringDigester.matches(StandardStringDigester.java:1052)
at org.jasypt.util.password.StrongPasswordEncryptor.checkPassword(StrongPasswordEncryptor.java:99)
at org.jasypt.spring.security3.PasswordEncoder.isPasswordValid(PasswordEncoder.java:204)
at org.geoserver.security.password.AbstractGeoserverPasswordEncoder.isPasswordValid(AbstractGeoserverPasswordEncoder.java:138)
at org.geoserver.security.password.GeoServerMultiplexingPasswordEncoder.isPasswordValid(GeoServerMultiplexingPasswordEncoder.java:75)
at org.springframework.security.authentication.dao.DaoAuthenticationProvider.additionalAuthenticationChecks(DaoAuthenticationProvider.java:64)
位于sun.security.provider.SHA2.lf_S(SHA2.java:162)
位于sun.security.provider.SHA2.lf_sigma0(SHA2.java:171)
位于sun.security.provider.SHA2.implCompress(SHA2.java:225)
位于sun.security.provider.SHA2.implDigest(SHA2.java:118)
位于sun.security.provider.DigestBase.engineDigest(DigestBase.java:186)
位于sun.security.provider.DigestBase.engineDigest(DigestBase.java:165)
位于java.security.MessageDigest$Delegate.engineDigest(MessageDigest.java:576)
位于java.security.MessageDigest.digest(MessageDigest.java:353)
位于java.security.MessageDigest.digest(MessageDigest.java:399)
在org.jasypt.digest.StandardByteDigester.digest(StandardByteDigester.java:979)上
-锁定(java.security.MessageDigest$委托)
位于org.jasypt.digest.StandardByteDigester.matches(StandardByteDigester.java:1099)
位于org.jasypt.digest.StandardStringDigester.matches(StandardStringDigester.java:1052)
在org.jasypt.util.password.StrongPasswordEncryptor.checkPassword(StrongPasswordEncryptor.java:99)上
位于org.jasypt.spring.security3.PasswordEncoder.isPasswordValid(PasswordEncoder.java:204)
位于org.geoserver.security.password.AbstractGeoserverPasswordEncoder.isPasswordValid(AbstractGeoserverPasswordEncoder.java:138)
位于org.geoserver.security.password.GeoServerMultiplexingPasswordEncoder.isPasswordValid(GeoServerMultiplexingPasswordEncoder.java:75)
位于org.springframework.security.authentication.dao.DaoAuthenticationProvider.additionalAuthenticationChecks(DaoAuthenticationProvider.java:64)
你们中的一些人也有类似的问题

编辑(使用变通方法)

我发现问题与CMS垃圾收集器和permgen空间的增加有关

环境

应用服务器是JBoss 7.1.1,其中部署了5个war(Geoserver和其他)。所有战争之间都有共享的依赖关系(与Geoserver也有);Java正在使用
-XX:+UseParallelOldGC-XX:SoftRefLRUPolicyMSPerMB=36000运行

发生了什么

当执行完全gc时,permgen空间比使用的空间大得多。此后,
sun.security.provider.SHA2.*
中方法的计算变得非常缓慢

我是如何解决的


迁移到G1GC垃圾收集器为我解决了这个问题(目前我正在使用以下选项
-XX:+UseG1GC-XX:-useAptiveSizePolicy-XX:SurvivorRatio=1-XX:NewRatio=1-XX:MaxTenuringThreshold=15-XX:G1HeapRegionSize=32m

我还没有。你能在GeoServer自己的bug跟踪器上报告这个问题吗

我正等着在Geoserver中将其报告为bug,我认为这是“站在我这边”的问题。一旦我有了更多的信息(也就是我有一个确认jboss中所有其他战争都不是原因),我会在geoserver中填充一个bug,好吗?我找到了两个报告这个问题的链接。我遇到了完全相同的问题,在Windows下使用JDK7。总运行时间发生时只有几秒钟,但默认GC的行为与您在编辑中描述的完全相同。不幸的是,您提到的JDK bug说他们不会费心去修复这个bug,因为他们专注于JRE签名的JAR和SSL启动。