- ベストアンサー
OutOfMemoryError: PermGen
- Webアプリを作成中なのですが過去にアプリ使用中にOutOfMemoryError: PermGen spaceが何回か発生しました。
- コネクションとクローズを大量に繰り返す場合、メモリを圧迫することがあります。
- 「OutOfMemoryError: PermGen space」はクラスがアプリにロードされるときにクラスとそのメタ情報が格納されるメモリ領域のエラーです。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
> 1.コネクションとクローズを大量に繰り返すとメモリを圧迫することがある? 可能性としてはある。JDBCドライバの作りにもよるけど。 だけど、その場合はクラス定義(クラスのメタ情報)ではなくインスタンスができては消え、できては消え、となるので、クラス定義が何回もロードされるとは考えにくい。 > 2.1.が本当だとして「OutOfMemoryError: PermGen space」がなぜ出るのか? これが出るのは開発中? それとも本番運用中? これが開発中に起きたのであれば、例えばそれがEclipse+WDT+Tomcatなのであれば仕様だ。 WDTのTomcatは、メソッドをちょこっと変えた時にWebアプリケーションごとデプロイし直す。その時に古いWebアプリの定義が上手に解放されずにちょっとずつリークするのでTomcatでデバッグしたままちょこちょこソースを直しているとあっというまにPermGenだ。 本番環境の場合は、そのコンテナを動かしたまま(TomcatならTomcat Managerなどを用いて)Webアプリのアンデプロイとデプロイを繰り返しているという事はないだろうか。この場合も同じ現象が起きる可能性がある。 > クラスがロードされるのはTomcatを起動したときなのでアプリ使用中に上記エラーは出ないと思っています。 これは、文脈によっては誤りだ。 S2JDBCを使っていて、かつTomcatを起動した時にSeasar2を初期化しているのであれば、S2の初期化時にJDBCのクラスもロードされるので「Tomcat起動時にクラスがロードされる」と言えるが、基本的にクラスのロードはクラスが最初に呼ばれた時に実行される。WEB-INF/libの中のjarがTomcat起動時に全部一気にメモリに読み込まれるわけではない。なので、Tomcatが起動してから半年後にPermGenが出るなんて事も当然起こりうる。 本番環境であり、かつ特に何もしていないのにある日突然PermGenが起きる場合は、根本的にPermSizeが足りないのかも知れない。Tomcat起動時から数分間PermSizeを監視してみるといいだろう。
お礼
>WEB-INF/libの中のjarがTomcat起動時に全部一気にメモリに読み込まれるわけではない PermGenを監視してみたところ Tomcat起動時に既に上限値に近い状態で さらにアプリの使用を進めていく中でメモリ使用量が 増えてエラーが出たので上記に原因がありそうです。 ありがとうございました。
補足
ご回答ありがとうございます。 >これが出るのは開発中? それとも本番運用中? >本番環境の場合は、そのコンテナを動かしたまま(TomcatならTomcat Managerなどを用いて)Webアプリのアンデプロイとデプロイを繰り返しているという事はないだろうか。 本番環境(本番環境を想定したテスト環境)で出ました。 頻繁に修正したモジュールを都度warに固めて デプロイしているのですがtomcatを起動したままデプロイを 行っていた記憶があるのでそのせいかもしれません。 PermGenの監視も行ってみたいと思います。