17

我已经jmap -heap在我们正在运行的 Java 应用程序上运行了该命令,这就是我得到的:

C:\Program Files\Java\jdk1.7.0_05\bin>jmap -heap 2384 正在附加到进程 ID 2384,请稍候... 调试器附加成功。检测到服务器编译器。
JVM 版本为 23.1-b03

,在新一代使用并行线程。
使用线程局部对象分配。
Concurrent Mark-Sweep GC

Heap Configuration:
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.0兆)
MaxPermsize = 201326592(192.0MB)
G1HeaPrigionionsize = 0(0.0MB)

堆的用法:
新一代(Eden + 1幸存者空间):
容量= 228261888(217.6875MB) (
217.6875MB

used
Eden Space:
capacity = 202964992 (193.5625MB)
used = 198399360 (189.2083740234375MB)
free = 4565632 (4.3541259765625MB)
97.75053226913141% used
From Space:
capacity = 25296896 (24.125MB)
used = 5394640 (5.1447296142578125MB)
free = 19902256 (18.980270385742188兆)
21.325304100550518% 已使用
到空间:
容量 = 25296896 (24.125MB) 已
使用 = 0 (0.0MB)
空闲 = 25296896 (24.125MB)
0.0% 已使用
并发标记-扫描生成:
容量 = 506445824 (482.984375MB) 已
使用 = 2759479140512 (2759479140512)
free = 346966416 (330.89295959472656MB)
31.489924576809226% used
Perm Generation:
capacity = 134217728 (128.0MB)
used = 72157448 (68.81470489501953MB)
free = 62060280 (59.18529510498047MB)
53.76148819923401% used

96874 interned Strings occupying 89695496 bytes.

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

4

1 回答 1

24

Java 7 发行说明

在 JDK 7 中,interned 字符串不再分配在 Java 堆的永久代中,而是与应用程序创建的其他对象一起分配在 Java 堆的主要部分(称为年轻代和年老代)中. 此更改将导致更多数据驻留在主 Java 堆中,而永久代中的数据更少,因此可能需要调整堆大小。由于此更改,大多数应用程序只会看到相对较小的堆使用差异,但加载许多类或大量使用 String.intern() 方法的大型应用程序将看到更显着的差异。

于 2013-04-30T10:49:43.573 回答