CLR/JVM是否为所有运行的.net/java应用程序保留一个单独的实习生池

本文关键字:一个 实习生 单独 保留 java 是否 JVM CLR net 运行 应用程序 | 更新日期: 2023-09-27 18:00:57

以下是MSDN的摘录:

公共语言运行库保存通过维护表来存储字符串,称为实习生池,其中包含对每个唯一的引用声明或创建的文字字符串在程序中以编程方式。因此,一个文字的实例仅具有特定值的字符串在系统中存在一次。

例如,如果指定文字字符串到几个变量,运行时检索相同的对中的文字字符串的引用实习生库,并将其分配给每个变量

实习生方法使用实习生库搜索等于str的值。如果存在这样的字符串,它在实习生库中的参考是返回。如果字符串没有如果存在,则添加对str的引用实习生人才库,然后是那个推荐人已返回。。。。如果你想减少您的内存总量应用程序分配,请记住练习一根绳子有两个副作用。首先为内部字符串分配的内存对象不太可能被释放直到公共语言运行时(CLR(终止。

那么,这是否意味着CLR为所有运行的.net应用程序保留一个实习生池?示例:如果一个程序a创建了一个字符串文字"Test",而另一个程序试图创建另一个字符串文本"Test"时,是否使用相同的副本?同样的问题也适用于JVM

CLR/JVM是否为所有运行的.net/java应用程序保留一个单独的实习生池

CLR为每个实例保留一个实习生池。如果您进一步阅读MSDN链接:

如果您试图减少应用程序分配的内存总量,请记住,保留字符串有两个不必要的副作用。首先,在公共语言运行库(CLR(终止之前,分配给内部String对象的内存不太可能被释放。

对于Java,它也是按JVM启动的。

然而,根据这篇文章:

这个神话与神话2的方向相反。有些人认为,内部化的字符串会一直留在内存中,直到JVM结束。这在很久以前可能是真的,但今天,如果没有更多的引用,内部化的字符串就会被垃圾收集。请参阅下面的程序的一个稍微修改的版本。它会不时地清除对内部字符串的引用。如果您从jconsole跟踪程序的执行,您将看到PermGen空间的使用率忽高忽低,因为垃圾回收器回收未引用的内部字符串所使用的内存。

这意味着在Java中,内部字符串实际上可以获得GCed。

不,因为它不能
每个应用程序都在自己的虚拟内存空间中运行。不能在两个内存空间之间共享数据
并考虑装载/卸载顺序。它会变得非常复杂,你永远无法移除一根绳子
还要注意你的报价中的这一部分:

在程序中以编程方式声明或创建的每个唯一文字字符串。


好的,只需在MSDN页面上进一步阅读:

CLR对实习生的引用字符串对象可以在应用程序,甚至您的应用程序域,终止。

至于Java,是的。字符串文本保存在每个JVM的池中。摘自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 的JavaDoc

据我所知,CLR是每个运行时一个,而不是每个AppDomain。来自Jeffrey Richter的"CLR Via C#">

请注意,垃圾收集器无法释放内部哈希表引用的字符串,因为哈希表包含对这些String对象的引用。在卸载AppDomain或进程终止之前,无法释放内部哈希表引用的字符串对象。

这表明该表与AppDomain是分开的。

JVM没有这个概念,所以没有歧义。您可能有不同的类加载器,但很难想象会有不同的String类加载器。

相关文章: