【发布时间】:2014-02-04 11:32:06
【问题描述】:
我有一个奇怪的行为,也许你可以帮助我。
环境是
- 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 的 POST)时,需要很长时间(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)
你们中的一些人有类似的问题吗?
编辑(有解决方法)
我发现问题与CMS垃圾收集器和permgen空间的增加有关。
环境
应用服务器是 JBoss 7.1.1,其中部署了 5 个战争(Geoserver 和其他)。所有战争之间都有共同的依赖关系(也有地理服务器); Java 使用 -XX:+UseParallelOldGC -XX:SoftRefLRUPolicyMSPerMB=36000 运行
会发生什么
当执行一次完整的 gc 时,permgen 空间会比已使用的空间增加很多。之后sun.security.provider.SHA2.*中方法的计算就变得很慢了。
我是怎么解决的
迁移到 G1GC 垃圾收集器为我解决了这个问题(目前我正在使用以下选项 -XX:+UseG1GC -XX:-UseAdaptiveSizePolicy -XX:SurvivorRatio=1 -XX:NewRatio=1 -XX:MaxTenuringThreshold=15 -XX:G1HeapRegionSize=32m)
【问题讨论】:
-
我找到了 2 个报告此问题的链接。 JDK bug 和 yellowgrass bug
-
我遇到了完全相同的问题,在 Windows 下使用 JDK7。发生时总运行时间只有几秒钟,但默认 GC 的行为与您在编辑中描述的完全一样。不幸的是,您提到的 JDK 错误表示他们不会费心修复错误,因为他们专注于 JRE 签名的 jar 和 SSL 启动。
标签: java spring jboss7.x geoserver