Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我们可以避免在java中插入字符串吗?_Java_Performance_Permgen_String Interning - Fatal编程技术网

我们可以避免在java中插入字符串吗?

我们可以避免在java中插入字符串吗?,java,performance,permgen,string-interning,Java,Performance,Permgen,String Interning,我们可以完全禁用字符串的内部处理吗。这可能没有什么帮助,但只是一个想法。我认为至少有一点是有用的,即在jvm调优期间,控制perm gen的大小 例如,如果我提供了一个OSGI框架,任何人都可以添加任意数量的bundle,每个bundle字符串插入都会完全破坏我的调优参数。(当然,我知道我们应该在给定的固定发行版上进行调优,但仍然…) 任何想法 是最后一个类,不能扩展。因此,否-您不能删除在Java中插入字符串的功能。对于现代JVM来说,Permgen大小/使用不是问题。当内存字符串没有剩余的引

我们可以完全禁用字符串的内部处理吗。这可能没有什么帮助,但只是一个想法。我认为至少有一点是有用的,即在jvm调优期间,控制perm gen的大小

例如,如果我提供了一个OSGI框架,任何人都可以添加任意数量的bundle,每个bundle字符串插入都会完全破坏我的调优参数。(当然,我知道我们应该在给定的固定发行版上进行调优,但仍然…)


任何想法

是最后一个类,不能扩展。因此,否-您不能删除在Java中插入字符串的功能。

对于现代JVM来说,Permgen大小/使用不是问题。当内存字符串没有剩余的引用时,内存字符串可供垃圾收集器使用


(不,您不能“关闭”字符串文本的内部存储)。

您可以通过在代码中不使用任何字符串文本来禁用大多数字符串的内部存储。您可以改为使用char[]并从这些字符串生成字符串。例如

String hi = new String(new char[] { 'h', 'i' }); // not interned.
正如你提到的,这只会为你自己创造工作机会,只会让事情变得更糟

如果我提供了一个OSGI框架,任何人都可以添加任意数量的bundle,每个bundle字符串都会完全破坏我的调优参数

如果他们添加捆绑包,他们可能需要更高的最大内存、perm gen大小、直接内存大小、不同的新闻大小比率,甚至不同的GC。防止这种情况的唯一方法是防止OSGi容器中的任何其他模块


或者您可以说,如果您添加了bundle,您可能需要更改调优参数。

由于Oracle的Java 7,intern字符串池不再存储在PerGen中。在这里阅读更多内容

都是真的,但是类需要卸载/gc'ed才能使插入的字符串可用于gc。考虑到我一直在看着它发生而没有卸载任何东西,这真是太奇怪了。你的说法不正确。答案中的代码将向您显示,实际上,在现代JVMAH中,插入的字符串是GC'd的。如果您显式插入字符串,那么是的。是的,我同意。我说的是由jvm托管的标准常量,我在寻找某种形式的jvm参数来禁用托管。如前所述,这仅用于试验目的。谢谢