什么是Java中的String Interning,什么时候应该使用它,为什么?
基本上,对一系列字符串执行String.intern()将确保所有具有相同内容的字符串共享相同的内存。因此,如果您有“ john”出现1000次的名称列表,则通过实习可以确保实际上仅分配了一个“ john”内存。
这对于减少程序的内存需求很有用。但是请注意,缓存是由JVM在永久内存池中维护的,与堆相比,该内存通常受大小限制,因此如果没有太多重复值,则不应使用intern。
有关使用intern()的内存限制的更多信息
一方面,确实可以通过内部化来删除字符串重复项。问题在于,内部化的字符串将进入“永久生成”,这是JVM的一个区域,保留给非用户对象,例如类,方法和其他内部JVM对象。该区域的大小是有限的,并且通常比堆小得多。在String上调用intern()的作用是将其从堆中移出到永久代中,并且您可能会用完PermGen空间。
-来源:http://www.codeinstructions.com/2009/01/busting-javalangstringintern-myths.html
从JDK 7(我的意思是在HotSpot)开始,情况有所变化。
在JDK 7中,不再将永久字符串分配给Java堆的永久代中,而是与应用程序创建的其他对象一起分配给Java堆的主要部分(称为年轻代和老一代)中。 。此更改将导致更多数据驻留在主Java堆中,而永久生成中的数据更少,因此可能需要调整堆大小。由于此更改,大多数应用程序只会看到相对较小的堆使用差异,但是加载许多类或大量使用String.intern()方法的大型应用程序将看到更大的差异。
问题内容: 请告诉我一个实时的情况来比较String,StringBuffer和StringBuilder? 问题答案: 如果使用的是JGraph,则应尝试为算法设计的。它的功能之一是使用库进行可视化。它仍然开发,但相当稳定。我前段时间分析了算法的复杂性。其中一些并不是最快的,但是如果你要自己实现它们并需要显示图形,那么它可能是最佳选择。我真的很喜欢使用它的API,当时我不得不快速编写一个在图形上
什么是MySQL的多实例? 简单的说多实例就是在一台机器上开启多个不同的服务端口(如3306,3307),运行多个MySQL服务进程,这些服务进程通过不同的socket监听不同的服务端口来提供各自的服务. 这些MySQL多实例共用一套MySQL安装程序,使用不同(也可以是相同,建议不同)的my.cnf配置文件,启动程序,数据文件.在提供服务时,多实例MySQL在逻辑上看是各自独立的,多个示例自身是
问题内容: 在构建RPM软件包的过程中,我必须指定BuildRoot,以后将在%install中使用它来侵害$ RPM_BUILD_ROOT。我一直认为$ RPM_BUILD_ROOT是RPM执行打包的假安装。然后,在使用RPM软件包进行安装时,它将安装到实际位置。例如: 我认为$ RPM_BUILD_ROOT仅用于打包过程,并且在某些方面,当用户执行“ rpm -ivh package.rpm”
问题内容: 我知道Javassist是一个Java库,提供了一种操作应用程序的Java字节码的方法。 好的,但是为什么我们需要操纵字节码? 有什么真实的例子吗?任何真正的应用程序,javassist在哪里使用? 问题答案: 一个常见的应用是在运行时生成代理类,即在运行时创建一个子类,以拦截所有方法调用。例子: Hibernate 使用代理来拦截对实体的方法调用以实现延迟加载,即,在首次访问对象时从
问题内容: 什么是selenium? 当您打开Selenium的官方页面时,您首先读到的是“什么是Selenium?”中的“ Selenium automates browser”。部分。“selenium的哪个部分适合我?”部分 下面提供了Selenium WebDriver和Selenium IDE之间的选择。由此,我推断出Selenium是一组工具,并且该集合包括IDE,WebDriver
硒是什么? 当你打开Selenium的官方页面,首先看到的是“什么是Selenium”中的“Selenium自动浏览器”。节。“硒的哪一部分对我合适?”下面提供了Selenium WebDriver和Selenium IDE之间的选择。由此,我推断Selenium是一个工具集合,该集合包括IDE、WebDriver API(语言绑定)、网格、Selenium独立服务器、浏览器驱动程序。一个人必须下