首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么G1不释放内存?

为什么G1不释放内存?
EN

Stack Overflow用户
提问于 2021-03-04 09:17:16
回答 1查看 118关注 0票数 0

我有一个java 11应用程序运行在一个带有以下标志的docker容器中:

代码语言:javascript
复制
-XX:CICompilerCount=12
-XX:ConcGCThreads=3
-XX:+FlightRecorder
-XX:G1ConcRefinementThreads=13
-XX:G1HeapRegionSize=4194304
-XX:GCDrainStackTargetSize=64
-XX:InitialHeapSize=1052770304
-XX:MarkStackSize=4194304
-XX:MaxHeapSize=16823353344
-XX:MaxNewSize=10091495424
-XX:MinHeapDeltaBytes=4194304
-XX:NonNMethodCodeHeapSize=7594288
-XX:NonProfiledCodeHeapSize=122031976
-XX:ProfiledCodeHeapSize=122031976
-XX:ReservedCodeCacheSize=251658240
-XX:+SegmentedCodeCache
-XX:+UseCompressedClassPointers
-XX:+UseCompressedOops
-XX:+UseFastUnorderedTimeStamps
-XX:+UseG1GC

所发生的情况是,在加载下,docker stats显示的内存使用量非常高(7Gb)。这已经很奇怪了,因为尽管我创建了许多对象,但它们应该是动态收集的,因为对象彼此之间没有链接,而且我没有保留对这些对象的任何引用(我只是在迭代器上迭代)。无论如何,当加载停止时,所有这些对象都应该被垃圾收集,但我看到的是,报告的内存使用情况保持不变(7Gb)。只有在运行jcmd 1 GC.run时,才会看到内存使用量下降到大约1Gb。

我怀疑GC可能出于某种原因无法运行,因此我使用-Xlog:gc打开了GC日志,但事实证明它正在按预期运行:

代码语言:javascript
复制
[236.335s][info][gc] GC(14) Concurrent Cycle
[236.352s][info][gc] GC(15) Pause Young (Normal) (G1 Evacuation Pause) 84M->81M(124M) 4.344ms
[236.361s][info][gc] GC(16) Pause Young (Normal) (G1 Evacuation Pause) 85M->84M(124M) 2.911ms
[236.370s][info][gc] GC(17) Pause Young (Normal) (G1 Evacuation Pause) 88M->87M(124M) 2.207ms
[236.380s][info][gc] GC(18) Pause Young (Normal) (G1 Evacuation Pause) 91M->89M(124M) 2.192ms
[236.390s][info][gc] GC(19) Pause Young (Normal) (G1 Evacuation Pause) 93M->92M(124M) 2.139ms
[236.400s][info][gc] GC(20) Pause Young (Normal) (G1 Evacuation Pause) 96M->94M(124M) 2.191ms
[236.409s][info][gc] GC(21) Pause Young (Normal) (G1 Evacuation Pause) 98M->96M(124M) 2.132ms
[236.418s][info][gc] GC(22) Pause Young (Normal) (G1 Evacuation Pause) 100M->99M(124M) 2.139ms
[236.426s][info][gc] GC(23) Pause Young (Normal) (G1 Evacuation Pause) 103M->101M(124M) 2.121ms
[236.435s][info][gc] GC(24) Pause Young (Normal) (G1 Evacuation Pause) 105M->104M(124M) 2.075ms
[236.441s][info][gc] GC(14) Pause Remark 106M->106M(124M) 3.191ms
[236.447s][info][gc] GC(25) Pause Young (Normal) (G1 Evacuation Pause) 108M->106M(124M) 2.184ms
[236.456s][info][gc] GC(26) Pause Young (Normal) (G1 Evacuation Pause) 110M->108M(568M) 3.698ms
[236.491s][info][gc] GC(14) Pause Cleanup 122M->122M(568M) 0.141ms
[236.493s][info][gc] GC(14) Concurrent Cycle 157.955ms
[236.827s][info][gc] GC(27) Pause Young (Normal) (G1 Evacuation Pause) 260M->141M(568M) 19.249ms
[237.196s][info][gc] GC(28) Pause Young (Normal) (G1 Evacuation Pause) 289M->142M(568M) 19.387ms
[237.441s][info][gc] GC(29) Pause Young (Normal) (G1 Evacuation Pause) 302M->144M(568M) 12.322ms
[237.531s][info][gc] GC(30) Pause Young (Normal) (G1 Evacuation Pause) 192M->143M(1704M) 14.226ms
[238.441s][info][gc] GC(31) Pause Young (Normal) (G1 Evacuation Pause) 699M->157M(1704M) 23.429ms
[238.763s][info][gc] GC(32) Pause Young (Normal) (G1 Evacuation Pause) 241M->197M(1704M) 44.961ms
[239.907s][info][gc] GC(33) Pause Young (Normal) (G1 Evacuation Pause) 1201M->274M(1704M) 57.209ms
[240.671s][info][gc] GC(34) Pause Young (Normal) (G1 Evacuation Pause) 1198M->344M(3596M) 88.736ms
[error] ErrorHandler - An error occurred (404): 
[241.836s][info][gc] GC(35) Pause Young (Normal) (G1 Evacuation Pause) 1360M->434M(3596M) 91.769ms
[242.729s][info][gc] GC(36) Pause Young (Normal) (G1 Evacuation Pause) 1518M->490M(3596M) 95.333ms
[243.834s][info][gc] GC(37) Pause Young (Normal) (G1 Evacuation Pause) 1594M->481M(3596M) 51.726ms
[245.636s][info][gc] GC(38) Pause Young (Normal) (G1 Evacuation Pause) 2545M->490M(6108M) 46.050ms
[249.053s][info][gc] GC(39) Pause Young (Normal) (G1 Evacuation Pause) 4054M->500M(6108M) 46.525ms
[251.903s][info][gc] GC(40) Pause Young (Normal) (G1 Evacuation Pause) 4052M->498M(6108M) 41.389ms
[254.797s][info][gc] GC(41) Pause Young (Normal) (G1 Evacuation Pause) 4054M->495M(6108M) 44.757ms
[257.506s][info][gc] GC(42) Pause Young (Normal) (G1 Evacuation Pause) 4051M->484M(6108M) 35.766ms
[260.329s][info][gc] GC(43) Pause Young (Normal) (G1 Evacuation Pause) 4052M->487M(6108M) 34.923ms
[263.337s][info][gc] GC(44) Pause Young (Normal) (G1 Evacuation Pause) 4051M->472M(6108M) 30.865ms
[266.368s][info][gc] GC(45) Pause Young (Normal) (G1 Evacuation Pause) 4052M->481M(6108M) 35.517ms
[269.631s][info][gc] GC(46) Pause Young (Normal) (G1 Evacuation Pause) 4053M->491M(6108M) 39.524ms
[272.931s][info][gc] GC(47) Pause Young (Normal) (G1 Evacuation Pause) 4051M->484M(6108M) 37.010ms
[info] c.HomeController - Redirecting to swagger generated API
[276.067s][info][gc] GC(48) Pause Young (Normal) (G1 Evacuation Pause) 4052M->485M(6108M) 38.312ms
[279.409s][info][gc] GC(49) Pause Young (Normal) (G1 Evacuation Pause) 4053M->479M(6108M) 33.003ms
[308.226s][info][gc] GC(50) Pause Full (Diagnostic Command) 1220M->51M(256M) 652.015ms

所以问题是为什么内存使用量没有下降,因为它看起来像G1看起来像预期的那样释放内存。为什么jcmd 1 GC.run能有效地释放内存??

编辑

我试过用CMS GC代替(-XX:+UseConcMarkSweepGC)和.完全没有记忆问题!内存按预期动态释放(最大使用量1.5Gb)。所以我现在假设问题是G1不是我的应用程序使用7Gb,而是G1本身是罪魁祸首(使用6Gb)。但为什么?

EN

回答 1

Stack Overflow用户

发布于 2021-03-04 11:13:36

正如霍格所解释的:由于我将堆大小限制在16 G1,所以G1可以在这个限制范围内自由地使用它想要的内存。将Xmx设置为4Gb,我可以看到G1正在设法保持在4GB以下,这意味着没有内存问题!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66471971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档