之前的印象都是string pool分配在perm gen内存中的,也通过intern方法验证过perm gen的oom,今天在用jprofiler观察时却发现是heap一直在做gc,直到报heap oom,还以为是测试代码有误,检查了好久猛然想到会不会是jdk7对intern方法有改变呢?参考http://www.oracle.com/technetwork/java/javase/jdk7-relnotes-418459.html,原文如下:
Area: HotSpot Synopsis: In JDK 7, interned strings are no longer allocated in the permanent generation of the Java heap, but are instead allocated in the main part of the Java heap (known as the young and old generations), along with the other objects created by the application. This change will result in more data residing in the main Java heap, and less data in the permanent generation, and thus may require heap sizes to be adjusted. Most applications will see only relatively small differences in heap usage due to this change, but larger applications that load many classes or make heavy use of the String.intern() method will see more significant differences. RFE: 6962931
参考这篇文章http://www.tuicool.com/articles/Q73YRf,里面有个案例也很有代表性
String.intern放进的String Pool是一个固定大小的Hashtable,默认值是1009,如果放进String Pool的String非常多,就会造成Hash冲突严重,从而导致链表会很长,而链表长了后直接会造成的影响就是当调用String.intern时性能会大幅下降(因为要一个一个找)。 之前碰到过一个频繁抛异常造成cpu us很高的case: http://bluedavy.me/?p=409 现在仔细想想,看来当时这个case并不是因为频繁抛异常造成的,而是因为这个case中抛的是NoSuchMethodException,而抛这个异常的原因是因为调用了Class.getMethod找方法没找到,在class.getMethod这方法的实现里会调用name.intern,而很不幸的是这个case里传入的name会根据请求而变,因此导致了String Pool中放入了很多的String,hash冲突严重,链表变长,从而才导致了造成了String.intern过程变得比较耗CPU。 JDK为了解决这个问题,在6u32以及JDK 7的版本里支持了StringTable大小的配置功能,可在启动参数上增加-XX:StringTableSize来设置,不过目前JDK未提供方法来查看StringTable中各桶的链表长度,如果提供这个的话就更好了。
相关推荐
关于String.intern()方法,这个问题都被问烂了,有的文章在分析的时候还在用jdk1.7,jdk1.8之后内存模型发生了变化,内存的变化也会影响intern方法的执行,这里有必要写文章分析一下,请大家务必从头开始看,这样...
pos文件是ProcessOn的源文件,可以导入后直接打开编辑。 内容是:不同jdk版本下对String的intern()的分析
这篇文章将要讨论 Java 6 中是如何实现 String.intern 方法的,以及这个方法在 Java 7 以及 Java 8 中做了哪些调整。
在INTERNET大发展时,由于它能提供较高的访问速度,一度受到青睐,装机容量有较大的发展。作为一种实用的技术,在目前的网络中仍占有一定的地位。但由于新的技术如ADSL的广泛应用,其发展前景有待进一步观察。
一些jar包和spring,ajax的配置信息,参考价值不高
intern, 面向JavaScript的下一代代码测试 实习生面向人类的软件测试 实习生是一个完整的JavaScript测试系统,用于帮助你编写和运行一致的。高质量的JavaScript库和应用。 它可以被用来测试任何的JavaScript代码。...
intern-001嗷嗷啊
laravel-intern.sql
Interndfbgfdvhgfgfdkkkmj
java中String类的intern、split方法的详细讲解。
主要介绍了通过String.intern()方法浅谈堆中常量池,在JDK7之前,字符串常量是存在永久带Perm 区的,JDK7开始在将常量池迁移到堆中,这个变化也导致了String的新特性,下面我们慢慢进行介绍。,需要的朋友可以参考下
字符串常量池 字符串在java程序中被大量使用,为了避免每次都创建相同的字符串对象及内存分配,JVM内部对字符串对象的创建做了一定的优化,...在JDK7.0中,由于String#intern()发生了改变,因此String Pool中也可以存
intern-app
my own intern project,no need to download...
my intern material, no need to download,useless
700套高端简历模板,可以让早工作的你给hr眼前一亮,妹子票子都是立马就来!!! 解压密码:intern021
intern机制: 字符串类型作为Python中最常用的数据类型之一,Python解释器为了提高字符串使用的效率和使用性能,做了很多优化,例如:Python解释器中使用了 intern(字符串驻留)的技术来提高字符串效率,什么是...
intern
Intern