Windows の Eclipse で pmd を使用すると、深刻なメモリ リークが発生します。私はたくさんの大きなMavenプロジェクトをインポートしています。m2e とコンパイル後、PMD が起動します。その後、ワークスペース内の多くの (約 50 の) プロジェクトに対して、約 8 から 10 の eclipse ジョブ インスタンスが並行して実行されます。その後、マシンの仮想メモリが使い果たされ (約 12 GB 程度)、PC が完全にフリーズするまで、プロセス サイズは無限に大きくなります。
eclipse.ini の私のメモリ設定:
-Xms256m
-Xmx2G
-Xss2m
-Xverify:none
-XX:+UseG1GC
-XX:+UseStringDeduplication
-XX:MaxMetaspaceSize=1G
ここでの 2 GB のヒープ サイズ制限は、あまり効果がないようです。その場合、割り当てられた vm メモリは Java ヒープではなく、クラスローダー メタスペースまたはネイティブ dll からのものであると思われます。
私のマシンには 32 GB の RAM があります。Java 1.8.0_121 を使用。
プロセスが危険なほど大きくなり、強制終了する必要がある直前の vmmap スナップショットを次に示します。
プロセスに対して実行してみjcmd PID GC.class_stats
ましたが、合計バイト数が約 1.4 GB しかないため、ここでは問題は見られません。
1636:
Index Super InstBytes KlassBytes annotations CpAll MethodCount Bytecodes MethodAll ROAll RWAll Total ClassName
1 89 141004480 560 0 1296 7 149 2176 880 3464 4344 java.util.HashMap$Node
2 -1 131125856 480 0 0 0 0 0 24 584 608 [I
3 89 129135744 624 0 8712 94 4623 58024 12136 56304 68440 java.lang.String
4 -1 111470376 480 0 0 0 0 0 24 584 608 [B
5 -1 94462520 480 0 0 0 0 0 24 584 608 [C
6 -1 55019976 480 0 0 0 0 0 32 584 616 [Ljava.util.HashMap$Node;
7 -1 53828832 480 0 0 0 0 0 24 584 608 [Ljava.lang.Object;
8 89 51354560 504 0 9016 42 2757 23352 6976 26704 33680 java.net.URL
9 89 48028392 504 0 544 1 20 496 216 1520 1736 java.util.LinkedList$Node
10 28783 40910880 1000 0 6864 51 3951 35648 8664 35792 44456 java.util.HashMap
...snip...
48234 48225 0 608 0 288 2 10 288 160 1152 1312 sun.util.resources.en.CalendarData_en
48235 48225 0 608 0 360 2 27 304 200 1200 1400 sun.util.resources.en.CurrencyNames_en_US
48236 48225 0 608 0 288 2 10 288 160 1152 1312 sun.util.resources.en.LocaleNames_en
48237 48229 0 608 0 288 2 10 304 176 1152 1328 sun.util.resources.en.TimeZoneNames_en
48238 29013 0 520 0 272 2 5 592 160 1352 1512 sun.util.spi.CalendarProvider
48239 89 0 512 0 336 3 5 440 240 1184 1424 sun.util.spi.XmlPropertiesProvider
48240 89 0 560 0 440 5 16 760 488 1504 1992 sun.util.xml.PlatformXmlPropertiesProvider$EH
48241 89 0 528 0 1040 3 71 520 464 1840 2304 sun.util.xml.PlatformXmlPropertiesProvider$Resolver
48242 89 0 552 0 520 3 19 512 456 1392 1848 uescape.view.UnicodeEscapeView$1
48243 89 0 552 0 520 3 19 512 456 1392 1848 uescape.view.UnicodeEscapeView$2
1374367440 32457872 432408 90295960 502480 22001616 144854704 85034192 198366896 283401088 Total
485.0% 11.5% 0.2% 31.9% - 7.8% 51.1% 30.0% 70.0% 100.0%
Index Super InstBytes KlassBytes annotations CpAll MethodCount Bytecodes MethodAll ROAll RWAll Total ClassName
Windows でネイティブ プロセスをプロファイリングした経験はあまりありません。非常に多くのメモリを際限なく割り当てているものを特定するにはどうすればよいですか?