Java的实习字符串是否会被GC化?

时间:2013-03-26 19:09:13

标签: java garbage-collection

在跟踪可能的内存泄漏时,我发现了以下现象。 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,混合模式)

1 个答案:

答案 0 :(得分:3)

是Interned Strings被收回。并且如Java SE 7 Features and Enhancements中所述,建议:

  

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