`
leonzhx
  • 浏览: 767886 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

读”Java 性能优化之 String 篇“有感

阅读更多

读了 IBM Developer Works上的一篇 Java 性能优化之 String 篇  感觉写得比较实用,但也有一些问题值得斟酌:

 

1)关于内存空间的使用大小,虽然Java的基本类型的大小是固定的,不因运行环境而变化,但是Object overhead,以及Reference的大小是与平台相关的,比如在64bit的机器上Object overhead 应该是16 bytes,Reference是8bytes,这点应该说清楚。特别是作者是2012年发表的此文,这时应该64bit的系统比较普及了。

 

2)作者提到用如下方法重新构建子串,从原释放原来字符串的空间:

 String newString = new String(smallString.toCharArray()); 

 个人认为,这个不是个好方法,道先 toCharArray()会拷贝一次char[],但 new String(char[] value) 会再拷贝一次:

  public String(char value[]) {
        int size = value.length;
        this.offset = 0;
        this.count = size;
        this.value = Arrays.copyOf(value, size);
    }

 

比较好的方法是:

 String newString = new String(smallString); 

 看一下这个构造函数的原代码就知道了:

 public String(String original) {
        int size = original.count;
        char[] originalValue = original.value;
        char[] v;
        if (originalValue.length > size) {
            // The array representing the String is bigger than the new
            // String itself.  Perhaps this constructor is being called
            // in order to trim the baggage, so make a copy of the array.
            int off = original.offset;
            v = Arrays.copyOfRange(originalValue, off, off+size);
        } else {
            // The array representing the String is the same
            // size as the String, so no point in making a copy.
            v = originalValue;
        }
        this.offset = 0;
        this.count = size;
        this.value = v;
    }

 

3) 作者提到:

使用 String 的 intern()方法返回 JVM 对字符串缓存池里相应已存在的字符串引用,从而解决内存性能问题,但这个方法并不推荐!原因在于:首先,intern() 所使用的池会是 JVM 中一个全局的池,很多情况下我们的程序并不需要如此大作用域的缓存;其次,intern() 所使用的是 JVM heap 中 PermGen 相应的区域,在 JVM 中 PermGen 是用来存放装载类和创建类实例时用到的元数据。程序运行时所使用的内存绝大部分存放在 JVM heap 的其他区域,过多得使用 intern()将导致 PermGen 过度增长而最后返回 OutOfMemoryError,因为垃圾收集器不会对被缓存的 String 做垃圾回收。

他建议自己建一个 String Cache,但这个Cache也同样是占用了堆的(在new Gen或者Old Gen中),而且何时释放,怎么释放也很重要,如果用强引用也是不会被回收的。而Perm Gen虽然不会被回收,也是可以通过JVM参数来调节大小的。所以作者的理由不是很充分。我建议可以用Soft Reference来建这个自定义的String Cache。

 

3
4
分享到:
评论
3 楼 urfriend 2013-01-22  
cs6641468 写道
smallString都有了,干啥还要再赋给newString(或者说smallString咋得到的?)


我囧,看这篇文章前至少要先看原文吧--Java 性能优化之 String 篇--
2 楼 cs6641468 2013-01-21  
smallString都有了,干啥还要再赋给newString(或者说smallString咋得到的?)
1 楼 urfriend 2013-01-20  

相关推荐

    阿里巴巴Java性能调优实战(2021-2022华山版)+Java架构核心宝典+性能优化手册100技巧.rar

    性能优化手册是一套java性能学习研究小技巧,包含内容:Java性能优化、JVM性能优化、服务器性能优化、数据库性能优化、前端性能优化等。 内容包括但不限于: String 性能优化的 3 个小技巧 HashMap 7 种遍历方式...

    Java性能优化手册100技巧 中文PDF最新版

    性能优化手册是一套java性能学习研究小技巧,包含内容:Java性能优化、JVM性能优化、服务器性能优化、数据库性能优化、前端性能优化等。 内容包括但不限于: String 性能优化的 3 个小技巧 HashMap 7 种遍历方式...

    Java性能优化

    Java性能优化: 1.尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面: 控制资源的使用,通过线程同步...

    Java 之 String 类型

    Java 之 String 类型Java 之 String 类型

    java中Blob转String

    分享在JAVA中Blob转换成String实例

    java字符串转String数组简单实例

    java字符串转String数组简单实例,简单但很实用

    java代码-使用java增强for循环 string数组赋值的源代码

    java代码-使用java增强for循环 string数组赋值的源代码 ——学习参考资料:仅用于个人学习使用!

    StringUtil.java

    java编程中对字符串的各种方式的处理,包括(空字符串处理、判断是否是空字符串 null和"" 都返回 true、 把string array or list用给定的符号symbol连接成一个字符串、 判定第一个字符串是否等于的第二个字符串中的某...

    Java中String性能优化

    本文给大家分享的是如何在java中对String进行性能优化,使用String的时候需要有哪些注意事项呢,这就是今天我们要给大家总结分析的,有需要的小伙伴可以参考下。

    Java中颜色的String和Color对象之间的互相转换

    Java中颜色的String和Color对象之间的互相转换

    java代码优化简介

    可供程序利用的资源(内存、CPU时间...养成好的代码编写习惯非常重要,比如正确地、巧妙地运用java.lang.String类和java.util.Vector类,它能够显著地提高程序的性能。下面我们就来具体地分析一下这方面的问题。 .....

    java代码优化编程

    可供程序利用的资源(内存、CPU时间...养成好的代码编写习惯非常重要,比如正确地、巧妙地运用 java.lang.String类和java.util.Vector类,它能够 显着地提高程序的性能。下面我们就来具体地分析一下这方面的问题。 ……

    java中String类型转换方法.pdf

    java中String类型转换方法.pdf

    关于JAVA中int、String的类型转换

    初学者用于JAVA中int、String的类型转换的几种方法 并说明这其中的区别。

    Educoder题目:Java面向对象 - String类答案解析.md

    Educoder题目:Java面向对象 - String类答案解析

    Java优化编程(第2版)

    Java优化编程(第2版)通过丰富、完整、富有代表性的实例,展示了如何提升Java应用性能,并且给出了优化前与优化后的Java应用程序的性能差别,以实际的实例与数字告诉你,为什么不可以这么做,应该怎么做,深入分析...

    java基础String类选择题练习题

    java基础String类选择题练习题,文档包含了答案与分析,适合学习用,本文档仅仅用于学习分享,不得用于商业用途

    我们一起学Java之String

    这是《我们一起学Java》中的String篇章,是属于我个人原创,力求站在自学者的角度去阐述问题,希望大家喜欢!

    练习JAVA语句中的String

    java中String的一些练习,能更加熟练String的方法,更加好的学习JAVA

    java String 使用详解

    java String 使用详解,看完对String 的用法完全掌握

Global site tag (gtag.js) - Google Analytics