【问题标题】:When do (not) two strings with same content share the same memory?什么时候(不)两个具有相同内容的字符串共享相同的内存?
【发布时间】:2013-03-27 11:31:02
【问题描述】:

来自will two strings with same content be stored in the same memory location?的问题

拥有Java代码

String s1="Java";

这个字符串会被分配在同一个内存位置(或多个):

  • 是否要启动同一个程序多次并行(同时)执行?

可能的答案:

我目前是 C# 开发人员(尽管在上个千年中使用 Java 进行了编程)。

我问这个问题是因为我相信 .NET CLR 和 Java (JVM) 之间是一样的,我希望得到 .NET 应用程序的答案(但不知何故,经常遇到的“应用程序”池术语有疑问) .

所以,它似乎是(抱歉在询问之前没有详尽搜索):

答案是 string 实习生池由同一 JVM 或 .NET CLR 的所有实例/程序共享。

【问题讨论】:

  • 您打算如何在同一个 JVM 中多次启动同一个程序
  • 好吧,我怀疑它是否会在每次连续执行时分配到相同的内存位置,因为这完全取决于执行时应用程序可用的内存位置。这适用于任何语言,因为它们最终都通过操作系统访问计算机内存。
  • @Jon Skeet,我的意思是“同一个 JVM 的不同实例”

标签: c# java .net memory-management literals


【解决方案1】:

相同内容的字符串将共享相同JVM的每个实例的相同空间

【讨论】:

  • 我想你的意思是“不同的 JVM instance”,冒昧地编辑你的答案,随意进一步编辑或回滚。 JVM 软件安装本身可以(并且通常是)相同的。
  • @Hyde,谢谢。因为对于不同的虚拟机或物理机是显而易见的
  • @Hyde,谢谢。但是您应该将其发布为答案。因为您的编辑将我的问题的答案恢复为相反,所有其他答案都暗示字符串池在同一 JVM 的所有实例之间共享,即在从同一安装的 JVM 启动的所有应用程序之间。
  • @GennadyVanin--Novosibirsk 我认为所有的答案都意味着一个 JVM 实例,当谈到“JVM”时,并不意味着实例之间共享实习字符串......这将如何有效地工作并且便携?无论如何,如果我误解了,我会让 MohanRajB 回滚。
  • @hyde,请在问题正文中查看我的更新。我相信你应该恢复你的编辑,老实说,老实说,我自己很困惑,我认为实习生池是每个 JVM 实例或每个应用程序
【解决方案2】:

相同的内存位置:

String s1="Hola";
String s2="Hola";

不同的内存位置:

String s1="Hola";
String s2=new String("Hola"); 

【讨论】:

  • 这与我的问题有什么关系?
  • 这是你的问题吗?:两个具有相同内容的字符串何时(不)共享相同的内存?
  • 天啊,你是对的,但这只是从父主题借来的续集标题,并且你的代码 sn-ps 在那里(通过引用那里的主题)密集使用。所以,我希望回答者阅读引用的主题而不重复。不过,我删除了我的反对票,抱歉
  • 别担心,这个标题让我很困惑:)
【解决方案3】:

@gennady-vanin-novosibirsk....

String s1="Java";String s2="Java";String s3="Java";String s4="Java";

  1. StringConstantPool 位置中可用的上述所有对象都是指向仅一个(“Java”)位置的对象

【讨论】:

  • 隐含的问题是 StringConstantPool 是按应用程序创建还是在它们之间共享
  • 您是指每个 JVM 实例还是每个(所有实例)同一个 JVM?
  • JVM 首先检查字符串常量池,如果字符串不存在,它会创建一个新的字符串对象“Java”并在池中维护一个引用。变量‘s1’也指向同一个对象。
【解决方案4】:
Is string pool created per class basis or per JVM basis?

每个 JVM 有一个字符串池...除非您使用的是一些奇特的 JVM,而他们决定以不同的方式实现它。

我想这就是答案,对吧?

来自similar question

【讨论】:

  • 它不是每个类,因为§3.10.5 of Java Specification Language 告诉它在多个包之间共享“不同包中不同类中的文字字符串同样表示对同一字符串对象的引用”。那么,从同一个 JVM 启动的所有 JVM 实例或应用程序共享同一个池?
  • 上述问题的答案不仅仅是这个问题...其中的应用程序共享池。反正我就是这么推断的。
猜你喜欢
  • 2017-07-29
  • 1970-01-01
  • 2014-07-15
  • 1970-01-01
  • 1970-01-01
  • 2020-05-21
  • 1970-01-01
  • 2023-02-01
  • 2012-08-08
相关资源
最近更新 更多