Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.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 为什么新的GC只有很长的用户时间?_Java_Garbage Collection_Jvm - Fatal编程技术网

Java 为什么新的GC只有很长的用户时间?

Java 为什么新的GC只有很长的用户时间?,java,garbage-collection,jvm,Java,Garbage Collection,Jvm,我正在容器中运行Java应用程序(使用k8s),发现一个很长的STW gc: 2019-07-10T16:45:31.081+0800: 1620992.943: [GC (Allocation Failure) 2019-07-10T16:45:31.082+0800: 1620992.944: [ParNew: 1232340K->105476K(1258304K), 0.0558525 secs] 1412255K->290236K(4054528K), 0.0571538 s

我正在容器中运行Java应用程序(使用k8s),发现一个很长的STW gc:

2019-07-10T16:45:31.081+0800: 1620992.943: [GC (Allocation Failure) 2019-07-10T16:45:31.082+0800: 1620992.944: [ParNew: 1232340K->105476K(1258304K), 0.0558525 secs] 1412255K->290236K(4054528K), 0.0571538 secs] [Times: user=0.23 sys=0.20, real=0.06 secs] 
2019-07-10T16:46:08.906+0800: 1621030.767: [GC (Allocation Failure) 2019-07-10T16:46:08.907+0800: 1621030.768: [ParNew: 1224004K->97149K(1258304K), 5.4008859 secs] 1408764K->286575K(4054528K), 5.4022113 secs] [Times: user=37.65 sys=0.00, real=5.41 secs] 
2019-07-10T16:46:48.426+0800: 1621070.287: [GC (Allocation Failure) 2019-07-10T16:46:48.426+0800: 1621070.288: [ParNew: 1215677K->106022K(1258304K), 0.0545431 secs] 1405103K->300294K(4054528K), 0.0557196 secs] [Times: user=0.41 sys=0.00, real=0.06 secs]
第二个GC回收的内存量(1.1GB)与前一个和下一个GC几乎相同,但花费了大量时间(5.4秒)。这与新GC中非常高的用户时间有关

我在谷歌上搜索了一下,发现大多数博客和stackoverflow的答案都是关于大系统时间和实时的,这与我的问题无关

我的Java版本:

$ java -version
java version "1.8.0_102"
Java(TM) SE Runtime Environment (build 1.8.0_102-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.102-b14, mixed mode)
jstack的和GC线程是:

"Concurrent Mark-Sweep GC Thread" os_prio=0 tid=0x00007f3be809b000 nid=0xb5 runnable 
"Gang worker#0 (Parallel GC Threads)" os_prio=0 tid=0x00007f3be801d000 nid=0xab runnable 
"Gang worker#1 (Parallel GC Threads)" os_prio=0 tid=0x00007f3be801f000 nid=0xac runnable 
"Gang worker#2 (Parallel GC Threads)" os_prio=0 tid=0x00007f3be8020800 nid=0xad runnable 
"Gang worker#3 (Parallel GC Threads)" os_prio=0 tid=0x00007f3be8022800 nid=0xae runnable 
"Gang worker#4 (Parallel GC Threads)" os_prio=0 tid=0x00007f3be8024800 nid=0xaf runnable 
"Gang worker#5 (Parallel GC Threads)" os_prio=0 tid=0x00007f3be8026000 nid=0xb0 runnable 
"Gang worker#6 (Parallel GC Threads)" os_prio=0 tid=0x00007f3be8028000 nid=0xb1 runnable 
"Gang worker#7 (Parallel GC Threads)" os_prio=0 tid=0x00007f3be802a000 nid=0xb2 runnable 
"Surrogate Locker Thread (Concurrent GC)" #4 daemon prio=9 os_prio=0 tid=0x00007f3be812d800 nid=0xb9 waiting on condition [0x0000000000000000]
"Gang worker#0 (Parallel CMS Threads)" os_prio=0 tid=0x00007f3be8097000 nid=0xb3 runnable 
"Gang worker#1 (Parallel CMS Threads)" os_prio=0 tid=0x00007f3be8099000 nid=0xb4 runnable 

实时是墙时间,即实际经过的时间。用户时间是在用户空间中执行工作所花费的所有核心上聚合的CPU周期。由于您有8个并行GC线程,这意味着这5秒钟中的大部分时间都花在了大多数内核上进行收集工作

这本身并没有告诉我们为什么要花那么多时间。据我所知,要从ParNew中获取更多信息,没有什么可以做的,它是一个非常简单的收集器。您可以切换到G1,它提供更详细的日志

阿列克谢·拉戈津(Alexey Ragozin)有一份新时间支出明细表


您可能还希望监视系统的CPU/IO/Swap争用(例如,通过记录/proc/pressure/*以及当前linux内核中的时间戳,这可能会降低垃圾收集器的活动速度)。

1.8.0\u 102-b14
-您可能需要升级,这是一个3年前的版本。