Joerg Hoh created SLING-12483:
---------------------------------
Summary: Improve performance of constructor-based instantiation on
Java11
Key: SLING-12483
URL: https://issues.apache.org/jira/browse/SLING-12483
Project: Sling
Issue Type: Improvement
Components: Sling Models
Affects Versions: Models Implementation 1.7.4
Reporter: Joerg Hoh
Context:
* Runtime with Java 11
* Sling Models Impl 1.7.4
When exporting a larger graph of Sling Models, the response time increased
massively in comparison to Sling Models Impl 1.6.4.
Many threaddumps look like this:
{noformat}
at
org.apache.sling.feature.launcher.spi.Launcher$LauncherClassLoader.loadClass(Launcher.java:50)
- waiting to lock <0x000000059b115828> (a java.lang.Object)
at
java.lang.ClassLoader.loadClass([email protected]/ClassLoader.java:521)
at
org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1458)
at
org.apache.felix.framework.BundleWiringImpl.access$300(BundleWiringImpl.java:79)
at
org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1976)
at
java.lang.ClassLoader.loadClass([email protected]/ClassLoader.java:521)
at java.lang.Class.forName0([email protected]/Native Method)
at java.lang.Class.forName([email protected]/Class.java:315)
at
org.apache.sling.models.impl.ReflectionUtil.isRecord(ReflectionUtil.java:127)
at
org.apache.sling.models.impl.model.ModelClassConstructor.isCanonicalRecordConstructor(ModelClassConstructor.java:90)
at
org.apache.sling.models.impl.ModelAdapterFactory.getBestMatchingConstructor(ModelAdapterFactory.java:803)
at
org.apache.sling.models.impl.ModelAdapterFactory.createObject(ModelAdapterFactory.java:718)
at
org.apache.sling.models.impl.ModelAdapterFactory.internalCreateModel(ModelAdapterFactory.java:409)
at
org.apache.sling.models.impl.ModelAdapterFactory.getAdapter(ModelAdapterFactory.java:219)
at
org.apache.sling.adapter.internal.AdapterManagerImpl.getAdapter(AdapterManagerImpl.java:121)
at
org.apache.sling.models.impl.ResourceOverridingRequestWrapper.adaptTo(ResourceOverridingRequestWrapper.java:90)
at
org.apache.sling.models.impl.ModelAdapterFactory.getModelFromWrappedRequest(ModelAdapterFactory.java:1374)
[...]
at
com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:341)
at
com.fasterxml.jackson.databind.ObjectMapper.writeValue(ObjectMapper.java:3364)
at
org.apache.sling.models.jacksonexporter.impl.JacksonExporter.export(JacksonExporter.java:135){noformat}
This seemed to be caused by SLING-12359, which adds support for Records. In
[ReflectionUtils.isRecord|https://github.com/apache/sling-org-apache-sling-models-impl/blob/1161d8f05806de8d207005e86a6b5d45999e155d/src/main/java/org/apache/sling/models/impl/ReflectionUtil.java#L125]
it constantly tries to load the class {{java.lang.Record}} which is not
available in Java 11 and therefor throws a ClassNotFoundException (which is
then caught to just return {{false}}
The locking in the classloader and the inevitable ClassNotFoundException on
Java11 cause a small performance penalty, which is amplified by the Exporter,
when it is serializing a large amount of models.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)