不在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)
二手= 72157448(68.81470489501953MB)
free = 62060280(59.18529510498047MB)
53.76148819923401%使用96874 interned Strings占用89695496个字节。
所以在Permgen的68mb中似乎有大约89mb的实习字符串。 是否存在未存储在Permgen中的实习字符串?
从Java 7发行说明 :
在JDK 7中,实现的字符串不再分配在Java堆的永久生成中,而是分配在Java堆的主要部分(称为年轻和旧的代)中,以及应用程序创建的其他对象。 此更改将导致更多数据驻留在主Java堆中,并且永久生成中的数据更少,因此可能需要调整堆大小。 由于此更改,大多数应用程序只会看到堆使用中的相对较小的差异,但是加载许多类或大量使用String.intern()方法的较大应用程序将看到更显着的差异。
- Eclipse JDT AST Parser不解析Java lambda Expression中的类型
- 在mybatis中返回HashMap并将其用作spring MVC中的ModelAttribute
- Hibernate hql,在同一个查询中执行多个更新语句
- 如何在Intellij IDEA中构建和运行Storm拓扑
- 默认情况下打印出命令行java应用程序中未处理的exception在哪里? 对stdout或stderr?
- 数字签名SunMSCAPI提供商和MS Crypto API
- 使用Set面向循环依赖时的Java序列化错误
- Eclipse没有在项目资源管理器中显示编译错误
- 在JFreeChart中更新绘图