Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java垃圾收集器G1GC花费了很长时间';对象副本';(撤离暂停)_Java_Garbage Collection - Fatal编程技术网

Java垃圾收集器G1GC花费了很长时间';对象副本';(撤离暂停)

Java垃圾收集器G1GC花费了很长时间';对象副本';(撤离暂停),java,garbage-collection,Java,Garbage Collection,我不是Java新手,但我对垃圾收集知之甚少。现在我想用一些实际经验来改变这一点。我的目标是延迟不到0.3秒,或者在极端情况下0.5秒也可以 我有一个带有-Xmx50gb(-Xms50gb)的应用程序,并设置了以下其他GC选项: -XX:+UseG1GC -Xloggc:somewhere.gc.log -XX:+PrintGCDateStamps 但现在我偶尔会因为垃圾收集而长时间暂停5秒以上,尽管似乎有足够的可用内存。我发现的一个原因是: [GC pause (G1 Evacuation P

我不是Java新手,但我对垃圾收集知之甚少。现在我想用一些实际经验来改变这一点。我的目标是延迟不到0.3秒,或者在极端情况下0.5秒也可以

我有一个带有-Xmx50gb(-Xms50gb)的应用程序,并设置了以下其他GC选项:

-XX:+UseG1GC -Xloggc:somewhere.gc.log -XX:+PrintGCDateStamps
但现在我偶尔会因为垃圾收集而长时间暂停5秒以上,尽管似乎有足够的可用内存。我发现的一个原因是:

[GC pause (G1 Evacuation Pause) (young) 42G->40G(48G), 5.9409662 secs]
为什么GCG1仍在为此进行“阻止世界”?(或者至少我看到它正好在这个时候停止了我的应用程序)如果没有必要,它为什么要做这样的负面清理,因为有超过12%的可用RAM可用。我还认为
-XX:MaxGCPauseMillis
的默认值是200毫秒,为什么这个值会被29甚至50的因子所违反(见下文)

延误的另一个原因是:

[GC pause (Metadata GC Threshold) (young) (initial-mark) 40G->39G(48G), 10.4667233 secs]
这可能会得到解决,例如只需增加元数据空间
-XX:MetaspaceSize=100M

顺便说一句:使用JSE 1.8.0_91-b14

更新:此类事件的详细GC日志

2016-08-12T09:20:31.589+0200: 1178.312: [GC pause (G1 Evacuation Pause) (young) 1178.312: [G1Ergonomics (CSet Construction) start choosing CSet, _pending_cards: 3159, predicted base time: 1.52 ms, remaining time: 198.48 ms, target pause time: 200.00 ms]
 1178.312: [G1Ergonomics (CSet Construction) add young regions to CSet, eden: 136 regions, survivors: 20 regions, predicted young region time: 1924.75 ms]
 1178.312: [G1Ergonomics (CSet Construction) finish choosing CSet, eden: 136 regions, survivors: 20 regions, old: 0 regions, predicted pause time: 1926.27 ms, target pause time: 200.00 ms]
 1185.330: [G1Ergonomics (Heap Sizing) attempt heap expansion, reason: recent GC overhead higher than threshold after GC, recent GC overhead: 21.83 %, threshold: 10.00 %, uncommitted: 0 bytes, calculated expansion amount: 0 bytes (20.00 %)]
 1185.330: [G1Ergonomics (Concurrent Cycles) do not request concurrent cycle initiation, reason: still doing mixed collections, occupancy: 42580574208 bytes, allocation request: 0 bytes, threshold: 23592960000 bytes (45.00 %), source: end of GC]
 1185.330: [G1Ergonomics (Mixed GCs) do not start mixed GCs, reason: reclaimable percentage not over threshold, candidate old regions: 1 regions, reclaimable: 3381416 bytes (0.01 %), threshold: 5.00 %]
, 7.0181903 secs]
   [Parallel Time: 6991.8 ms, GC Workers: 10]
      [GC Worker Start (ms): Min: 1178312.6, Avg: 1178312.8, Max: 1178312.9, Diff: 0.2]
      [Ext Root Scanning (ms): Min: 1.1, Avg: 1.5, Max: 2.3, Diff: 1.2, Sum: 15.0]
      [Update RS (ms): Min: 0.0, Avg: 0.3, Max: 1.3, Diff: 1.3, Sum: 3.4]
         [Processed Buffers: Min: 0, Avg: 2.1, Max: 5, Diff: 5, Sum: 21]
      [Scan RS (ms): Min: 0.0, Avg: 0.0, Max: 0.1, Diff: 0.1, Sum: 0.4]
      [Code Root Scanning (ms): Min: 0.0, Avg: 0.2, Max: 0.4, Diff: 0.4, Sum: 1.7]
      [Object Copy (ms): Min: 6964.1, Avg: 6973.0, Max: 6989.5, Diff: 25.3, Sum: 69730.4]
      [Termination (ms): Min: 0.0, Avg: 16.4, Max: 25.3, Diff: 25.3, Sum: 164.4]
         [Termination Attempts: Min: 1, Avg: 3.2, Max: 13, Diff: 12, Sum: 32]
      [GC Worker Other (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.2]
      [GC Worker Total (ms): Min: 6991.5, Avg: 6991.6, Max: 6991.7, Diff: 0.2, Sum: 69915.5]
      [GC Worker End (ms): Min: 1185304.3, Avg: 1185304.3, Max: 1185304.3, Diff: 0.0]
   [Code Root Fixup: 0.1 ms]
   [Code Root Purge: 0.0 ms]
   [Clear CT: 0.3 ms]
   [Other: 26.0 ms]
      [Choose CSet: 0.0 ms]
      [Ref Proc: 25.3 ms]
      [Ref Enq: 0.1 ms]
 [Redirty Cards: 0.1 ms]
      [Humongous Register: 0.2 ms]
      [Humongous Reclaim: 0.0 ms]
      [Free CSet: 0.2 ms]
   [Eden: 2176.0M(2176.0M)->0.0B(2176.0M) Survivors: 320.0M->320.0M Heap: 40.6G(48.8G)->40.0G(48.8G)]
 [Times: user=0.55 sys=46.58, real=7.02 secs] 
阅读:复制(停止世界事件)-这些是停止世界暂停,以疏散或将活动对象复制到新的未使用区域。这可以通过记录为[GC pause(young)]的年轻一代区域完成。或记录为[GC暂停(混合)]的年轻和老一代区域

为什么GCG1仍在为此进行“阻止世界”

因为G1不是无暂停收集器,所以它只是一个低暂停收集器

我还认为-XX:MaxGCPauseMillis的默认值是200毫秒,为什么这个值会被29甚至50的因子所违反(见下文)

是的,但这只是一个目标,不是保证。很多事情都会导致它无法实现这一目标。你有一个相当大的堆,这使得事情更加困难,也就是说,失败更容易挑起

无论如何,GC调优之旅从通过启用详细GC日志开始

-Xloggc:<path to gc log file>
-XX:+PrintAdaptiveSizePolicy
-XX:+PrintGCDateStamps
-XX:+PrintGCTimeStamps
-XX:+PrintGCDetails

这意味着它在做一些主要由内存访问而不是系统调用组成的事情时,大部分时间都花在内核中。因此,交换活动可能是可疑的。

请注意,GC工作线程的数量是10。
如果系统CPU数量较少,将发生严重的资源争用,导致内存拷贝的时间消耗显著增加。

您是否阅读了官方文档?是的,当然。这些&您是否碰巧从应用程序显式调用了
System.gc()
?不,我没有显式调用gc()。在任何情况下,尝试
-XX:+DisableExplicitGC
都不会有什么坏处。关于PrintAdaptiveSizePolicy,它做了什么?我的意思是,文档只是说“打印有关自适应发电规模的信息”对不起,我的错:在对庞大的分配进行评论时,我忘了说这些分配是静态的,不需要分配,它们可能会进入老一代地区。但也许G1仍然有问题?好吧,测量而不是推测可能更有效率。感谢您将研究现在更详细的GC日志,如果这种情况再次发生在2周后,我不再看到与GC相关的超时-谢谢!仍然会看到类似的更大延迟(几秒钟)。。。无论如何,我接受了你的回答:)
 [Object Copy (ms): Min: 6964.1, Avg: 6973.0, Max: 6989.5, Diff: 25.3, Sum: 69730.4]
 [Times: user=0.55 sys=46.58, real=7.02 secs]