Tag: string interning

同步死锁(String intern())

我用户sun jdk 1.5 ThreadPoolExecutor(24,24,60,TimeUnit.SECONDS,new LinkedBlockingQueue())。 soemtime我用jdb工具查找线程池中所有线程的状态是“在监视器中等待”,代码是: String key = getKey(dt.getPrefix(), id); synchronized (key.intern()) { —–> “synchronized(key.intern())”中有问题吗? 我使用jdb工具跟踪informatnio,24个线程的状态是“在监视器中等待”,这意味着24个线程在“key.intern()”处于死锁状态。 (java.lang.Thread)0x28 pool-3-thread-2在监视器中等待 (java.lang.Thread)0x27 pool-3-thread-3在监视器中等待 (java.lang.Thread)0x1b pool-3-thread-4在监视器中等待 (java.lang.Thread)0x1a pool-3-thread-5在监视器中等待 (java.lang.Thread)0x19 pool-3-thread-6在监视器中等待 (java.lang.Thread)0x18 pool-3-thread-7在监视器中等待 (java.lang.Thread)0x17 pool-3-thread-8在监视器中等待… 所以结果是:在multithreading环境中,Sting intern()方法可能是死锁,好吗?

为什么注释字符串值没有实现?

尽管重用了字符串常量和文字,但以下代码段打印出4个不同的哈希码。 为什么字符串值没有插入注释元素? public class Foo { @Retention(RetentionPolicy.RUNTIME) @interface Bar { String CONSTANT = “foo”; String value() default CONSTANT; } public static void main(String[] args) throws Exception { System.out.println(System.identityHashCode(Bar.CONSTANT)); System.out.println(System.identityHashCode(Foo.class.getMethod(“test1”).getAnnotation(Bar.class).value())); System.out.println(System.identityHashCode(Foo.class.getMethod(“test2”).getAnnotation(Bar.class).value())); System.out.println(System.identityHashCode(Foo.class.getMethod(“test3”).getAnnotation(Bar.class).value())); } @Bar public void test1() {} @Bar(“foo”) public void test2() {} @Bar(Bar.CONSTANT) public void test3() {} }

Java字符串实习的替代方案

由于Java的默认字符串实习有很多坏消息,我正在寻找替代方案。 你能建议一个API,它是Java字符串实习的一个很好的替代品吗? 我的应用程序使用Java 6.我的要求主要是通过实习来避免重复的字符串。 关于坏消息: 字符串实习生是通过本机方法实现的。 并且C实现使用大约1k个条目的固定大小,并且对于大量字符串进行非常差的扩展。 Java 6在Perm gen中存储实习字符串。 因此不是GC并且可能导致烫发错误。 我知道这在java 7中已修复,但我无法升级到java 7。 为什么我需要使用intering? 我的应用程序是一个服务器应用程序,堆大小为10-20G,适用于不同的部署。 在分析期间,我们已经发现数千个字符串的数据是重复的,我们可以通过避免存储重复的字符串来显着提高内存使用率。 内存一直是我们的瓶颈,因此我们正在针对它而不是进行任何过早的优化。

关于java的实习生

我的问题是,如果实习生正在使用字符串和字符串有一个SPC(字符串池常量)为它和实习生概念也使用整数,所以是否有任何整数池常量?如果没有那么它是如何工作的? class InternExample { public void print() { Integer i=10; Integer j=10; String c=”a”; String s=”a”; System.out.println(i==j);// prints true System.out.println(c==s);//prints true } public static void main(String args[]) { new InternExample().print(); } }

字符串实习在Java 7+中如何工作?

所以,我意识到我要提出的问题涉及到一次又一次被打死的话题,然而,即使在阅读了我能找到的所有答案和文档之后,我仍然对此感到困惑。字符串实习。 也许是因为我对JVM缺乏了解; 也许是因为Java 7中引入的变化使许多上述答案和文档贬值。 无论哪种方式,我都被卡住了,我希望有人可以帮助我更清楚地理解这个概念…… String a = “text”; String b = new String(“text”); 在上面的例子中,我理解将创建两个String对象。 我也明白在内存中只有一个包含序列’t’,’e’,’x’和’t’的char数组。 但是,在内存中实际存储的每个字符串对象是什么? 如果我读过的内容我已经正确阅读:变量a的引用将存储在常量池中,而b的引用将存储在堆中,对吧? 如果是这种情况,我对实习池如何维护实习字符串感到困惑。 它是否跟踪常量池中定义的字符串以及从堆中手动内化(调用.intern() )的字符串? JVM是否创建在常量池中定义的字符串对象并将它们加载到实习池中? 我很困惑这一切是如何运作的…… 再次,对于提出这样令人困惑/愚蠢的问题感到遗憾,只是我对JVM的结构和内部工作相对较新,而且其中很多都让我头晕目眩。 谢谢!

真实生活,在Java中使用String.intern()的实际例子?

我已经看到很多原始的例子描述了String intern()的工作原理,但是我还没有看到一个可以从中受益的真实用例。 我梦寐以求的唯一情况是拥有一个接收大量请求的Web服务,由于僵化的架构,每个请求都非常相似。 通过intern()在这种情况下使用请求字段名称,可以显着减少内存消耗。 任何人都可以提供在生产环境中使用intern()并取得巨大成功的示例吗? 也许是一个流行的开源产品的例子? 编辑:我指的是手动实习,而不是字符串文字的保证实习等。

为什么这些字符串的str == str.intern()结果不同?

public static void main(String[] args) { String str1 = new StringBuilder(“计算机”).append(“软件”).toString(); System.out.println(str1.intern() == str1); String str2 = new StringBuffer(“ja”).append(“va”).toString(); System.out.println(str2.intern() == str2); } 结果: true false 第一个打印为true ,第二个打印为false 。 为什么结果不同?

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

以下是MSDN的摘录: 公共语言运行库通过维护一个名为intern pool的表来保存字符串存储,该表包含对程序中以编程方式声明或创建的每个唯一文字字符串的单个引用。 因此,具有特定值的文字字符串实例仅在系统中存在一次。 例如,如果将相同的文字字符串分配给多个变量,则运行时将从实习池中检索对文字字符串的相同引用,并将其分配给每个变量。 Intern方法使用实习池来搜索等于str值的字符串。 如果存在此类字符串,则返回其在实习池中的引用。 如果该字符串不存在,则将对str的引用添加到实习池中,然后返回该引用。 ….如果您正在尝试减少应用程序分配的内存总量,请记住,实习字符串有两个不需要的副作用。 首先,在公共语言运行时(CLR)终止之前,不太可能释放为被占用的String对象分配的内存。 那么,这是否意味着CLR为所有正在运行的.net应用程序保留一个单一的实习池? 示例:如果程序A创建字符串文字“Test”,并且如果另一个程序尝试创建另一个字符串文字“Test”,则使用相同的副本? 同样的问题也适用于JVM。

哪个调试工具可以列出内部化的字符串?

我正在寻找一个可以列出已经内化的字符串的调试工具? 理想情况下,我想添加一个标记并列出在该标记之后添加的字符串列表。 提前致谢。

java字符串连接和实习

问题1 String a1 = “I Love” + ” Java”; String a2 = “I Love ” + “Java”; System.out.println( a1 == a2 ); // true String b1 = “I Love”; b1 += ” Java”; String b2 = “I Love “; b2 += “Java”; System.out.println( b1 == b2 ); // false 在第一种情况下,我理解它是两个字符串文字的串联,因此结果“I Love Java”将被实现,结果为真。 但是,我不确定第二种情况。 问题2 String […]