[
https://issues.apache.org/jira/browse/SLING-12483?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Joerg Hoh updated SLING-12483:
------------------------------
Description:
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.
Note: The Sling Model Exporter is a feature known to create Sling Models, and
depending on the Sling Model graph the number can be quite large. But also
other functionality is affected which is creating Sling Models.
was:
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.
> 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
> Priority: Major
>
> 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.
> Note: The Sling Model Exporter is a feature known to create Sling Models, and
> depending on the Sling Model graph the number can be quite large. But also
> other functionality is affected which is creating Sling Models.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)