0

最近,我们在SunOS 5.10 Generic_144488-17 sun4v sparc SUNW,Sun-Blade-T6340机器上更新了 Java 7 更新 7 以更新 25 。更新后,我们部署在 WebLogic 11g 上的应用程序出现了严重的性能问题。

在线程转储分析期间,我们发现以下代码导致线程转储停止应用程序。此代码每 30 秒执行一次:

import java.lang.management.ManagementFactory;
import java.lang.management.ThreadInfo;
import java.lang.management.ThreadMXBean;

ThreadMXBean threadBean = ManagementFactory.getThreadMXBean();
ThreadInfo[] allThreadsList = threadBean.getThreadInfo(threadBean.getAllThreadIds(), isObjectMonitorUsageSupported, isSynchronizerUsageSupported);

线程转储:

at sun.management.ThreadImpl.dumpThreads0(Native Method)
at sun.management.ThreadImpl.getThreadInfo(ThreadImpl.java:440)

at sun.reflect.GeneratedMethodAccessor620.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:75)
at sun.reflect.GeneratedMethodAccessor265.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:279)
at com.sun.jmx.mbeanserver.StandardMBeanIntrospector.invokeM2(StandardMBeanIntrospector.java:112)
at com.sun.jmx.mbeanserver.StandardMBeanIntrospector.invokeM2(StandardMBeanIntrospector.java:46)
at com.sun.jmx.mbeanserver.MBeanIntrospector.invokeM(MBeanIntrospector.java:237)
at com.sun.jmx.mbeanserver.PerInterface.invoke(PerInterface.java:138)
at com.sun.jmx.mbeanserver.MBeanSupport.invoke(MBeanSupport.java:252)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
at weblogic.management.jmx.mbeanserver.WLSMBeanServerInterceptorBase$16.run(WLSMBeanServerInterceptorBase.java:449)
at java.security.AccessController.doPrivileged(Native Method)
at weblogic.management.jmx.mbeanserver.WLSMBeanServerInterceptorBase.invoke(WLSMBeanServerInterceptorBase.java:447)
at weblogic.management.mbeanservers.internal.JMXContextInterceptor.invoke(JMXContextInterceptor.java:263)
at weblogic.management.jmx.mbeanserver.WLSMBeanServerInterceptorBase$16.run(WLSMBeanServerInterceptorBase.java:449)
at java.security.AccessController.doPrivileged(Native Method)
at weblogic.management.jmx.mbeanserver.WLSMBeanServerInterceptorBase.invoke(WLSMBeanServerInterceptorBase.java:447)
at weblogic.management.mbeanservers.internal.SecurityInterceptor.invoke(SecurityInterceptor.java:444)
at weblogic.management.jmx.mbeanserver.WLSMBeanServer.invoke(WLSMBeanServer.java:323)
at javax.management.MBeanServerInvocationHandler.invoke(MBeanServerInvocationHandler.java:292)

任何人都知道为什么只有在升级到更新 25 后才会发生这种情况?我没有找到有关此更改的任何评论。

谢谢大家。

4

1 回答 1

0

我不知道这是什么原因......但一种可能的解决方案是尝试使用dumpAllThreads而不是你目前正在做的事情。

但令人费解的是,您的生产代码正在这样做……每 30 秒一次。进行线程转储涉及对每个线程的堆栈帧进行快照。这可能会很昂贵,特别是如果您有很多活动线程。如果你能说出你想要达到的目标,也许我们可以建议一个轻量级的替代方案。

于 2013-10-13T08:21:23.503 回答