代码之家  ›  专栏  ›  技术社区  ›  Andrei Pozolotin

JavaGC:Toop对象类(按大小)提升?

  •  6
  • Andrei Pozolotin  · 技术社区  · 15 年前

    请让我知道,在每一个年轻的gc事件之后,确定年轻一代提升到老一代的记忆成分的最佳方法是什么?

    理想情况下,我想知道负责的类名,比如,每个“年轻一代”促销区块中80%的堆;

    例:我有6亿年轻一代,每届任期晋升6百万;我想知道这6百万是由哪些对象组成的。

    谢谢您。

    1 回复  |  直到 9 年前
        1
  •  6
  •   Igor Konoplyanko    9 年前

    但是,我最近一直在分析大型Java应用程序的内存性能,并且可以分享一些经验。

    以下是我如何发现哪些对象正在升级为旧版本:

    首先,您需要确定“旧/终身”空间中的对象。这基本上是您的标准Java堆分析。为此我推荐jmap。它是sun jvm的一部分。 运行: jmap -dump:file=heap.hprof PID 得到一堆垃圾。这将在转储期间暂停jvm(2gb堆上大约30秒)

    现在加载.prof文件 Memory analyser (最好的工具,手放下) 我会花一天时间玩内存分析器来理解它,观看屏幕摄像头(需要登录,但值得)。

    现在你就知道堆里有什么东西了。

    诀窍在于:在内存分析器的概览屏幕中,有一个链接指向:“无法访问的对象直方图”。现在这些对象都将在下一次gc期间收集。但有些可能在伊甸园,有些在幸存者和一些在旧。

    现在,找一些具有内存分析功能的分析器,我更喜欢你的工具包。 使用工具包运行应用程序并记录对象分配。

    运行它并记录对象创建。创建对象列表后,使用这三个列表来获取正在进行的操作的图片。做人类最擅长做的事,看模式。

    • 哪些对象是创建的并且是可访问的。(内存分析器)
    • 堆中无法访问的对象(内存分析器)
    • 运行期间创建的对象(探查器)

    另一种方法是你的工具包 generations view . 您可以拍摄堆的快照,并比较快照之间哪些对象仍处于活动状态。如果你用这个 visualgc 您可以确定一个对象必须存活多长时间才能升级到旧版本,并以这些间隔拍摄快照以查看哪些对象仍然存活。

    好吧,祝你好运。 /JT