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)

Reply via email to