【问题标题】:How to determine the size of PermGen within a Java application (i.e., programmatically)?如何确定 Java 应用程序中 PermGen 的大小(即,以编程方式)?
【发布时间】:2010-11-01 17:34:24
【问题描述】:
  1. 有什么方法可以测量我的 Java 应用程序中当前使用永久代 (PermGen) 的大小?我无法使用 VisualVM 等外部分析工具。

  2. 更好的是估计 PermGen 中 Java 类的内存消耗。它几乎与字节码文件的大小成正比吗?

【问题讨论】:

    标签: java memory-management memory-footprint


    【解决方案1】:

    您可以使用 JDK 附带的 MemoryMXBean。但我认为没有办法从正在运行的应用程序中查询 permgen 的使用情况。 关于MemoryMXBean的文档。

    【讨论】:

    • 谢谢!这个答案对我帮助很大。只要我有足够的声誉,我就会投票给你的答案有用! :)
    【解决方案2】:

    您可以使用 JDK 中的 jvisualvm 工具和 Visual GC 插件来监控所有 JVM 堆区域,包括 PermGen。

    【讨论】:

      【解决方案3】:

      如果您不在 Windows 上,您可以尝试 JDK 附带的 jmap

      【讨论】:

        【解决方案4】:

        您可以使用jmap 命令:

        jmap [选项] (连接到正在运行的进程)

        jmap [选项] (连接到核心文件)

        jmap [选项] [server_id@] (连接到远程调试服务器)

        其中选项是以下之一:

        -heap : 打印 java 堆摘要

        -permstat : 打印永久代统计数据

        【讨论】:

        • 谢谢您的回答,但是我的问题的决定性点是我想测量我的应用程序中的内存消耗(即,以编程方式)......所以 MemoryMXBean 是正确的方法
        【解决方案5】:

        PermGen 的大小与类文件的大小无关。根据 Sun 的说法,PermGen 的默认大小是 64 MB。如果你想增加它,你可以使用显式设置它:

        -XX:PermSize=164m
        

        在您的 Java 命令行或启动脚本中。这也是您无需依赖外部工具即可知道其设置的方法。

        编辑:

        阅读这篇文章,以确定目前以编程方式使用了多少 PermGen(即没有外部工具):

        http://frankkieviet.blogspot.com/2006/10/how-to-fix-dreaded-permgen-space.html

        【讨论】:

        • max 大小不一定与任何文件的大小有关。但 stefan 正在寻找当前(使用的)尺寸,而不是最大尺寸。
        • 根据blogs.sun.com/jonthecollector/entry/…,例如类方法的字节码对 PermGen 的大小有影响!
        • 我没有指定最大尺寸。最大永久大小的标志是 MaxPermSize
        • @stefan,你很困惑。仔细阅读文档。 PermSize 是加载你的类文件的地方,是的,但是 PermSize 的 size 不是由你的特定类文件决定的。
        • 哦,我明白了,您想知道当前占用了多少 PermSpace。你应该在你的问题中澄清这一点。
        猜你喜欢
        • 1970-01-01
        • 2011-11-21
        • 1970-01-01
        • 2012-04-18
        • 1970-01-01
        • 2012-07-28
        • 2010-09-16
        • 2010-12-19
        • 2011-01-05
        相关资源
        最近更新 更多