- 浏览: 332367 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (212)
- spring (21)
- design pattern(java) (12)
- linux-shell (28)
- java-thread (20)
- java-collection (6)
- java-reflect (9)
- mysql (11)
- java-io (7)
- java-util&lang&io (3)
- algorithm (3)
- interview (2)
- tools-eclipse (2)
- tools-maven (1)
- web-script (1)
- java组建 (13)
- 博客收藏 (1)
- 架构设计与实践 (10)
- active-mq (6)
- java-jvm&性能&原理 (27)
- tomcat (2)
- flume (1)
- serialization (2)
- git (1)
- cache&redis (8)
- guava (1)
- zookeeper (3)
- socket&tcp&udp&http (6)
- test (1)
最新评论
-
bbls:
有用有用有用
java-jvm-jstack-(监视器和锁的概念) -
王新春:
小侠有点帅哦 写道此流怎么关闭新春这个实现 可以不关闭的,哈哈 ...
源码剖析之java.io.ByteArrayOutputStream -
小侠有点帅哦:
此流怎么关闭新春
源码剖析之java.io.ByteArrayOutputStream -
cumt168:
写的很好为什么初始化参数,年轻代-Xmn10M def new ...
jvm之内存申请过程分析 -
ronin47:
应该是跟共享域名思路差不多,根据cookie的key作判断
跨域:一种通过服务端解决跨域的实现
----------~开篇分享一句话:【纸上得来终觉浅,绝知此事要躬行】~---------------------------------------
String.intern() 方法会自动把String放到jvm的PSPermGen的常量区。
关于String.intern()的使用需要注意以下两点:
1、对于日常工作中List中的数据对象,如果对象的某个属性是String,比如性别,国家等重复率较高的字符串取值,如果放入常量区,会节省大量的内存空间。
2、jvm的常量池的的搜索比较慢,速度甚至比ConcurrentHashMap 慢了不少。
证明:
JVM参数配置:
结果:
testIntern time :2657
testIntern memory:1.8076171875M
eden space 86272K, 3% used [0x00000000f9c00000,0x00000000f9f4b3f0,0x00000000ff040000)
结果:
Exception in thread "main" [Full GC [PSYoungGen: 81920K->0K(92160K)] [PSOldGen: 102400K->188K(102400K)] 184320K->188K(194560K) [PSPermGen: 3048K->3048K(21248K)], 0.0530156 secs] [Times: user=0.05 sys=0.00, real=0.05 secs]
java.lang.OutOfMemoryError: GC overhead limit exceeded
at java.lang.StringBuilder.toString(StringBuilder.java:430)
at com.mystore.core.common.TestMemory.testCommon(TestMemory.java:85)
at com.mystore.core.common.TestMemory.main(TestMemory.java:13)
结果:testIntern time :2006
testCurrentHashMap memory:1.9482421875
eden space 85888K, 3% used [0x00000000f9c00000,0x00000000f9f477f8,0x00000000fefe0000)
结论:
对比testCommon 和 testIntern 说明testCommon 会占用较多的堆区内存,testIntern 会导致常量区会有微量的增长(仅仅1000个字符常量而已)
对比testIntern 和 testCurrentHashMap ,testCurrentHashMap 在性能方面有优势,更为需要关注的是testCurrentHashMap的内存分配在了堆区,而testIntern 分配在了常量区,一般情况下 堆区的老年代要比持久代要大的多,所以从gc的角度来说,更应该使用testCurrentHashMap 的方式。不好的一点是 testCurrentHashMap 中的常量会一直增长没有过期 策略,而常量池则会在full gc 的时候自动做清理。testCurrentHashMap 优化的方向是 使用带缓存并且线程安全的Map,比如guava的缓存Map
参考: 性能对比参见 http://stackoverflow.com/questions/10624232/performance-penalty-of-string-intern
String.intern() 方法会自动把String放到jvm的PSPermGen的常量区。
关于String.intern()的使用需要注意以下两点:
1、对于日常工作中List中的数据对象,如果对象的某个属性是String,比如性别,国家等重复率较高的字符串取值,如果放入常量区,会节省大量的内存空间。
2、jvm的常量池的的搜索比较慢,速度甚至比ConcurrentHashMap 慢了不少。
证明:
JVM参数配置:
-Xmx200M -Xms200M -Xmn100M -XX:SurvivorRatio=8 -XX:+PrintGCDetails
public static long times = 10000000L; public static void testIntern() { System.gc(); List<String> list = new ArrayList<String>(); long l = System.currentTimeMillis(); for (int i = 0; i < times; i++) { list.add(("A" + (i % 1000)).intern()); } long ll = System.currentTimeMillis(); System.out.println("testIntern time :" + (ll -l)); System.gc(); System.out.println("testIntern:" + (wrapM(Runtime.getRuntime().totalMemory()) - wrapM(Runtime .getRuntime().freeMemory()))); }
结果:
testIntern time :2657
testIntern memory:1.8076171875M
eden space 86272K, 3% used [0x00000000f9c00000,0x00000000f9f4b3f0,0x00000000ff040000)
public static void testCommon() { System.gc(); List<String> list = new ArrayList<String>(); long l = System.currentTimeMillis(); for (int i = 0; i < times; i++) { list.add(("A" + (i % 1000))); } long ll = System.currentTimeMillis(); System.out.println("testIntern time :" + (ll -l)); System.gc(); System.out.println("testCommon memory:" + (wrapM(Runtime.getRuntime().totalMemory()) - wrapM(Runtime .getRuntime().freeMemory()))); }
结果:
Exception in thread "main" [Full GC [PSYoungGen: 81920K->0K(92160K)] [PSOldGen: 102400K->188K(102400K)] 184320K->188K(194560K) [PSPermGen: 3048K->3048K(21248K)], 0.0530156 secs] [Times: user=0.05 sys=0.00, real=0.05 secs]
java.lang.OutOfMemoryError: GC overhead limit exceeded
at java.lang.StringBuilder.toString(StringBuilder.java:430)
at com.mystore.core.common.TestMemory.testCommon(TestMemory.java:85)
at com.mystore.core.common.TestMemory.main(TestMemory.java:13)
public static void testCurrentHashMap() { System.gc(); List<String> list = new ArrayList<String>(); long l = System.currentTimeMillis(); for (int i = 0; i < times; i++) { list.add((StringCache.get("A" + (i % 1000)))); } long ll = System.currentTimeMillis(); System.out.println("testIntern time :" + (ll -l)); System.gc(); System.out.println("testCurrentHashMap memory:" + (wrapM(Runtime.getRuntime().totalMemory()) - wrapM(Runtime .getRuntime().freeMemory()))); } private static double wrapM(long length) { return length / 1024 / 1024.0; } static class StringCache { private static ConcurrentHashMap<String, String> map = new ConcurrentHashMap<String, String>(10000); public static String get(String str){ if(null == str){ return null; } String ret = map.get(str); if(null == ret){ map.putIfAbsent(str, str); ret = map.get(str); } return ret; } }
结果:testIntern time :2006
testCurrentHashMap memory:1.9482421875
eden space 85888K, 3% used [0x00000000f9c00000,0x00000000f9f477f8,0x00000000fefe0000)
结论:
对比testCommon 和 testIntern 说明testCommon 会占用较多的堆区内存,testIntern 会导致常量区会有微量的增长(仅仅1000个字符常量而已)
对比testIntern 和 testCurrentHashMap ,testCurrentHashMap 在性能方面有优势,更为需要关注的是testCurrentHashMap的内存分配在了堆区,而testIntern 分配在了常量区,一般情况下 堆区的老年代要比持久代要大的多,所以从gc的角度来说,更应该使用testCurrentHashMap 的方式。不好的一点是 testCurrentHashMap 中的常量会一直增长没有过期 策略,而常量池则会在full gc 的时候自动做清理。testCurrentHashMap 优化的方向是 使用带缓存并且线程安全的Map,比如guava的缓存Map
参考: 性能对比参见 http://stackoverflow.com/questions/10624232/performance-penalty-of-string-intern
发表评论
-
垃圾回收算法详解
2017-05-17 16:42 454可回收对象的判定【收藏,非原创】 讲算法之前,我们先要 ... -
垃圾回收算法&STOP The World
2017-05-15 11:50 621目前所有的新生代gc都是需要STW的: Seria ... -
java-jvm-jhat
2017-05-14 21:04 517功能:可以分析jmap dump下的hprof文件 一般 ... -
java-jvm-jinfo
2017-05-14 20:57 650jinfo: 1、输出 当前java进程启动的相关配置信息 ... -
jvm-gc 日志解读【转载】
2017-05-14 17:34 443转载自:http://ifeve.com/useful-j ... -
大量异常带来性能的影响
2017-05-09 19:08 638感受大量构造异常带来的性能影响: package com; ... -
iotop&iostat (load高 IO高的问题排查)
2017-04-27 20:40 2043目标:使用iotop&top&jstack ... -
java-jvm-jstack-(监视器和锁的概念)
2017-04-06 16:52 6438下面这段jstack的栈信息里,有一个死锁 其中: T ... -
java-jvm-jstack-线程状态
2017-03-31 14:42 2532常见的线程状态: RUNNABLE:正在执行的线程 注 ... -
java-jvm-cpu (cpu)高问题排查
2017-03-28 21:07 32951、通过top命令发现 cpu高的进程 根据top命令, ... -
java-jvm-jstack
2016-08-05 11:07 2166jstack用于打印出给定的java进程ID或core fi ... -
java-jvm好文收集
2016-08-05 10:50 390非常详细GC学习笔记http://blog.csdn.ne ... -
java-jvm-jstat
2016-08-05 10:30 606stat用于监控基于HotSpot ... -
java-jvm-jmap(高内存排查)
2016-07-29 13:51 3763功能:打印出某个java进程(使用pid)内存内的,所有‘对象 ... -
java-jvm-jps
2016-07-29 13:42 425jsp -q 只显示pid,不显示class名称,jar文件 ... -
OutOfMemoryError溢出
2016-03-29 23:29 801Java堆溢出: java.lang.OutOfMemor ... -
垃圾回收器的分类
2016-03-29 22:23 691基础: 串行收集器: DefNew:是使用-XX:+UseSe ... -
ClassLoader-线程上下文类加载器
2015-04-16 10:54 1121线程上下文类加载器 :http://blog.csdn.net ... -
ClassLoader-热替换
2015-04-05 20:27 2688https://www.ibm.com/developer ... -
ClassLoader-学习
2015-04-05 19:03 1023相关文章:https://www.ib ...
相关推荐
第4节: 揭秘JVM字符串常量池和Java堆-01第4节: 揭秘JVM字符串常量池和Java堆-01第4节: 揭秘JVM字符串常量池和Java堆-01第4节: 揭秘JVM字符串常量池和Java堆-01第4节: 揭秘JVM字符串常量池和Java堆-01第4节: ...
JVM常量池 Class常量池(静态常量池) 运行时常量池 字符串常量池(全局常量池) 包装类型缓存池 JVM常量池 Jvm常量池分为: Class常量池(静态常量池) 运行时常量池 字符串常量池(全局常量池) 包装类型缓存池 Class常量...
1. 字符串的分配,和其他的对象分配一样,耗费高昂的时间与空间代价,作为最基础的数据类型,大量频繁的创建 2. JVM为了提高性能和减少内存开销,在实例化字符串
实战JAVA虚拟机 JVM故障诊断与性能优化.pdf (无书签.低分放送) 实战JAVA虚拟机 JVM故障诊断与性能优化.pdf (无书签.低分放送) 实战JAVA虚拟机 JVM故障诊断与性能优化.pdf (无书签.低分放送)
jvm初识及JIT优化jvm初识及JIT优化jvm初识及JIT优化jvm初识及JIT优化jvm初识及JIT优化jvm初识及JIT优化jvm初识及JIT优化jvm初识及JIT优化jvm初识及JIT优化jvm初识及JIT优化jvm初识及JIT优化jvm初识及JIT优化jvm初识...
常量池静态常量池即*.class文件中的常量池,用于存放字面量和符号引用运行时常量池是jvm运行期间,存储常量的数据结构运行时常量池概念运行时常量池(Runti
实战JAVA虚拟机 JVM故障诊断与性能优化带源码 实战JAVA虚拟机 JVM故障诊断与性能优化带源码
实战Java虚拟机_JVM故障诊断与性能优化 JVM故障诊断与性能优化 JVM调优
随着越来越多的第三方语言(Groovy、Scala、JRuby等)在Java虚拟机上运行,...《实战Java虚拟机——JVM故障诊断与性能优化》不仅适合Java程序员,还适合任何一名工作于Java虚拟机之上的研发人员、软件设计师、架构师。
(1)类及方法的信息等比较难确定其大小,因此对于永久代的大小指定比较困难,太小容易出现永久代溢出,太 (2)永久代会为 GC 带来不必要的复杂度,并且回收效率偏
实战JAVA虚拟机 JVM故障诊断与性能优化
1 什么是性能优化\ 2 性能测试与优化\ 3 性能优化JVM篇\ 4 性能优化Tomcat篇\ 5 性能优化mysql篇\
实战Java虚拟机——JVM故障诊断与性能优化.pdf 实战Java虚拟机——JVM故障诊断与性能优化.pdf
实战JAVA虚拟机 JVM故障诊断与性能优化
实战Java虚拟机 JVM故障诊断与性能优化 葛一鸣 原书code
《实战Java虚拟机——JVM故障诊断与性能优化》内容简介:随着越来越多的第三方语言(Groovy、Scala、JRuby等)在Java虚拟机上运行,Java也俨然成为一个充满活力的生态圈。本书将通过200余示例详细介绍Java虚拟机中的...
1、举例说明 变量 常量 字面量 1 int a=10; 2 float b=1.234f; 3 String c="abc"; 4 final long d=10L; a,b,c为变量,d为常量 两者都是左值;... 运行时常量池:是jvm虚拟机在完成类装
本代码是《实战Java虚拟机——JVM故障诊断与性能优化》一书的随书源代码
非扫描版 文字版高清 可以复制