`
elvisli
  • 浏览: 18480 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java性能优化[1]:基本类型 vs 引用类型

阅读更多

在Java性能优化系列 中,内存管理是一个要优先考虑的关键因素。而说到内存分配,就必然会涉及到基本类型和引用类型。所以我们今天就先来介绍一下这两种类型在性能方面各自有什么奥妙(关于引用类型的其它奥妙,请看“这里 ”)。

  ★名词定义
  先明确一下什么是基本类型,什么是引用类型。简单地说,所谓基本类型就是Java语言中如下的8种内置类型:boolean、char、byte、 short、int、long、float、double。而引用类型就是那些可以通过new来创建对象的类型(基本上都是派生自Object)。

  ★两种类型的存储方式
  这两种类型的差异,首先体现在存储方式上。
  ◇引用类型的创建
  当你在函数中 创建一个引用类型的对象时,比如下面的语句:
  StringBuffer str = new StringBuffer();
  该StringBuffer对象 的内容是存储在堆(Heap)上的,需要申请堆内存。而变量str只不过是针对该StringBuffer对象的一个引用(或者叫地址)。变量str的值 (也就是StringBuffer对象的地址)是存储在栈上的。
  ◇基本类型的创建
  当你在函数中 创建一个基本类型的变量时,比如如下语句:
  int n = 123;
  这个变量n的值 也是存储在栈(Stack)上的,但是这个语句不需要再从堆中申请内存了。

为了更加形象,便于大伙儿理解,简单画了一个示意图如下:


  ★堆和栈的性能差异
  可能有同学会小声问:堆和栈有啥区别捏?要说堆和栈的差别,那可就大了去了。如果你对这两个概念还是不太明白或者经常混淆,建议先找本操作系统的书拜读一下。
  由于本系列 是介绍性能,所以来讨论一下堆和栈在性能方面的差别(这个差异是很大滴)。堆相对进程来说是全局的,能够被所有线程访问;而栈是线程局部的,只能本线程访问。打个比方,栈就好比个人小金库,堆就好比国库。你从个人小金库拿钱去花,不需要办什么手续,拿了就花,但是钱数有限;而国库里面的钱虽然很多,但是每次申请花钱要打报告、盖图章、办N多手续,耗时又费力。
  同样道理,由于堆是所有线程共有的,从堆里面申请内存要进行相关的加锁操作,因此申请堆内存的复杂度和时间开销比栈要大很多;从栈里面申请内存,虽然又简单又快,但是栈的大小有限,分配不了太多内存。

  ★为什么这样设计?
  可能有同学又问了,干嘛把两种类型分开存储,干嘛不放到一起捏?这个问题问得好!下面我们就来揣测一下,当初Java为啥设计成这样。
  当年Java它爹(James Gosling )设计语言的时候,对于这个问题有点进退两难。如果把各种东东都放置到栈中,显然不现实,一来栈是线程私有的(不便于共享),二来栈的大小是有限的,三来栈的结构也间接限制了它的用途。那为啥不把各种东东都放置到堆里面捏?都放堆里面,倒是能绕过上述问题,但是刚才也提到了,申请堆内存要办很多手续,太繁琐。如果仅仅在函数中写一个简单的“int n = 0; ”,也要到堆里面去分配内存,那性能就大大滴差了(要知道Java是1995年生出来的,那年头我家的PC配4兆内存就属豪华配置了)。
  左思右想之后,Java它爹只好做了一个折中:把类型分为基本类型和引用类型,两者使用不同的创建方式。这种差异从Java语法上也可以看出来:引用类型可以用new创建对象(对于某些单键,表面上没用new,但是在getInstance()内部也还是用的new);而基本类型则不需要用new来创建。

  ★这样设计的弊端
  顺便跑题一下,斗胆评价Java它爹这种设计的弊端(希望Java Fans不要跟我急)。我个人认为:这个折中的决策,带来了许多深远的影响,随手举出几个例子:
  1、由于基本类型不是派生自Object,因此不能算是纯种的对象。这导致了Java的“纯 面向对象”招牌打了折扣(当年Sun老是吹嘘Java是纯 OO的语言)。
  2、由于基本类型不是派生自Object,出于某些场合(比如容器类)的考虑,不得不为每个基本类型加上对应的包装类(比如Integer、Byte等),使得语言变得有点冗余。

  ★结论
  从上述的介绍,我们应该明白,使用new创建对象的开销是不小 的。在程序中能避免就应该尽量避免。另外,使用new创建对象,不光是创建时开销大,将来垃圾回收时,销毁对象也是有开销的(关于GC的开销,咱们会在后面的帖子细谈)。下一个帖子 ,我们找一个例子来实战一下。

 

版权声明
本博客所有的原创文章,作者皆保留版权。转载必须包含本声明,保持本文完整,并以超链接形式注明作者编程随想 和本文原始地址:

http://program-think.blogspot.com/2009/03/java-performance-tuning-1-two-types.html

 

分享到:
评论

相关推荐

    Java性能优化

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

    大话Java性能优化

    1.2 性能优化的参考因素 1.3 性能调优分类方法 1.4 本章小结 第2章 优化前的准备知识 2.1 服务器知识 2.2 新兴技术 第3章 Java API调用优化建议 3.1 面向对象及基础类型 3.2 集合类概念 3.3 字符串概念 ...

    JAVA最佳性能优化.pptx

    JAVA最佳性能优 化JAVA优化技巧 类的方法内联,方法的同步及局部变量的使用 创建类的实例优化策略 建立对象池提升性能策略 JAVA垃圾回收机制及引用优化策略

    Java优化编程(第2版)

    第4章 java核心类与性能优化 4.1 散列表类与性能优化 4.1.1 线程同步散列表类 4.1.2 设置arraylist初始化容量 4.1.3 arraylist与linkedlist 4.2 string类与性能优化 4.2.1 字符串累加与性能优化 4.2.2 字符串的...

    3Java性能优化三.zip

    对JVM虚拟机进行优化也能一定程度上的提升JAVA程序的性能。JVM通常能够在软件开发后期进行,如在开发完毕或者是软件开发的某一里程碑阶段。 作为JAVA软件的执行平台。JVM的各项參数将会直接影响JAVA程序的性能。 ...

    4Java性能优化四.zip

    对JVM虚拟机进行优化也能一定程度上的提升JAVA程序的性能。JVM通常能够在软件开发后期进行,如在开发完毕或者是软件开发的某一里程碑阶段。 作为JAVA软件的执行平台。JVM的各项參数将会直接影响JAVA程序的性能。 ...

    JAVA性能瓶颈和漏洞检测

    JProbe在简单易用的集成化套件中,为servlet、JSP和EJB应用代码提供了强大的Java性能分析、内存纠错、代码覆盖及线程分析功能。 JProbe Profiler JProbe Profiler * JProbe Profiler JProbe Profiler内置了Call ...

    java源码包2

    2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统...

    Java性能优化的50个细节(珍藏版)

    在JAVA程序中,性能问题的大部分原因并不在于JAVA语言,而是程序本身。养成良好的编码习惯非常重要,能够显著地提升程序性能。1.尽量在合适的场合使用单例使用单例可以减轻加载的负担,缩短加载的时间,提高加载的...

    java源码包---java 源码 大量 实例

    2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性...

    Java应用性能监控最佳实践

    针对复杂的java应用环境进行全方面的性能监控与管理,文章中引用了ca wily apm解决方案,阐述了如何利用外部工具帮助优化java应用系统的性能,确保用户使用体验,针对weblogic,websphere,jboss等主流java中间件...

    java源码包4

    2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统...

    JAVA性能瓶颈和漏洞检测].JProbe.Suite.v7.0.part1

    JProbe在简单易用的集成化套件中,为servlet、JSP和EJB应用代码提供了强大的Java性能分析、内存纠错、代码覆盖及线程分析功能。 JProbe Profiler JProbe Profiler * JProbe Profiler JProbe Profiler内置了Call ...

    java源码包3

    2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统...

    JAVA上百实例源码以及开源项目

     在对象创建的过程中将被容器调用,onMessage函数方法接收消息参数,将其强制转型为合适的消息类型,同时打印出消息的内容。同时一个mail note将被发送给消息发送者,发送一个e-mail通知给由recipient参数确定的e-...

    JAVA上百实例源码以及开源项目源代码

    2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM机...

    JAVA性能瓶颈和漏洞检测.JProbe.Suite.v7.0.part2

    JProbe在简单易用的集成化套件中,为servlet、JSP和EJB应用代码提供了强大的Java性能分析、内存纠错、代码覆盖及线程分析功能。 JProbe Profiler JProbe Profiler * JProbe Profiler JProbe Profiler内置了Call ...

    Android开发技巧与性能优化

    1. 最常用的 ECLIPSE ECLIPSE ECLIPSE ECLIPSE 快捷键& 模拟器快捷键 1.1E CLIPSE 快捷键 1.2 模拟器快捷键 2.ECLISPE 使用技巧 2.1 密技篇: 2.2 外挂篇: 2.3 一般插件安装 2.4 安装 M YECLIPSE 2.5自定义注释 ...

    Java编程性能优化的技巧

    2.尽量避免随意使用静态变量要知道,当某个对象被定义为static变量所引用,那么GC通常是不会回收这个对象所占有的内存,如:此时静态变量b的生命周期与A类同步,如果A类不会卸载,那么b对象会常驻内存,直到程序终止...

Global site tag (gtag.js) - Google Analytics