【问题标题】:Does the parallel garbage collector runs on a separate thread alongside the main program并行垃圾收集器是否在主程序旁边的单独线程上运行
【发布时间】:2018-12-15 14:47:56
【问题描述】:

我使用的是 JKD8,正如我在下面的命令中看到的那样,JVM 默认使用并行垃圾收集器。如何观察垃圾是否在主程序旁边的单独线程上运行?有没有类似 -XX:-PrintGCDetails 选项的参数?

顺便说一句,我正在使用 Visual VM,我也可以从那里观察它吗?例如在 ->“线程”选项卡部分,因为我找不到它。

java -XX:+PrintCommandLineFlags  -XX:-PrintGCDetails -version
-XX:InitialHeapSize=535233856 -XX:MaxHeapSize=8563741696 -XX:+PrintCommandLineFlags -XX:-PrintGCDetails -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
java version "1.8.0_161"
Java(TM) SE Runtime Environment (build 1.8.0_161-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.161-b12, mixed mode)

【问题讨论】:

  • 你可以试试-XX:+PrintGCApplicationConcurrentTime
  • @Evgeniy Dorofeev 我正在尝试,但我认为我无法通过这种方式看到单独的线程
  • 你也可以试试-XX:+UseConcMarkSweepGC。这个 GC 应该同时运行
  • 在某些方面您的问题是基于误解。并行收集器不是并发收集器。当收集器正在运行时,您的所有应用程序线程都会停止,因此您的问题没有任何意义。如果您使用的是并发收集器(Concurrent MarkSweep 收集器或 G1 收集器),那么您可以观察 GC 线程的工作情况。

标签: java performance garbage-collection visualvm


【解决方案1】:

垃圾收集器在单独的线程中运行。您可以在线程转储中观察到这一点:

...

"VM Thread" os_prio=0 tid=0x00007f4fec078000 nid=0x74c9 runnable 

"GC task thread#0 (ParallelGC)" os_prio=0 tid=0x00007f4fec01f800 nid=0x74c5 runnable 

"GC task thread#1 (ParallelGC)" os_prio=0 tid=0x00007f4fec021800 nid=0x74c6 runnable 

"GC task thread#2 (ParallelGC)" os_prio=0 tid=0x00007f4fec023000 nid=0x74c7 runnable 

"GC task thread#3 (ParallelGC)" os_prio=0 tid=0x00007f4fec025000 nid=0x74c8 runnable 

...

您可以通过向进程发送SIGQUIT(3) 来生成线程转储:

kill -SIGQUIT <pid>

请参阅 RedHat:https://access.redhat.com/solutions/18178

【讨论】:

    猜你喜欢
    • 2023-04-04
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-28
    • 1970-01-01
    • 2021-07-02
    相关资源
    最近更新 更多