Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.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_Logging_Garbage Collection - Fatal编程技术网

Java垃圾收集日志消息

Java垃圾收集日志消息,java,logging,garbage-collection,Java,Logging,Garbage Collection,我已将java配置为将垃圾收集信息转储到日志()。我不确定日志中的垃圾收集条目是什么意思。下面是这些条目的示例。我到处寻找,没有找到可靠的解释 我有一些合理的猜测,但我正在寻找答案,这些答案提供了条目中数字的严格定义,并得到可靠来源的支持。引用sun文档的所有答案自动+1。我的问题是: PSYoungGen指的是什么?我想这与上一代(年轻人?)有关,但具体是什么呢 第二个三元组和第一个三元组之间有什么区别 为什么为第一个三元组指定了一个名称(PSYoungGen),而没有为第二个指定 三元组中的

我已将java配置为将垃圾收集信息转储到日志()。我不确定日志中的垃圾收集条目是什么意思。下面是这些条目的示例。我到处寻找,没有找到可靠的解释

我有一些合理的猜测,但我正在寻找答案,这些答案提供了条目中数字的严格定义,并得到可靠来源的支持。引用sun文档的所有答案自动+1。我的问题是:

  • PSYoungGen指的是什么?我想这与上一代(年轻人?)有关,但具体是什么呢
  • 第二个三元组和第一个三元组之间有什么区别
  • 为什么为第一个三元组指定了一个名称(PSYoungGen),而没有为第二个指定
  • 三元组中的每个数字(内存大小)意味着什么。例如,在109884K->14201K(139904K)中,是GC 109884K之前的内存,然后将其减少到14201K。第三个数字有什么关系?为什么我们需要第二组数字
  • 8109.128:[GC[PSYoungGen:109884K->14201K(139904K)] 691015K->595332K(1119040K),0.0454530 [秒]

    8112.111:[GC[PSYoungGen:126649K->15528K(142336K)] 707780K->605892K(1121472K),0.0934560 [秒]

    8112.802:[GC[PSYoungGen:130344K->3732K(118592K)] 720708K->607895K(1097728K),0.0682690 [秒]


    大部分内容都在文章中解释过(无论如何,你最好读一读)

    命令行选项
    -verbose:gc
    导致在每次收集时打印有关堆和垃圾收集的信息。例如,以下是大型服务器应用程序的输出:

    [GC 325407K->83000K(776768K), 0.2300771 secs]
    [GC 325816K->83372K(776768K), 0.2454258 secs]
    [Full GC 267628K->83769K(776768K), 1.8479984 secs]
    
    在这里,我们看到两个次要系列,然后是一个主要系列。箭头前后的数字(例如,从第一行开始的
    325407K->83000K
    )分别表示垃圾收集前后活动对象的组合大小。在次要收集之后,大小包括一些垃圾对象(不再活动),但无法回收。这些对象包含在永久世代中,或从永久世代或永久世代引用

    括号中的下一个数字(例如,第一行的
    (776768K)
    )是堆的提交大小:java对象在不向操作系统请求更多内存的情况下可用的空间量。请注意,此数字不包括一个幸存者空间,因为在任何给定时间只能使用一个幸存者空间,也不包括永久生成,永久生成保存虚拟机使用的元数据

    行上的最后一项(例如,
    0.2300771秒
    )表示执行采集所需的时间;在这种情况下,大约四分之一秒

    第三行中主要集合的格式类似

    -verbose:gc
    生成的输出格式可能会在将来的版本中更改。

    我不知道为什么你身上有一个年轻人;你换了垃圾收集器吗

  • PSYoungGen是指用于次要收集的垃圾收集器。PS代表平行扫气
  • 第一组数字是年轻一代的前后大小,第二组是整个堆的前后大小。(详细说明格式)
  • 该名称表示有问题的生成和收集器,第二组用于整个堆
  • 关联的完整GC示例还显示了用于旧代和永久代的收集器:

    3.757: [Full GC [PSYoungGen: 2672K->0K(35584K)] 
                [ParOldGen: 3225K->5735K(43712K)] 5898K->5735K(79296K) 
                [PSPermGen: 13533K->13516K(27584K)], 0.0860402 secs]
    
    最后,分解示例日志输出的一行:

    8109.128: [GC [PSYoungGen: 109884K->14201K(139904K)] 691015K->595332K(1119040K), 0.0454530 secs]
    
    • 107Mb在GC之前使用,14Mb在GC之后使用,最大年轻一代大小137Mb
    • 675MbGC之前使用的堆,581MbGC之后使用的堆,1Gb最大堆大小
    • 自JVM启动后8109.128秒发生了次要GC,花费了0.04

    我只想提一下,您可以使用

    -XX:+PrintGCDetails 
    
    参数。然后您会看到PSYoungGen或PSPermGen输出,如答案所示

    另外,
    -Xloggc:gc.log
    似乎生成了与
    -verbose:gc
    相同的输出,但您可以在第一个输出文件中指定一个输出文件

    用法示例:

    java -Xloggc:./memory.log -XX:+PrintGCDetails Memory
    
    为了更好地可视化数据,您可以尝试(在上可以找到更新的版本)


    注意正确写入参数,我忘记了“+”并且我的JBoss不会启动,没有任何错误消息

    只是一个小注释,“()”之间的值不是最大大小,永远是目前的最大大小。如果GC不能释放堆的空间少于此限制,那么操作系统需要更多的空间,并且此值将增加。当然要遵守以下规定的限制:-Xmx@rafa.ferreira我认为paranthesis中的值,即1119040K是提交的堆大小。我认为GC不会在任何地方打印“最大堆”大小。在哪里可以找到gc日志文件?这个答案并没有真正解决最初的问题。我觉得michaeljoseph的答案更好。它解决了Ethan提出的问题,并且更好地分解了原始示例。虽然他的答案中有两个问题(他的链接现在已经失效,rafa.ferreria指出了另一个问题),但它并不仅仅是重复一个Oracle文档。整个堆、堆的年轻一代部分、次要gc如何工作,请检查,例如,注意,当java重新启动时,gc.log将被覆盖(例如,如果您重新启动您的Tomcat,因为它有内存问题,并且您希望看到GC.log)。或者至少如果您旋转GC日志。有很多其他的选项可以控制GC日志。参见,特别是,考虑<代码> -XX:+PrtggCDATestAMPS-XX:+PrtggCimeTimeSimult:XX:+UeScLogFielRoto-XXX:NUBB。