2016-10-16 3 views
7

Мы заметили, что сборка мусора обычно выполняется ежечасно.Почему GC работает каждый час?

Проверено время, затраченное на JreMemoryLeakPreventionListener. он установлен на Long.MAX_VALUE. хотя gc работает каждый час.

наблюдали также, что GC называется ежечасно является явным GC

GC журналы:

2016-10-15T23:23:09.341-0400: 165558.099: [GC (System.gc()) [PSYoungGen: 264601K->5865K(1357312K)] 389672K->130937K(4153856K), 0.0075210 secs] [Times: user=0.07 sys=0.00, real=0.00 secs] 
2016-10-15T23:23:09.349-0400: 165558.107: [Full GC (System.gc()) [PSYoungGen: 5865K->0K(1357312K)] [ParOldGen: 125071K->125178K(2796544K)] 130937K->125178K(4153856K) [PSPermGen: 72263K->72263K(131072K)], 0.3417940 secs] [Times: user=5.16 sys=0.04, real=0.35 secs] 
2016-10-16T00:23:09.692-0400: 169158.450: [GC (System.gc()) [PSYoungGen: 198858K->2600K(1354752K)] 324037K->127779K(4151296K), 0.0077680 secs] [Times: user=0.08 sys=0.01, real=0.01 secs] 
2016-10-16T00:23:09.700-0400: 169158.458: [Full GC (System.gc()) [PSYoungGen: 2600K->0K(1354752K)] [ParOldGen: 125178K->124436K(2796544K)] 127779K->124436K(4151296K) [PSPermGen: 72282K->72282K(131072K)], 0.3481690 secs] [Times: user=5.13 sys=0.03, real=0.35 secs] 
2016-10-16T01:23:10.050-0400: 172758.808: [GC (System.gc()) [PSYoungGen: 279139K->7990K(1361408K)] 403576K->132426K(4157952K), 0.0075860 secs] [Times: user=0.07 sys=0.00, real=0.01 secs] 
2016-10-16T01:23:10.058-0400: 172758.815: [Full GC (System.gc()) [PSYoungGen: 7990K->0K(1361408K)] [ParOldGen: 124436K->124383K(2796544K)] 132426K->124383K(4157952K) [PSPermGen: 72284K->72284K(131072K)], 0.3713300 secs] [Times: user=5.73 sys=0.04, real=0.37 secs] 
2016-10-16T02:23:10.430-0400: 176359.188: [GC (System.gc()) [PSYoungGen: 112842K->544K(1358848K)] 237225K->124927K(4155392K), 0.0167260 secs] [Times: user=0.05 sys=0.00, real=0.02 secs] 
2016-10-16T02:23:10.447-0400: 176359.205: [Full GC (System.gc()) [PSYoungGen: 544K->0K(1358848K)] [ParOldGen: 124383K->124265K(2796544K)] 124927K->124265K(4155392K) [PSPermGen: 72292K->72292K(131072K)], 0.2931430 secs] [Times: user=3.21 sys=0.03, real=0.29 secs] 
2016-10-16T03:23:10.742-0400: 179959.500: [GC (System.gc()) [PSYoungGen: 117926K->768K(1363968K)] 242192K->125033K(4160512K), 0.0070720 secs] [Times: user=0.06 sys=0.00, real=0.01 secs] 
2016-10-16T03:23:10.749-0400: 179959.507: [Full GC (System.gc()) [PSYoungGen: 768K->0K(1363968K)] [ParOldGen: 124265K->124263K(2796544K)] 125033K->124263K(4160512K) [PSPermGen: 72306K->72306K(131072K)], 0.2602180 secs] [Times: user=3.33 sys=0.02, real=0.26 secs] 
2016-10-16T04:23:11.011-0400: 183559.768: [GC (System.gc()) [PSYoungGen: 198248K->2356K(1362432K)] 322511K->126619K(4158976K), 0.0076610 secs] [Times: user=0.07 sys=0.00, real=0.01 secs] 
2016-10-16T04:23:11.018-0400: 183559.776: [Full GC (System.gc()) [PSYoungGen: 2356K->0K(1362432K)] [ParOldGen: 124263K->124978K(2796544K)] 126619K->124978K(4158976K) [PSPermGen: 72308K->72308K(131072K)], 0.3353340 secs] [Times: user=5.78 sys=0.04, real=0.33 secs] 
2016-10-16T05:23:11.355-0400: 187160.113: [GC (System.gc()) [PSYoungGen: 228778K->10333K(1367040K)] 353757K->135311K(4163584K), 0.0069470 secs] [Times: user=0.08 sys=0.00, real=0.00 secs] 
2016-10-16T05:23:11.362-0400: 187160.120: [Full GC (System.gc()) [PSYoungGen: 10333K->0K(1367040K)] [ParOldGen: 124978K->130352K(2796544K)] 135311K->130352K(4163584K) [PSPermGen: 72308K->72308K(131072K)], 0.2240270 secs] [Times: user=2.96 sys=0.02, real=0.23 secs] 


Tomcat версии: Apache Tomcat/8.0.24

# /opt/tomcat/bin/version.sh 
Using CATALINA_BASE: /opt/tomcat 
Using CATALINA_HOME: /opt/tomcat 
Using CATALINA_TMPDIR: /opt/tomcat/temp 
Using JRE_HOME:  /usr 
Using CLASSPATH:  /opt/hbase/conf:/opt/tomcat/bin/bootstrap.jar:/opt/tomcat/bin/tomcat-juli.jar 
Server version: Apache Tomcat/8.0.24 
Server built: Jul 1 2015 20:19:55 UTC 
Server number: 8.0.24.0 
OS Name:  Linux 
OS Version:  2.6.32-573.3.1.el6.x86_64 
Architecture: amd64 
JVM Version: 1.7.0_79-b15 
JVM Vendor:  Oracle Corporation 

Почему GC работает на почасовой основе, хотя куча не заполнена?

+0

ваш журнал GC не очень читаемым. – dit

+0

Является ли ваш код приложения явно вызывающим System.gc()? Похоже на то, что Full GC запускается 23-й минуте каждого часа. – Mahesh

+0

№ System.gc() не используется в коде приложения – Mohan

ответ

6

Я подозреваю, что это дубликат, но не могу найти его.

Период по умолчанию для DGC (распределенный GC) составляет 1 час. Это выполняется регулярно, чтобы очистить распределенные ресурсы RMI, такие как JMX.

Вы можете удлинить цикл до недели.

https://docs.oracle.com/javase/8/docs/technotes/guides/rmi/sunrmiproperties.html

см

sun.rmi.dgc.server.gcInterval

Когда необходимо гарантировать, что недостижимые удаленные объекты неэкспортируемыми и мусора своевременно, то значение этого свойства представляет собой максимальный интервал (в миллисекундах), который позволяет время выполнения Java RMI между сборками мусора локальной кучи. Значение по умолчанию - 3600000 миллисекунд (один час).

и

sun.rmi.dgc.client.gcInterval

Когда необходимо обеспечить, чтобы DGC чистые вызовы для недостижимых удаленных ссылок доставляются своевременно, значение это свойство представляет собой максимальный интервал (в миллисекундах), который позволит время выполнения Java RMI между сборками мусора локальной кучи. Значение по умолчанию - 3600000 миллисекунд (один час).

Оба они должны быть установлены в большом количестве (я поставил его на неделю)

+0

Этот каждый час GC не происходит регулярно. – Mohan

+0

иногда это не происходит на почасовой основе – Mohan

+0

@Mohan В этом случае он работает, потому что на самом деле это необходимо или Система.gc() был вызван, возможно, библиотекой. –