在跟踪可能的内存泄漏时,我发现了以下现象。 Java 7回收实习字符串或jmap是不是很精确?
# jmap -heap 9724 | grep interned Attaching to process ID 9724, please wait... Debugger attached successfully. Server compiler detected. JVM version is 23.3-b01 10526 interned Strings occupying 880048 bytes. # jmap -heap 9724 | grep interned Attaching to process ID 9724, please wait... Debugger attached successfully. Server compiler detected. JVM version is 23.3-b01 10514 interned Strings occupying 878984 bytes. # jmap -heap 9724 | grep interned Attaching to process ID 9724, please wait... Debugger attached successfully. Server compiler detected. JVM version is 23.3-b01 10519 interned Strings occupying 879720 bytes.
环境: Linux版本2.6.32-220.23.1.el6.centos.plus.x86_64(mockbuild@c6b5.bsys.dev.centos.org)(gcc版本4.4.6 20110731(Red Hat 4.4.6-3)(GCC)) #1 SMP Tue Jun 19 04:14:37 BST 2012
java版“1.7.0_07” Java(TM)SE运行时环境(版本1.7.0_07-b10) Java HotSpot(TM)64位服务器VM(版本23.3-b01,混合模式)
答案 0 :(得分:3)
是Interned Strings被收回。并且如Java SE 7 Features and Enhancements
中所述,建议:
在JDK 7中,永久性中不再分配实习字符串 生成Java堆,而是在main中分配 Java堆的一部分(称为年轻和老一代) 与应用程序创建的其他对象。这种改变会 导致更多数据驻留在主Java堆中,并且数据中的数据更少 永久世代,因此可能需要堆大小 调整。大多数应用程序只会看到相对较小的差异 由于此更改导致堆使用,但加载的应用程序更大 很多类或者大量使用String.intern()方法都会看到 更显着的差异。