如何确定Java应用程序年轻gc的原因

如何确定Java应用程序年轻gc的原因,java,garbage-collection,Java,Garbage Collection,最近我发现在我的java应用程序中有一个频繁的年轻gc。因为我有一个1600M的年轻一代,它每10秒做一次年轻的gc,我认为有太多不必要的东西导致了这些gc 我知道我可以使用jmap进行heapdump,以找出导致完全gc的原因。但是,我如何才能找出年轻一代中的内容(因为堆泵应该清洁年轻一代,而年轻一代一直在变化) 还有一个问题:jstat-gcutil会增加gc频率吗?选项1- 它在引擎盖下使用jmap。如果你用——死了的年轻人来运行它,它会跟随你 执行完全GC 等待10秒(产生新的垃圾)

最近我发现在我的java应用程序中有一个频繁的年轻gc。因为我有一个1600M的年轻一代,它每10秒做一次年轻的gc,我认为有太多不必要的东西导致了这些gc

我知道我可以使用jmap进行heapdump,以找出导致完全gc的原因。但是,我如何才能找出年轻一代中的内容(因为堆泵应该清洁年轻一代,而年轻一代一直在变化)


还有一个问题:jstat-gcutil会增加gc频率吗?

选项1- 它在引擎盖下使用jmap。如果你用——死了的年轻人来运行它,它会跟随你

  • 执行完全GC
  • 等待10秒(产生新的垃圾)
  • 在没有GC的情况下获取堆直方图
  • 立即执行GC并获取柱状图(如jmap-live)
  • 比较两个直方图并返回差异-在最近10秒内创建并收集的对象
选项2- 它是Java8JDK的一部分。它可以在TLAB分配失败时对对象分配进行采样。虽然不完全准确,但在实践中,它非常适合检测垃圾点


jstat-gc
不执行gc,它通过内存映射文件使用信息。JVM将一些度量值转储到该文件中,然后
jstat
轮询它。

嗨,Alexey,我试过sjk的hh。它印了一些像jmap-histo的东西。java.lang.Integer/java.lang.String。我确实找到了一些原因,但还不够深入。我想继续跟踪这些对象,找出是谁创建了它们。但我在hh中找不到任何关于堆转储的选项。我该怎么做才能找到发起人?我还发现StackElementTrace太多了,这意味着发生了很多异常。但我在日志文件中找不到任何日志,所以有机会找到谁创建了这些异常吗?@Alexis,正如我所说的,sjk只是jmap的奇特包装器。尝试Java任务控制,它可以跟踪对象创建热点。您可以使用jmap获取包含垃圾的堆转储,并深入堆转储以调查这些StackTraceElement实例。这可能是一个使用StackTraceElements分析调用方堆栈或类似内容的奇特框架。因为年轻的GC速度很快,所以它很难成为性能问题的根本原因。建议您可以启用GC日志记录,例如:-XX:+PrintGCDateStamps-XX:+PrintGCDetails-XX:+PrintHeapAtGC-Xloggc:并使用GC分析工具(如:)检查GC使用的时间。然后您将看到年轻的GC是否是问题所在。