不在permgen的实习字符串?

时间:2013-04-30 10:41:54

标签: java string permgen

我在运行的Java应用程序上运行jmap -heap命令,这就是我得到的:

  

C:\ Program Files \ Java \ jdk1.7.0_05 \ bin> jmap -heap 2384   正在处理ID 2384,请稍候......   调试器连接成功。   检测到服务器编译器   JVM版本为23.1-b03
  
  在新一代中使用并行线程。
  使用线程局部对象分配   并发Mark-Sweep GC
  
  堆配置:
    MinHeapFreeRatio = 40
    MaxHeapFreeRatio = 70
    MaxHeapSize = 1073741824(1024.0MB)
    NewSize = 1310720(1.25MB)
    MaxNewSize = 17592186044415 MB
    OldSize = 5439488(5.1875MB)
    NewRatio = 2
    SurvivorRatio = 8
    PermSize = 134217728(128.0MB)
    MaxPermSize = 201326592(192.0MB)
    G1HeapRegionSize = 0(0.0MB)
  
  堆用法:
  新生代(伊甸园+ 1幸存者空间):
    容量= 228261888(217.6875MB)
    used = 203794000(194.3531036376953MB)
    free = 24467888(23.334396362304688MB)
    89.28078260703775%使用
  伊甸园空间:
    容量= 202964992(193.5625MB)
    used = 198399360(189.2083740234375MB)
    free = 4565632(4.3541259765625MB)
    97.75053226913141%使用
  来自太空:
    容量= 25296896(24.125MB)
    used = 5394640(5.1447296142578125MB)
    free = 19902256(18.980270385742188MB)
    21.325304100550518%使用
  对空间:
    容量= 25296896(24.125MB)
    used = 0(0.0MB)
    free = 25296896(24.125MB)
    0.0%使用
  并发标记扫描生成:
    容量= 506445824(482.984375MB)
    used = 159479408(152.09141540527344MB)
    free = 346966416(330.89295959472656MB)
    31.489924576809226%使用
  烫发一代:
    容量= 134217728(128.0MB)
    used = 72157448(68.81470489501953MB)
    free = 62060280(59.18529510498047MB)
    53.76148819923401%使用
  
  96874 interned Strings占用89695496个字节。

所以在Permgen的68mb中似乎有大约89mb的实习字符串。是否存在未存储在Permgen中的实习字符串?

1 个答案:

答案 0 :(得分:23)

来自Java 7 release notes

  

在JDK 7中,不再分配实习字符串   永久生成Java堆,但是在其中分配   Java堆的主要部分(称为年轻和旧的   代)以及应用程序创建的其他对象。   此更改将导致更多数据驻留在主Java堆中,   并且永久代中的数据较少,因此可能需要堆   尺寸需要调整。大多数应用程序只会看到相对较小   由于此更改导致堆使用的差异,但更大的应用程序   加载许多类或大量使用String.intern()方法   会看到更多重大差异。