非常に大きなFragmentEntryLinksが多数存在する場合、起動時にOutOfMemoryErrorが発生する。

問題

  • Liferayの起動に非常に時間がかかり、以下のようなHeap Spaceエラーを投げます:
ERROR [Framework Event Dispatcher: Equinox Container: d97119a4-f960-4e1c-839b-88c78fbc6cc6][Framework:93] FrameworkEvent ERROR 
java.lang.OutOfMemoryError: Java heap space
at java.base/java.util.Arrays.copyOf(Arrays.java:3745)
at java.base/java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:172)
at java.base/java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:686)
at java.base/java.lang.StringBuilder.append(StringBuilder.java:232)
at org.hibernate.type.StringClobType.nullSafeGet(StringClobType.java:69)
at org.hibernate.type.CustomType.nullSafeGet(CustomType.java:109)
at org.hibernate.type.AbstractType.hydrate(AbstractType.java:104)
at org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:2283)
at org.hibernate.loader.Loader.loadFromResultSet(Loader.java:1527)
at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1455)
at org.hibernate.loader.Loader.getRow(Loader.java:1355)
at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:611)
at org.hibernate.loader.Loader.doQuery(Loader.java:829)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274)
at org.hibernate.loader.Loader.doList(Loader.java:2542)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2276)
at org.hibernate.loader.Loader.list(Loader.java:2271)
at org.hibernate.hql.classic.QueryTranslatorImpl.list(QueryTranslatorImpl.java:940)
at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1268)
at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102)
at com.liferay.portal.dao.orm.hibernate.QueryImpl.list(QueryImpl.java:112)
at com.liferay.portal.dao.orm.hibernate.QueryImpl.list(QueryImpl.java:104)
at com.liferay.portal.kernel.dao.orm.QueryUtil.list(QueryUtil.java:61)
at com.liferay.portal.kernel.dao.orm.QueryUtil.list(QueryUtil.java:53)
at com.liferay.fragment.service.persistence.impl.FragmentEntryLinkPersistenceImpl.findByRendererKey(FragmentEntryLinkPersistenceImpl.java:2670)
at com.liferay.fragment.service.persistence.impl.FragmentEntryLinkPersistenceImpl.findByRendererKey(FragmentEntryLinkPersistenceImpl.java:2560)
at com.liferay.fragment.service.persistence.impl.FragmentEntryLinkPersistenceImpl.findByRendererKey(FragmentEntryLinkPersistenceImpl.java:2519)
at com.liferay.fragment.service.impl.FragmentEntryLinkLocalServiceImpl.getFragmentEntryLinks(FragmentEntryLinkLocalServiceImpl.java:385)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  • Liferay全体のコンテンツページには、数万個の大きなフラグメント が存在します。

Environment

  • DXP 7.2
  • DXP 7.3
  • DXP 7.4

解決策

  • この問題は、 LPS-177286によって解決されます。
  • ヘルプセンターのチケットで、 LPS-168582, LPS-177987, LPS-178527を含むパッチレベルのHotfixをリクエストします。
  • Hotfix のインストールが完了したら、 osgi/configs フォルダに com.liferay.fragment.configuration.FragmentServiceConfiguration.config という名前のファイルを作成し、以下の内容を記述します:
    propagateContributedFragmentChanges=B"false" 

追加情報

  • 起動時に、あるフラグメントエントリーに属するすべてのフラグメントエントリーリンクをメモリに取り込み、それを反復して更新ロジックを実行することで、すべてのフラグメントエントリーリンクを更新する手順があります。
  • しかし、 、すべてのフラグメントリンクを一度にメモリにフェッチするため、多くの詳細なコンテンツページを持つ大規模なポータルインスタンスでは、このロジックはうまくスケールしない。
  • LPS-177286 管理者が スタートアップで Contributed Fragment の変更の伝搬を有効/無効にできるようにする
この記事は役に立ちましたか?
0人中0人がこの記事が役に立ったと言っています