Permgen OutOfMemory,请问有什么手段或者工具可以看到Permgen中被intern()的String的具体内容? 
一般Permgen里有2部分数据,一部分是加载的Class,一部分是String常量池(即调用了String.intern())。加载的Class的内容已经用Memory Analyzer分析出来了,但String常量池里的内容还不知道,请问,有没有什么方式或工具可以看到Permgen中被intern()的String常量池的具体内容?

解决方案 »

  1.   

    profiler堆分析器,能够看到当前jvm堆内存的一些情况,比如每个对象所占内存的大小等等,而Permgen属于堆内存,你可以借助分析器,查看下……
      

  2.   

    纠正你一下,Permgen不属于堆内存,JVM内存由以下5部分组成:
    JVM内存组成:
    1、程序计数器:是一块较小的内存空间,它的作用是当前线程所执行的字节码的行号指示器。
    2、Java虚拟机栈:存放每个线程执行方法的局部变量区、操作数栈。
       本地方法栈:执行Native方法。Sun Hotspot虚拟机把本地方法栈与虚拟机栈合二为一。
    3、Java堆
    4、方法区(Perm代)
    5、直接内存(Direct Memory),NIO使用Native函数库直接分配堆外内存。至于那些工具,如jmap,jinfo,jprofiler,jconsole,jvisualvm,memoryanalyzer都无法看到看到Permgen中被intern()的String常量池的具体内容的。
      

  3.   

    是的,没办法读取。PermGen 与 java heap 的机制、GC 都不一样,heap dump 只能导出 heap 上的内容,导不出 PermGen 中的东西。