`
zwhc
  • 浏览: 264809 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

关于 《Java 性能优化之 String 篇》 的疑问

    博客分类:
  • java
阅读更多
原文地址在:
http://www.ibm.com/developerworks/cn/java/j-lo-optmizestring/?cmp=dwskl&cpb=dw&ct=dwcon&cr=cn_swb&ccy=cn

文中说:
仔细观察粗体这行代码我们发现 String.substring()所返回的 String 仍然会保存原始 String, 这就是 20,000 个平均长度的单词竟然占用了上百兆的内存的原因。 一个 csv 文件中每一行都是一份很长的数据,包含了上千的单词,最后被 String.split() 或 String.substring()截取出的每一个单词仍旧包含了其原先所在的上下文中,因而导致了出乎意料的大量的内存消耗。

我对这段话比较怀疑。

String 类中的这个构造函数:
 String(int offset, int count, char value[]) { 
 this.value = value; 
 this.offset = offset; 
 this.count = count; 
 } 


所用到的 value 应该是引用类型吧。不应该消耗内存才对。

写了段代码测试了一下:
		Runtime rt = Runtime.getRuntime();
		System.out.println("maxMemory:" + rt.maxMemory());
		System.out.println("totalMemory_01:" + rt.totalMemory());

		StringBuffer sb = new StringBuffer();
		for(int i=0; i<1024*512; i++)
		{
			sb.append("0123456789");
		}
		System.out.println("totalMemory_02:" + rt.totalMemory());
		
		String s = sb.toString();
		
		//Thread.sleep(1000);
		
		String[] ss = new String[5];
		for(int i=0; i<ss.length; i++)
		{
			ss[i] = s.substring(i*11, i*11 + 13);
			System.out.println("totalMemory_03:" + rt.totalMemory());
			System.out.println("ss[i]:" + ss[i]);
			//Thread.sleep(5000);
		}

运行结果如下:
maxMemory:66650112
totalMemory_01:2031616
totalMemory_02:39538688
totalMemory_03:40980480
ss[i]:0123456789012
totalMemory_03:40980480
ss[i]:1234567890123
totalMemory_03:40980480
ss[i]:2345678901234
totalMemory_03:40980480
ss[i]:3456789012345
totalMemory_03:40980480
ss[i]:4567890123456

很明显,substring 并不会引起内存消耗增大。

===========================

前几天想了一下,原文所说的占用内存,应该是 substring 导致原始数据的字符串里的 用到的char[] 对象无法释放(垃圾回收)引起的。

有空我再写个程序验证一下。唔唔,这个好象不太好写。
0
0
分享到:
评论

相关推荐

    Java redis五种数据类型在Java中的详细使用

    通过深入理解和熟练运用这些数据类型,你可以充分利用Redis的强大功能,优化应用程序性能。 总结:本教程详细介绍了Redis的五种数据类型在Java中的应用,包括字符串、哈希、列表、集合和有序集合。通过实例代码展示...

    java疑问收集

    根据给定文件的信息,我们可以提炼出与Java相关的几个重要知识点,并对其进行详细解释。 ### Java中的`static`关键字 ...此外,深入理解`static`的工作原理有助于更好地设计类结构和优化程序性能。

    JAVA面试题解惑系列

    String的不可变性意味着一旦创建,就不能改变,这涉及到了内存管理和性能优化。 7. **日期和时间的处理**: Java提供了多种处理日期和时间的API,如Date、Calendar和后来的Java 8中的LocalDateTime等。面试中可能...

    java9中文API

    Java 9是Java平台标准版(Java SE)的一个重要版本,带来了许多新特性和改进,旨在提高性能、安全性和可维护性。这个压缩包文件包含了Java 9的中文API文档,尽管是通过谷歌翻译,可能在理解上存在一定的偏差,但仍然...

    Java @@@@@Java谁打的

    11. **Java虚拟机(JVM)**:了解其工作原理,内存模型,以及如何进行性能优化。 12. **标准库API**:掌握Java提供的大量内置类和方法,如Math、String、Date等。 13. **Lambda表达式**:Java 8引入的新特性,简化...

    java 编程 经典案例集锦

    案例会展示如何存储、检索和操作数据,以及如何选择合适的数据结构以优化性能。 5. **字符串处理**:字符串在编程中广泛应用,案例会涵盖String类的常用方法,如concat()、substring()、indexOf()、trim()等,以及...

    jdk-source-analysis:java jdk源代码分析-java source code analysis

    本项目专注于JDK 1.8版本的源代码分析,旨在帮助开发者更深入地理解Java语言的底层实现,提升编程技能,并为优化和调试代码提供理论基础。 在这个项目中,源代码被细致地注解,以直观易懂的方式解释了各个类和方法...

    FastJson1.2.5

    FastJson是阿里巴巴开发的一款高效的Java语言编写的JSON库,它具有极快的性能,广泛的功能以及易用性。"FastJson1.2.5"版本是这个库的一个具体发行版,包含了FastJson的所有核心功能以及可能的更新和优化。在这个...

    hibernate动态映射表处理oracle的clob类型

    5. **性能优化**:处理CLOB时,需注意性能问题。例如,频繁读写CLOB可能导致性能下降,因此在设计系统时要考虑读写频率和数据量。 6. **示例代码**:在Hibernate中,读取和写入CLOB的代码可能如下: ```java // ...

    C#开发Android应用程序的方法和流程

    然而,C#开发Android应用也有其局限,比如可能需要购买授权,以及可能比Java有更高的性能成本。因此,开发者在选择开发语言时需要权衡各种因素,包括团队的技能集、项目的预算和性能需求等。 总的来说,C#开发...

    二十三种设计模式【PDF版】

    提供 Java运行性能,降低小而大量重复的类的开销. C. 行为模式 设计模式之 Command(命令) 什么是将行为封装,Command 是最好的说明. 设计模式之 Observer(观察者) 介绍如何使用 Java API 提供的现成 Observer ...

    poi 源码包、带文档

    拥有Apache POI的源码包和文档,你可以深入研究其内部实现,比如了解如何解析和构建XML文档来处理OOXML格式,或者研究如何优化性能以处理大量数据。同时,文档可以帮助你快速定位问题,解决在使用过程中遇到的任何...

    PHP新手上路中文教程(推荐)

    1. **输入验证**:使用 `htmlspecialchars()` 防止XSS攻击,`mysqli_real_escape_string()` 防止SQL注入。 2. **密码安全**:使用 `password_hash()` 和 `password_verify()` 处理用户密码。 3. **文件上传安全**...

    SuperBadge,超级徽章Android库.zip

    - 设置徽章内容:调用`setContent(String content)`或`setContent(int resId)`方法设置文本或字符串资源。 - 自定义样式:通过`setShapeType`可以改变徽章形状(如圆形、矩形等),`setTextColor`和`...

Global site tag (gtag.js) - Google Analytics