%20%E3%83%A1%E3%82%BF%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9%E3%81%AF%E7%B5%B6%E3%81%88%E3%81%9A%E5%A2%97%E5%8A%A0%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99.png)
運用環境に lucee (ColdFusion) サーバーがあります。
最初は OS のメモリ不足に遭遇しました。 を-Xmx2048m
使用可能なメモリの半分に減らし、 を設定しました-XX:MaxMetaspaceSize=1000m
。
しかし、しばらくすると、lucee の tomcat が OutOfMemory エラーを報告し、再起動が必要になりました。
メタスペースはヒープに加えてデフォルトで制限されていないため、メタスペースがいっぱいになっていることを示します。
次に、この仮定を検証するために定期的なものを追加しましたjcmd <pid> VM.metaspace
。朝は次のようになりました。
garbage-first heap total 1572864K, used 959885K [0x0000000080000000, 0x0000000100000000)
region size 1024K, 249 young (254976K), 18 survivors (18432K)
Metaspace used 99985K, capacity 102839K, committed 104996K, reserved 1114112K
class space used 7301K, capacity 8154K, committed 8320K, reserved 1015808K
そして夕方には:
garbage-first heap total 1616896K, used 556546K [0x0000000080000000, 0x0000000100000000)
region size 1024K, 25 young (25600K), 5 survivors (5120K)
Metaspace used 108125K, capacity 111035K, committed 113828K, reserved 1122304K
class space used 7509K, capacity 8463K, committed 8704K, reserved 1015808K
つまり、メタスペースは 1 日あたり約 8Mb ずつ増加しています。
JAXB にこの動作を引き起こす問題があることがわかったので、追加して回避策を試しましたが-Dcom.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize=true
、役に立たず、むしろ悪化したかもしれません。
一体何が私のメタスペースを埋め尽くしているのかをどうやって知ることができるのでしょうか?
答え1
これに対する解決策はまだ見つかっていませんが、これに関するオープンチケットがあります。現在、クラッシュを防ぐためにサーバーを定期的に再起動する必要があります。
参照してください
https://luceeserver.atlassian.net/browse/LDEV-2904
そして
https://dev.lucee.org/t/lucee-5-3-5-92-java-non-heap-memory-steadily-increases/6948/23