-->

Java的G1 GC处理参考对象缓慢作品(Java G1 GC Processing Referen

2019-07-31 13:59发布

我已经打的Java背道而驰。 它的工作原理24小时,命中通过以每秒大约100次。 白天GC处理时间慢慢的从20-60毫秒至10000-60000毫秒上升,然后下降到20-60毫秒。 这种模式被重复不时。 从GC日志我发现,大部分的时间都花在GC处理参考对象(参考PROC)。 那么什么是如此长的时间GC的原因可能是?

Server: Amazon EC2 m1.small
OS: Ubuntu 10.04.3 LTS
Java: Oracle 1.7.0_07

GC日志的例子:

2012-09-13T16:51:20.091+0400: 167239.936: [GC pause (young), 62.58395400 secs]
...
[Other: 62489.7 ms]
    [Choose CSet:   0.0 ms]
    [Ref Proc: 62433.9 ms]
    [Ref Enq:   0.0 ms]
    [Free CSet:   0.7 ms]
[Eden: 200M(200M)->0B(199M) Survivors: 4096K->5120K Heap: 578M(1024M)->380M(1024M)]

时间 - “参考PROC”图:

09:37:59 - 242.4 ms
09:38:50 - 226.0 ms
09:39:00 - 83.6 ms
...
11:45:22 - 451.8 ms
11:46:04 - 489.3 ms
11:46:46 - 505.6 ms
...
14:05:40 - 1027.3 ms
14:06:01 - 796.6 ms
14:06:35 - 1064.0 ms
...
15:44:32 - 1920.4 ms
15:45:04 - 2116.7 ms
15:45:39 - 2196.8 ms
...
16:19:07 - 3983.3 ms
16:19:43 - 4494.9 ms
16:20:16 - 4065.2 ms
...
16:33:11 - 7690.1 ms
16:33:50 - 8501.4 ms
16:34:28 - 8059.3 ms
...
16:47:14 - 51378.6 ms
16:49:11 - 57529.2 ms
16:51:20 - 62433.9 ms
16:53:00 - 46.1 ms
16:53:30 - 45.5 ms
16:54:03 - 45.0 ms
...
16:54:38 - 57.0 ms
16:55:09 - 20.9 ms
16:55:43 - 21.3 ms
...
16:09:45 - 134.3 ms
16:10:21 - 142.1 ms
16:10:58 - 147.5 ms
...
17:18:51 - 177.3 ms
17:19:27 - 135.8 ms
17:20:03 - 179.6 ms

我在Java源代码的参数PrintReferenceGC发现。 GC日志显示未来

[SoftReference, 0 refs, 0.0000050 secs]
[WeakReference, 6 refs, 0.0000030 secs]
[FinalReference, 113 refs, 0.0011180 secs]
[PhantomReference, 0 refs, 0.0000020 secs]
[JNI Weak Reference, 3.9010450 secs]

这是JNI弱引用的一些问题。

Answer 1:

它的重要的是我所有的运行都与Yourkit探查。 我安装OpenJDK7的fastdebug版本。 在这个版本中有一个参数-XX:+ TraceReferenceGC。 使用此参数GC日志运行后显示约5000有些终结。 这个问题通过关掉Yourkit的插座探头解决。



Answer 2:

作为第一个步骤中,您可以使用VisualVM的或任何工具来分析你的堆的使用模式。 您可能必须通过优化代码的解决方案,通过检查对象创建的热点,这应该是一个您永久的解决方案。

如果这是不可能的,你必须找到最佳的堆大小和GC算法相适应您的应用程序的行为。 这将是一个试错法。 您将definitly不得不通过调整文档 。 你现在要做的调整可能会再次成为低效后,当您的应用程序行为的变化或负载模式的变化。

尝试并找到合适的收集你。 你会像调整一些参数

    -XX:+UseConcMarkSweepGC        
    -XX:SurvivorRatio=10 
    -XX:TargetSurvivorRatio=90 
    -XX:MaxTenuringThreshold=30

通过试验和错误。



文章来源: Java G1 GC Processing Reference objects works slow