Does the CLR/JVM keep one single intern pool for all running .net/java apps?

[亡魂溺海] 提交于 2019-11-29 10:46:30

The CLR keeps an intern pool per instance. If you read further down the MSDN link:

If you are trying to reduce the total amount of memory your application allocates, keep in mind that interning a string has two unwanted side effects. First, the memory allocated for interned String objects is not likely be released until the common language runtime (CLR) terminates.

For Java it's also per JVM you start.

However according to this article:

This myth goes in the opposite direction of myth 2. Some people belive that internalized strings stay in the memory until the JVM ends. It may have been true a long time ago, but today the internalized strings are garbage collected if there are no more references to them. See below a slightly modified version of the program above. It clears the references to internalized strings from time to time. If you follow the program execution from jconsole, you will see that the PermGen space usage goes up and down, as the Garbage Collector reclaims the memory used by the unreferenced internalized strings.

Which means in Java interned strings can actually get GCed.

No, because it can't.
Each app runs in its own virtual memory space. You cannot share data between two memory spaces.
And consider the loading/unloading sequences. It would become very complicated and you could never remove a string.
Also note this part of your quote:

each unique literal string declared or created programmatically in your program.


OK, just reading a little further on that MSDN page:

the CLR's reference to the interned String object can persist after your application, or even your application domain, terminates.

As for Java, yes. String literals are kept in a pool per JVM. Excerpt from the JavaDoc of String#intern(): All literal strings and string-valued constant expressions are interned. String literals are defined in §3.10.5 of the Java Language Specification

As I understand for the CLR it is one per runtime, not per AppDomain. From Jeffrey Richter's "CLR Via C#"

Note that the garbage collector can't free the strings that the internal hash table refers to because the hash table holds the reference to those String objects. String objects referred to by the internal hash table can't be freed until the AppDomain is unloaded or the process terminates.

This suggests that the table is separate from the AppDomain.

JVM doesn't have this concept so there is no ambiguity. You may have different class loaders, but it is hard to imagine you would have different class loaders for String.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!