[jboss-jira] [JBoss JIRA] Assigned: (JBAS-7260) Performance issue: VFSClassLoaderPolicy uses URL.hashCode(), causing a DNS lookup
Jason T. Greene (JIRA)
jira-events at lists.jboss.org
Wed Sep 16 00:04:36 EDT 2009
[ https://jira.jboss.org/jira/browse/JBAS-7260?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Jason T. Greene reassigned JBAS-7260:
-------------------------------------
Assignee: Jason T. Greene (was: Scott M Stark)
> Performance issue: VFSClassLoaderPolicy uses URL.hashCode(), causing a DNS lookup
> ---------------------------------------------------------------------------------
>
> Key: JBAS-7260
> URL: https://jira.jboss.org/jira/browse/JBAS-7260
> Project: JBoss Application Server
> Issue Type: Bug
> Security Level: Public(Everyone can see)
> Components: ClassLoading
> Affects Versions: JBossAS-5.1.0.GA
> Reporter: Tolga Tarhan
> Assignee: Jason T. Greene
>
> There is a performance issue in JBoss AS 5.1.0.GA caused by the use of a ConcurrentHashMap with URL objects as the hash key. The offending usage is in VFSClassLoaderPolicy, in a member field named manifestCache. The field manifestCache is initialized as ConcurrentHashMap<URL, Manifest>();
> The underlying issue is that URL.hashCode() is a non-trivial operation, often requiring a DNS lookup. This DNS lookup can take a long time to timeout, adding up to 1-minute to the startup time of the application server .The issue is also encountered during runtime if certain class loader features are used (ie. getResource), causing up to a 1-minute delay when such features are used.
> The DNS lookups will never resolve in most cases, as the URL objects in question are usually in the form of:
> vfsmemory:aa15-xok7cr-fznfpulr-1-fznfpxto-7...
> A simple fix is to use the String returned form URL.toString() as the map key.
> Backtrace showing URL.hashCode causing a DNS lookup when used in ConcurrentHashMap from VFSClassLoaderPolicy:
> Inet6AddressImpl.lookupAllHostAddr(String) line: not available [native method]
> InetAddress$1.lookupAllHostAddr(String) line: 849
> InetAddress.getAddressFromNameService(String, InetAddress) line: 1200
> InetAddress.getAllByName0(String, InetAddress, boolean) line: 1153
> InetAddress.getAllByName(String, InetAddress) line: 1083
> InetAddress.getAllByName(String) line: 1019
> InetAddress.getByName(String) line: 969
> Handler(URLStreamHandler).getHostAddress(URL) line: 420
> Handler(URLStreamHandler).hashCode(URL) line: 337
> URL.hashCode() line: 857 [local variables unavailable]
> ConcurrentHashMap<K,V>.get(Object) line: 768
> VFSClassLoaderPolicy.getClassPackageInformation(String, String) line: 606
> BaseClassLoader.definePackage(String, URL) line: 722
> BaseClassLoader$2.run() line: 567
> BaseClassLoader$2.run() line: 532
> AccessController.doPrivileged(PrivilegedAction<T>, AccessControlContext) line: not available [native method]
> BaseClassLoader.loadClassLocally(String, boolean) line: 530
> BaseClassLoader.loadClassLocally(String) line: 507
> DelegateLoader(BaseDelegateLoader).loadClass(String) line: 134
> ClassLoadingTask$ThreadTask.run() line: 452
> ClassLoaderManager.nextTask(Thread, ClassLoadingTask) line: 251
> ClassLoaderManager.process(Thread, ClassLoadingTask) line: 150
> ClassLoaderDomain(BaseClassLoaderDomain).loadClass(BaseClassLoader, String, boolean) line: 265
> ClassLoaderDomain(BaseClassLoaderDomain).loadClass(BaseClassLoader, String) line: 1119
> BaseClassLoader.loadClassFromDomain(String, boolean) line: 798
> BaseClassLoader.loadClass(String, boolean) line: 441
> BaseClassLoader(ClassLoader).loadClass(String) line: 252
> ToClassInvoker.toClass(ToClassInvokerPoolReference, CtClass, String, ClassLoader, ProtectionDomain) line: 88
> JBossClDelegatingClassPool.toClass(CtClass, ClassLoader, ProtectionDomain) line: 81
> CtNewClass(CtClass).toClass(ClassLoader, ProtectionDomain) line: 1094
> TransformerCommon$ToClassAction$2.toClass(CtClass, ClassLoader, ProtectionDomain) line: 331
> TransformerCommon.toClass(CtClass, ClassLoader, ProtectionDomain) line: 139
> ProxyFactory.createProxyClass(ClassLoader, ProxyMixin[], Class<?>[]) line: 126
> ProxyFactory.createInterfaceProxy(GUID, ClassLoader, Class<?>[], ProxyMixin[], InstanceAdvisor) line: 96
> ProxyFactory.createInterfaceProxy(GUID, ClassLoader, Class<?>[]) line: 86
> Remoting.createRemoteProxy(Object, ClassLoader, Class[], InvokerLocator, List<Interceptor>, String) line: 102
> ManagedOperationProxyFactory.createDispatcherProxy() line: 203
> ManagedOperationProxyFactory.start() line: 109
> NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]
> NativeMethodAccessorImpl.invoke(Object, Object[]) line: 39
> DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25
> Method.invoke(Object, Object...) line: 597
> ReflectionUtils.invoke(Method, Object, Object[]) line: 59
> ReflectMethodInfoImpl.invoke(Object, Object[]) line: 150
> BasicMethodJoinPoint.dispatch() line: 66
> KernelControllerContextAction$JoinpointDispatchWrapper.execute() line: 241
> KernelControllerContextAction$JoinpointDispatchWrapper(ExecutionWrapper).execute(AccessControlContext) line: 47
> KernelControllerContextAction.dispatchExecutionWrapper(KernelControllerContext, ExecutionWrapper) line: 109
> KernelControllerContextAction.dispatchJoinPoint(KernelControllerContext, Joinpoint) line: 70
> StartStopLifecycleAction(LifecycleAction).installActionInternal(KernelControllerContext) line: 221
> StartStopLifecycleAction(InstallsAwareAction).installAction(KernelControllerContext) line: 54
> StartStopLifecycleAction(InstallsAwareAction).installAction(ControllerContext) line: 42
> StartStopLifecycleAction(SimpleControllerContextAction<T>).simpleInstallAction(T) line: 62
> StartStopLifecycleAction(AccessControllerContextAction<S,T>).install(ControllerContext) line: 71
> KernelControllerContextActions(AbstractControllerContextActions).install(ControllerContext, ControllerState, ControllerState) line: 51
> AbstractKernelControllerContext(AbstractControllerContext).install(ControllerState, ControllerState) line: 348
> AbstractKernelController(AbstractController).install(ControllerContext, ControllerState, ControllerState) line: 1631
> AbstractKernelController(AbstractController).incrementState(ControllerContext, boolean) line: 934
> AbstractKernelController(AbstractController).resolveContexts(ControllerState, ControllerState, boolean) line: 1082
> AbstractKernelController(AbstractController).resolveContexts(boolean) line: 984
> AbstractKernelController(AbstractController).install(ControllerContext, boolean) line: 774
> AbstractKernelController(AbstractController).install(ControllerContext) line: 540
> ServiceController.doInstall(KernelController, ServiceControllerContext) line: 670
> ServiceController.register(ObjectName, Collection<ObjectName>, boolean, Object) line: 373
> ServiceControllerRegistrationLifecycleCallback.install(ControllerContext) line: 104
> NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]
> NativeMethodAccessorImpl.invoke(Object, Object[]) line: 39
> DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25
> Method.invoke(Object, Object...) line: 597
> ReflectionUtils.invoke(Method, Object, Object[]) line: 59
> ReflectMethodInfoImpl.invoke(Object, Object[]) line: 150
> BasicMethodJoinPoint.dispatch() line: 66
> AbstractBeanInfo.invoke(Object, String, String[], Object[]) line: 300
> AbstractKernelControllerContext.invoke(String, Object[], String[]) line: 286
> AbstractLifecycleCallbackItem.install(ControllerContext) line: 87
> AbstractKernelController(AbstractController).handleLifecycleCallbacks(ControllerContext, ControllerState, boolean) line: 1568
> AbstractKernelController(AbstractController).handleInstallLifecycleCallbacks(ControllerContext, ControllerState) line: 1533
> AbstractKernelController(AbstractController).incrementState(ControllerContext, boolean) line: 943
> AbstractKernelController(AbstractController).resolveContexts(ControllerState, ControllerState, boolean) line: 1082
> AbstractKernelController(AbstractController).resolveContexts(boolean) line: 984
> AbstractKernelController(AbstractController).change(ControllerContext, ControllerState, boolean) line: 822
> AbstractKernelController(AbstractController).change(ControllerContext, ControllerState) line: 553
> ServiceController.doChange(KernelController, ServiceControllerContext, ControllerState, String) line: 688
> ServiceController.start(ObjectName) line: 460
> ServiceControllerStartStopLifecycleCallback.install(ControllerContext) line: 44
> NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]
> NativeMethodAccessorImpl.invoke(Object, Object[]) line: 39
> DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25
> Method.invoke(Object, Object...) line: 597
> ReflectionUtils.invoke(Method, Object, Object[]) line: 59
> ReflectMethodInfoImpl.invoke(Object, Object[]) line: 150
> BasicMethodJoinPoint.dispatch() line: 66
> AbstractBeanInfo.invoke(Object, String, String[], Object[]) line: 300
> AbstractKernelControllerContext.invoke(String, Object[], String[]) line: 286
> AbstractLifecycleCallbackItem.install(ControllerContext) line: 87
> AbstractKernelController(AbstractController).handleLifecycleCallbacks(ControllerContext, ControllerState, boolean) line: 1568
> AbstractKernelController(AbstractController).handleInstallLifecycleCallbacks(ControllerContext, ControllerState) line: 1533
> AbstractKernelController(AbstractController).incrementState(ControllerContext, boolean) line: 943
> AbstractKernelController(AbstractController).resolveContexts(ControllerState, ControllerState, boolean) line: 1082
> AbstractKernelController(AbstractController).resolveContexts(boolean) line: 984
> AbstractKernelController(AbstractController).install(ControllerContext, boolean) line: 774
> AbstractKernelController(AbstractController).install(ControllerContext) line: 540
> BeanMetaDataDeployer.deploy(DeploymentUnit, BeanMetaData) line: 121
> BeanMetaDataDeployer.deploy(DeploymentUnit, Object) line: 51
> BeanMetaDataDeployer(AbstractSimpleRealDeployer<T>).internalDeploy(DeploymentUnit) line: 62
> BeanMetaDataDeployer(AbstractRealDeployer).deploy(DeploymentUnit) line: 50
> DeployerWrapper.deploy(DeploymentUnit) line: 171
> DeployersImpl.doDeploy(Deployer, DeploymentUnit) line: 1439
> DeployersImpl.doInstallParentFirst(Deployer, DeploymentContext) line: 1157
> DeployersImpl.doInstallParentFirst(Deployer, DeploymentContext) line: 1178
> DeployersImpl.install(ControllerContext, ControllerState, ControllerState) line: 1098
> DeploymentControllerContext(AbstractControllerContext).install(ControllerState, ControllerState) line: 348
> AbstractKernelController(AbstractController).install(ControllerContext, ControllerState, ControllerState) line: 1631
> AbstractKernelController(AbstractController).incrementState(ControllerContext, boolean) line: 934
> AbstractKernelController(AbstractController).resolveContexts(ControllerState, ControllerState, boolean) line: 1082
> AbstractKernelController(AbstractController).resolveContexts(boolean) line: 984
> AbstractKernelController(AbstractController).change(ControllerContext, ControllerState, boolean) line: 822
> AbstractKernelController(AbstractController).change(ControllerContext, ControllerState) line: 553
> DeployersImpl.process(List<DeploymentContext>, List<DeploymentContext>) line: 781
> MainDeployerImpl.process() line: 702
> MainDeployerAdapter.process() line: 117
> ProfileDeployAction.install(Profile) line: 70
> ProfileDeployAction(AbstractProfileAction).install(ProfileContext) line: 53
> AbstractProfileService.install(ControllerContext, ControllerState, ControllerState) line: 361
> ProfileContext(AbstractControllerContext).install(ControllerState, ControllerState) line: 348
> ScopedProfileServiceController(AbstractController).install(ControllerContext, ControllerState, ControllerState) line: 1631
> ScopedProfileServiceController(AbstractController).incrementState(ControllerContext, boolean) line: 934
> ScopedProfileServiceController(AbstractController).resolveContexts(ControllerState, ControllerState, boolean) line: 1082
> ScopedProfileServiceController(AbstractController).resolveContexts(boolean) line: 984
> ScopedProfileServiceController(AbstractController).change(ControllerContext, ControllerState, boolean) line: 822
> ScopedProfileServiceController(AbstractController).change(ControllerContext, ControllerState) line: 553
> AbstractProfileService.activateProfile(ProfileKey) line: 306
> ProfileServiceBootstrap.start(Server) line: 271
> ServerImpl(AbstractServerImpl).start() line: 461
> Main.boot(String[]) line: 221
> Main$1.run() line: 556
> Thread.run() line: 619
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: https://jira.jboss.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
More information about the jboss-jira
mailing list