`
leonzhx
  • 浏览: 803818 次
  • 性别: 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关于基础和框架的面试题

    - **java.lang**: 包含所有基本类,如`String`、`Math`等。 - **java.util**: 提供集合框架、日期/时间设施、事件模型、杂项实用程序类(如哈希映射)、工厂、以及并发机制。 - **java.io**: 包含输入/输出类。 - **...

    java8源码-guava-demo:番石榴演示

    通过查看源码可以学习到“设计模式运用”,“工具类方法的编写规范”,“代码性能优化”,“最佳实践”等很多相关的知识点,是一套 值得学习研究的源码库。不过具体是否应用依据项目而定,在Java8环境下,Java8同样提供...

    java8examples

    - **并发集合增强**:`ConcurrentHashMap`、`ConcurrentLinkedQueue` 等并发集合类也得到了优化,性能提升。 7. **类型接口**: `@FunctionalInterface` 注解可以明确指定一个接口是函数式接口,编译器会检查该...

    renzheng.rar

    1. 性能优化:由于模糊查询可能涉及全表扫描,对于大数据量的表,性能问题不容忽视。可以通过建立全文索引、分词处理或者使用倒排索引等技术来优化查询速度。 2. 安全性:防止SQL注入是必须考虑的问题。使用MyBatis...

    xUtils3-1.01master.zip

    其1.01master版本是该框架的一个稳定分支,包含了多项改进和优化。 一、核心特性 1. 数据库操作:xUtils3内置了LiteOrm数据库操作库,提供了简单易用的API,使得数据库操作如同操作Java对象一样便捷,支持ORM...

    Web2.0技术大作业 博客系统报告文档.docx

    - 数据库的设计考虑了数据安全和性能优化的需求。 2. **未来发展** - 可以进一步增加更多社交功能,如群组聊天、直播等。 - 考虑集成更多的第三方服务,如支付接口等,拓展系统的应用场景。 - 持续优化用户体验...

    Android RecyclerView的刷新分页的实现

    如果使用了DiffUtil,可以进一步优化数据更新性能。 6. **添加FooterItem**:在数据加载期间,显示一个FooterItem,表示数据正在加载。加载完成后,移除FooterItem或者替换为加载成功的提示。 以下是一个简单的...

Global site tag (gtag.js) - Google Analytics