1

私は現在、Tomcat 6.0.26 で実行されている Liferay ポータル (6.0.6) でのメモリ リークを把握しようとしています。OutOfMemoryException が発生したときに生成されるメモリ ダンプを調べたところ、非常に明確な異常がありました。1 ~ 3 個の ThreadWithAttributes に 1 つの String / char 配列があり、それぞれが 1 GB 以上のメモリを占有しています。その内容は「10970_LAYOUT_56_INSTANCE_1GnU=ADddfj6O, 536133_LAYOUT_49=J23g02gH」…という形で何度も繰り返されています。

私が理解しているように、これはある種のポートレット ID であり、インスタンス ID ですが、この情報を使用して、どのポートレットがこれを引き起こしているかを調べるにはどうすればよいですか? 私は基本的に、Liferay と webapps 全般にまったく慣れていませんが、通常の Java SE アプリケーションのバックグラウンドは大丈夫です。私が理解しているように、Tomcat は、ポートレットが自分でクリーンアップすることを要求するスレッド プールを使用していますが、非常に大量のポートレットがあるため、責任のあるポートレットを推測するのは非常に困難です。では、その String を使用してポートレットを特定する方法はありますか?

前もって感謝します

4

2 に答える 2

1

PortletInstanceFactoryImpl.java を参照してください。これは、すべてのポートレットを保持するハッシュマップを保持します。「10970_LAYOUT_56_INSTANCE_1GnU=ADddfj6O」はポートレット インスタンス ID です。このハッシュマップがクリーンアップされていないため、liferay に問題があります。

于 2013-02-14T00:02:12.550 に答える
1

すべてのポートレットで以下の行を試す前に、これをお読みください...

        String portletId = (String) request.getAttribute(WebKeys.PORTLET_ID);
于 2012-09-22T15:17:21.297 に答える