不住在permgen中的实习生串?

2022-09-03 01:21:15

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

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

,在新一代中使用并行线程。
使用线程本地对象分配。
并发标记扫描 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)

堆使用量:
新一代 (Eden + 1 Survivor Space):
容量 = 228261888 (217.6875MB)
使用 = 203794000 (194.3531036376953MB)
free = 24467888 (23.334396362304688MB)
89.28078260703775% used
Eden Space:
capacity = 202964992 (193.5625MB)
used = 198399360 (189.2083740234375MB)
free = 4565632 (4.3541259765625MB)
97.75053226913141% 从空间使用

容量 = 25296896 (24.125MB)
已用 = 5394640 (5.1447296142578125MB)
可用 = 19902256 (18.980270385742188MB)
21.325304100550518% 用于
空间:
容量 = 25296896 (24.125MB)
使用 = 0 (0.0MB)
可用 = 25296896 (24.125MB)
0.0% 已并
发标记扫描生成:
容量 = 506445824 (482.984375MB)
used = 159479408 (152.09141540527344MB)
free = 346966416 (330.89295959472656MB)
31.489924576809226% 使用
Perm Generation:
capacity = 134217728 (128.0MB)
used = 72157448 (68.81470489501953MB)
free = 62060280 (59.18529510498047MB)
53.76148819923401% 使用

96874 个占用 89695496 字节的实习字符串。

因此,在Permgen的68mb中似乎有大约89mb的实习字符串。是否有未存储在 Permgen 中的滞留字符串?


答案 1

来自 Java 7 发行说明

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


答案 2