Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.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主要和次要垃圾收集_Java_Garbage Collection - Fatal编程技术网

Java主要和次要垃圾收集

Java主要和次要垃圾收集,java,garbage-collection,Java,Garbage Collection,我一直在阅读Java中的垃圾收集和问答,但我对垃圾收集的类型感到困惑 让我们以吞吐量收集器为例。(也称为并行收集器)。文档说它使用多个线程来执行次要收集,而主要收集使用单线程(与串行收集器相同) 现在我的问题是: 完整的GC意味着什么:a)它意味着次要和主要的收集都完成了吗?或b)完整GC==主要集合?是哪一个 如果a),是否意味着次要收集仍然使用多个线程完成,而主要收集使用单个线程完成 如果是b),这是否意味着年轻人和老年人都使用单线程清除 而且, 4.完全GC是否也只影响老一代或年轻一代 提

我一直在阅读Java中的垃圾收集和问答,但我对垃圾收集的类型感到困惑

让我们以吞吐量收集器为例。(也称为并行收集器)。文档说它使用多个线程来执行次要收集,而主要收集使用单线程(与串行收集器相同)

现在我的问题是:

  • 完整的GC意味着什么:a)它意味着次要和主要的收集都完成了吗?或b)完整GC==主要集合?是哪一个
  • 如果a),是否意味着次要收集仍然使用多个线程完成,而主要收集使用单个线程完成
  • 如果是b),这是否意味着年轻人和老年人都使用单线程清除
  • 而且, 4.完全GC是否也只影响老一代或年轻一代

    提前谢谢。

    让我解释一下

    让我们以吞吐量收集器为例。(也称为并行收集器)。文档说它使用多个线程来完成次要收集,使用单个线程来完成主要收集(与串行收集器相同)

    这里有一些需要理解的东西。默认情况下,在大多数较新的系统上,JVM为年轻一代和老一代使用两种不同的垃圾收集器。在我的机器上:我为年轻一代配备了并行新收集器,为老一代配备了并行标记和扫描收集器

    当JVM无法为新对象分配空间时(请记住:新对象总是在年轻一代的伊甸园区域分配),就会触发小集合

    下一个问题:

    完整的GC意味着什么:a)它意味着次要和主要的收集都完成了吗?或b)完整GC==主要集合?是哪一个

    以及

    还有,4。完全GC是否也只影响老一代或年轻一代

    视情况而定。JVM将每个主要集合报告为完整GC。[尝试使用这些标志
    java-verbose:gc-XX:+PrintGCDetails-XX:+PrintGCTimeStamp
    ]。学究式的定义是,完整GC首先运行Minor,然后运行Major(尽管如果较老的一代已满,则可以切换顺序,在这种情况下,首先释放它以允许它接收来自年轻一代的对象)

    好的,回到正题。JVM将[旧一代(或Perm)中的]主要集合视为完整GC。下面是我能够快速编写的一个程序的输出,以说明这一点。第一行是次要GC,第二行是主要(完整)GC。您可以看到,这只发生在老一代(CMS)中,并且能够将老一代从1082K减少到1034K

    • 11.431:[GC 11.431:[ParNew:1152K->128K(1152K),0.0009893秒]2111K->1210K(6464K),0.0010182秒][次:user=0.00 sys=0.00,real=0.00秒]
    • 17.882:[Full-GC(System)17.882:[CMS:1082K->1034K(5312K),0.0212614秒]2034K->1034K(6464K),[CMS-Perm:9426K->9410K(21248K)],0.021320秒][次:用户=0.02系统=0.00,实数=0.02秒]
    下一个问题:

    如果a),是否意味着次要收集仍然使用多个线程完成,而主要收集使用单个线程完成

    对。请看我答案的开头。年轻人和老年人都有不同的收藏家。对于年轻一代,您可以使用以下任一选项:

    • -XX:+UseSerialGC
    • -XX:+UseParallelGC
    • -XX:+UseParNewGC
    对于老一代,可用的选择有:

    • -XX:+UseParallelOldGC
    • -XX:+UseConMarkSweepGC
    • 让我解释一下

      让我们以吞吐量收集器为例。(也称为并行收集器)。文档说它使用多个线程来完成次要收集,使用单个线程来完成主要收集(与串行收集器相同)

      这里有一些需要理解的东西。默认情况下,在大多数较新的系统上,JVM为年轻一代和老一代使用两种不同的垃圾收集器。在我的机器上:我为年轻一代配备了并行新收集器,为老一代配备了并行标记和扫描收集器

      当JVM无法为新对象分配空间时(请记住:新对象总是在年轻一代的伊甸园区域分配),就会触发小集合

      下一个问题:

      完整的GC意味着什么:a)它意味着次要和主要的收集都完成了吗?或b)完整GC==主要集合?是哪一个

      以及

      还有,4。完全GC是否也只影响老一代或年轻一代

      视情况而定。JVM将每个主要集合报告为完整GC。[尝试使用这些标志
      java-verbose:gc-XX:+PrintGCDetails-XX:+PrintGCTimeStamp
      ]。学究式的定义是,完整GC首先运行Minor,然后运行Major(尽管如果较老的一代已满,则可以切换顺序,在这种情况下,首先释放它以允许它接收来自年轻一代的对象)

      好的,回到正题。JVM将[旧一代(或Perm)中的]主要集合视为完整GC。下面是我能够快速编写的一个程序的输出,以说明这一点。第一行是次要GC,第二行是主要(完整)GC。您可以看到,这只发生在老一代(CMS)中,并且能够将老一代从1082K减少到1034K

      • 11.431:[GC 11.431:[ParNew:1152K->128K(1152K),0.0009893秒]2111K->1210K(6464K),0.0010182秒][次:user=0.00 sys=0.00,real=0.00秒]
      • 17.882:[Full-GC(System)17.882:[CMS:1082K->1034K(5312K),0.0212614秒]2034K->1034K(6464K),[CMS-Perm:9426K->9410K(21248K)],0.021320秒][次:用户=0.02系统=0.00,实数=0.02秒]
      下一个问题:

      如果a),这是否意味着次要收集仍然使用多个线程完成