Lah*_*ima 5 java garbage-collection catalina
我有一个在 tomcat 上运行的 Web 应用程序,其最大堆大小设置为 8GB。
如果没有用户登录应用程序,则不可清理的内存(垃圾回收后驻留的内存)会非常低,约为 1GB。在这种情况下,我看到内存持续增长约 4GB,然后垃圾收集器运行,内存再次下降到约 1GB。如果没有用户登录,此模式将继续。
GC 日志显示 Full GC 需要 11 秒,与需要约 1 秒的 Minor GC 相比,这是相当长的时间:
2017-02-14T15:30:44.553+0530: 591.922: [GC (Allocation Failure) [PSYoungGen: 1501051K->631966K(1833472K)] 2392189K->1523112K(3030016K), 1.5100144 secs]
...[Times: user=1.49 sys=0.01, real=1.51 secs]
2017-02-14T15:31:20.335+0530: 627.705: [GC (Allocation Failure) [PSYoungGen: 1553054K->595007K(1842176K)] 2444200K->1570521K(3038720K), 1.3050284 secs]
...[Times: user=1.27 sys=0.04, real=1.31 secs]
2017-02-14T15:33:33.682+0530: 761.052: [GC (Allocation Failure) [PSYoungGen: 1516095K->556800K(1842176K)] 2491609K->1596474K(3038720K), 1.6957154 secs]
...[Times: user=1.67 sys=0.03, real=1.69 secs]
2017-02-14T15:33:35.378+0530: 762.748: [Full GC (Ergonomics) [PSYoungGen: 556800K->365446K(1842176K)] [ParOldGen: 1039673K->1196476K(2018304K)] 1596474K->1561923K(3860480K), [Metaspace: 70472K->70472K(1114112K)], 11.2779843 secs]
...[Times: user=11.13 sys=0.09, real=11.28 secs]
2017-02-14T15:34:56.232+0530: 843.602: [GC (Allocation Failure) [PSYoungGen: 1286534K->216613K(1842176K)] 2483011K->1609875K(3860480K), 1.4938761 secs]
...[Times: user=1.45 sys=0.05, real=1.50 secs]
Run Code Online (Sandbox Code Playgroud)
由于所有其他线程在 GC 期间都会挂起,因此如果用户在 Full GC 期间尝试访问 Web 应用程序,服务器不会响应。是什么触发了这次 Full GC?
根据日志,Minor GC 事件是由于分配失败,而 Full GC 是由于Ergonomics. 这是什么意思?
还剩下大量可用堆空间,我想延迟 Full GC 的发生,直到没有由于 Minor GC 导致内存显着减少。在这种情况下我可以阻止 Full GC 的发生吗?
我的虚拟机参数如下:
export CATALINA_OPTS="$CATALINA_OPTS -Xms512m -Xmx8192m -XX:+UseConcMarkSweepGC"
Run Code Online (Sandbox Code Playgroud)
解决您的主要问题(由于垃圾收集花费过多时间而导致服务器停止),这可能是由于由于某种原因使用了错误的垃圾收集器。垃圾收集调整记录在此处。使用Garbage-First 收集器,您可以设置您仍然认为可以接受的任何暂停(默认为 200 毫秒,这对于服务器来说不应该是一个大问题)。