11

给定一个堆转储或一个正在运行的虚拟机,我如何发现永久代的内容是什么?我知道“jmap -permstat”,但这在 Windows 上不可用。

4

8 回答 8

1

永久代包含类对象。所以你应该检查堆转储或其他形式的对象列表的类。如果您对永久代的大小有疑问,通常是由两个原因引起的:

  • 您使用的程序或库动态创建类,并且永久生成的默认大小太小 - 使用 -XX:MaxPermSize=256m 简单地创建大小
  • 您的程序或您使用的库在每次调用时都会动态创建新类,因此永久代的大小会不断增加 - 这是您应该修复的编程错误(或搜索修复/创建错误报告)

要查看您的情况,请检查较长时期内永久代的大小。

关于永久代的一个很好的概述:

http://blogs.oracle.com/jonthecollector/entry/presenting_the_permanent_generation

于 2008-10-11T20:19:26.120 回答
1

这篇使用 Java SE 5 进行内存监控的文章描述了如何以编程方式发现有关堆使用情况、内存池(包括 permgen 空间)等的信息。它非常简单:

    MemoryUsage usage = ManagementFactory.getMemoryMXBean().getNonHeapMemoryUsage();
    long nonHeapFree = usage.getMax() - usage.getUsed();
    long nonHeapTotal = usage.getMax();

在我对 OSX (Sun VM) 的测试中,“非堆内存使用”与为 permgen 池返回的值非常匹配,并且可能会对没有 permgen 的 VM 做一些有用的事情。

于 2011-12-22T06:51:31.823 回答
0

我正在研究同样的事情,但由于嵌入式平台的内存限制。

查看 jmap 的代码,permstat 工具只有在 sun.jvm.hotspot.tools.HeapSummary 类可用的情况下才可用。此类是可维护性代理的一部分。根据 OpenJDK 文档(http://openjdk.java.net/groups/serviceability/svcjdk.html#bsa):

Serviceability Agent 组件是作为 HotSpot 存储库标准构建的一部分构建的。这些组件是:

-libsaproc.so:这是 SA 的本机代码组件。

-sa-jdi.jar:这是包含 SA 的 Java 类。它包括一个 JDI 实现,它允许 JDI 客户端对核心文件和挂起的进程进行只读调试。

SA 被 jinfo、jmap、jstack 使用

注意:Serviceability Agent 和使用它的技术当前不包含在 Windows 平台上的 JDK 版本中。

Oracle JDK 似乎也是如此。我正在寻找修改 jmap 工具以获取更多信息。

于 2011-11-16T21:48:33.877 回答
0

请参阅我关于Eclipse 的 thr permsize 的博客文章

简而言之,内存分析器可以做到,但您需要 SAP JVM。

于 2008-11-24T08:14:01.133 回答
0

永久代实际上只包含两种东西:类定义和实习字符串。后者很少给你带来问题,但它经常被归咎于问题。由于代码生成和部分热重载(悬空引用),前者更常见。

不像名字所暗示的那样,permgen 最终也会被 GC 处理,只是不是常规 GC 周期的一部分。因此,未引用的实习字符串和未使用的类会被清理掉。但是 permgen 也不会动态增长,这意味着有时需要手动调整其设置以启动 JVM。

于 2009-05-15T03:44:37.727 回答
0

你有具体的问题要解决吗?使用 String.intern() 是 permgen 问题的典型原因之一。此外,具有很多类的项目也存在 permgen 问题。

我不知道如何进入 permgen 看看它在那里......

于 2009-05-14T09:48:52.260 回答
0

对我有帮助的一种技术是使用-verbose:class java 的命令行选项,当类被加载/卸载时,你会得到日志输出。由于类被加载到 permgen,这在某些情况下会有所帮助。

于 2015-09-28T21:37:16.040 回答
-1

您可以使用 JConsole 或 jvisualvm.exe(使用 jdk 1.6 7)来查找在哪里。如果您想知道您的所有对象是如何相互关联的以及对象树,那么您可能想尝试 Eclipse Memory Analyzer -- http://www.eclipse.org/mat/

总之,你会从“ http://www.eclipse.org/mat/ ”得到你想要的。

祝你好运,

于 2008-10-11T18:28:22.973 回答