2016-10-16 2 views
7

전체 가비지 수집 (GC)은 종종 시간 단위로 수행되는 것을 관찰했습니다.매 시간마다 GC가 실행되는 이유는 무엇입니까?

JreMemoryLeakPreventionListener의 시간을 확인했습니다. Long.MAX_VALUE로 설정됩니다. gc가 1 시간마다 실행됩니다.

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] 


톰캣 버전 : 아파치 톰캣/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가 명시 적 GC입니다

GC 로그 관찰

힙이 가득 차 있지 않은데도 GC가 매시간 실행되는 이유는 무엇입니까?

+0

당신의 GC 로그가 정말 읽을 수 없습니다로 설정해야합니다. – dit

+0

응용 프로그램 코드가 명시 적으로 System.gc()를 호출합니까? 전체 GC가 매시간 23 분에 트리거되기 때문에 그 것처럼 보입니다. – Mahesh

+0

아니요. 응용 프로그램 코드 – Mohan

답변

6

이 사본은 중복되었지만 찾을 수 없습니다.

DGC (분산 GC)의 기본 기간은 1 시간입니다. 이것은 정기적으로 실행되어 JMX와 같은 분산 된 RMI 자원을 정리합니다.

주기를 1 주일로 늘릴 수 있습니다. 그 도달 할 수없는 원격 객체가 안 export하고 적시에 수집 된 쓰레기입니다 보장하기 위해 필요한 경우

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

sun.rmi.dgc.server.gcInterval에게

참조 이 프로퍼티의 값은, Java RMI 런타임이 로컬 힙의 가베지 컬렉션간에 허가하는 최대의 간격 (밀리 세컨드 단위)을 나타냅니다. 기본값은 3600000 밀리 초 (1 시간)입니다.

sun.rmi.dgc.client.gcInterval

는 도달 할 수없는 원격 참조에 대한 DGC 깨끗한 통화가 적시에 값을 전달하고 있는지 확인하는 것이 필요하다 이 속성은 Java RMI 런타임이 로컬 힙의 가비지 수집 사이에 허용 할 최대 간격 (밀리 초)을 나타냅니다. 기본값은 3600000 밀리 초 (1 시간)입니다. 이들의

모두 높은 숫자 (I 주일로 설정)

+0

1 시간마다 GC가 정기적으로 발생하지 않습니다. – Mohan

+0

가끔씩 시간당 기준으로 발생하지 않습니다. – Mohan

+0

@ 모한이 경우 실제로 또는 시스템이 필요하기 때문에 실행 중입니다.라이브러리에 의해 gc()가 호출되었습니다. –