[Seasar-user:18263] Re: OGNLとPermanent領域圧迫の関係について

Koichi Kobayashi [E-MAIL ADDRESS DELETED]
2009年 8月 12日 (水) 17:30:01 JST


小林 (koichik) です.

Date:    Wed, 12 Aug 2009 15:41:53 +0900
From:    大塚 幸二 <[E-MAIL ADDRESS DELETED]>
To:      <[E-MAIL ADDRESS DELETED]>
Subject: [Seasar-user:18261] Re: OGNLとPermanent領域圧迫の関係について

> 3.FullGCが発生してもPermanent領域が減らないことを確認した

Web アプリを undeploy したり,開発時に
HOT deploy を使ったりしている場合を除けば,
基本的に Permanent 領域は減らないと思いますよ.
クラスがアンロードされる (クラスローダが GC
される) 機会がないので.

> Permanent領域は時間経過とともに増えていっていることも確認
(略)
> ------------------------------------------------------------------------
> [PSPermGen: 639049K->639049K(641216K)]
> [PSPermGen: 639273K->639273K(641088K)]
> [PSPermGen: 639988K->639988K(641664K)]
> [PSPermGen: 640615K->638082K(639552K)]
> [PSPermGen: 638231K->638231K(639680K)]
> [PSPermGen: 638364K->638364K(640256K)]
> [PSPermGen: 638634K->638634K(640128K)]
> [PSPermGen: 638943K->638481K(639616K)]
> ------------------------------------------------------------------------

これだけだと漸増しているように見えませんが.

> アプリは約1000画面、7000ファンクションポイントの規模です。
> 前回記載させていただいたとおり
> 1000リクエストで約1900クラスのリフレクションクラスが増加しました。
> ここまで多くのキャッシュをするものなのでしょうか。

Seasar2 や OGNL で扱うクラスはいくつになりますか?
それが数百〜1000 クラスあればそれぞれに対する
コンストラクタとメソッド (setter/getter 含む) で 
1900 程度はリフレクションでアクセスすることに
なります.
Java ではリフレクション情報の取得は遅いので,
Seasar2 も OGNL も 
java.lang.reflect.(Constructor|Method) を
キャッシュします.
そのため,Generated(Constructor|Method)Accessor が
GC されないのではないかと推測します.

もし Seasar2 で扱うクラスが数百〜1000 程度であれば,
そのくらいの規模は珍しくないし決して大規模でもないと
思います.
1000 画面ということから考えると実際はもっと多いと
思いますが,たかだか 1900 程度の
Generated(Constructor|Method)Accessor がそこまで
問題になるのか疑問です.
というか Generated(Constructor|Method)Accessor が
Permanent 領域を消費するのかどうか自体が疑問ですが.
これはヒープに置かれるものでは?

最初の投稿にあったリンク先のコメント欄を見ると,
Generated(Constructor|Method)Accessor が作成
される前に JNI 経由でリフレクションが動く場合に
Permanent 領域が使われ,
Generated(Constructor|Method)Accessor の場合は
Permanent 領域を使わないと書いてるように見えます.

もしそうであれば,
Generated(Constructor|Method)Accessor の数と
Permanent 領域の消費量は無関係ということになります.
その場合は,JVM オプションで

-Dsun.reflect.noInflation=true

を指定すると,
Generated(Constructor|Method)Accessor の数は
変わらないけれども,Permanent 領域の消費量は
減少するかもしれません.
# 元記事では 
# -Dsun.reflect.noInf r ation=true
# になってますが r ではなく l が正しいはず.


-- 
<component name="koichik">
    <property name="fullName">"Koichi Kobayashi"</property>
    <property name="email">"[E-MAIL ADDRESS DELETED]"</property>
    <property name="blog">"http://d.hatena.ne.jp/koichik"</property>
</component>



Seasar-user メーリングリストの案内