快速业务通道

Java性能优化[1]:基本类型 vs 引用类型 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-24

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

时间:2010-01-06 csdn博客 编程随想

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

★名词定义

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

★两种类型的存储方式

这两种类型的差异,首先体现在存储方式上。在Java中,引用类型是存储在堆(Heap)上的;而基本 类型是存储在栈(Stack)上。可能有同学会小声问:堆和栈有啥区别捏?要说堆和栈的差别,那可就大 了去了。如果你对这两个概念还是不太明白或者经常混淆,建议先找本操作系统的书拜读一下。

★堆和栈的性能差异

堆和栈在性能方面是有很大差别滴。堆相对进程来说是全局的,能够被所有线程访问;而栈是线程局 部的,只能本线程访问。打个比方,栈就好比个人小金库,堆就好比国库。你从个人小金库拿钱去花, 不需要办什么手续,拿了就花,但是钱数有限;而国库里面的钱虽然很多,但是每次申请花钱要打报告 、盖图章、办N多手续,耗时又费力。

同样道理,由于堆是所有线程共有的,从堆里面申请内存要进行相关的加锁操作,因此申请堆内存的 复杂度和时间开销比栈要大很多;从栈里面申请内存,虽然又简单又快,但是栈的大小有限,分配不了 太多内存。

★为什么这样设计?

可能有同学又问了,干嘛把两种类型分开存储,干嘛不放到一起捏?这个问题问得好!下面我们就来 揣测一下,当初Java为啥设计成这样。

当年Java它爹(James Gosling)设计语言的时候,对于这个问题有点进退两难。如果把各种东东都 放置到栈中,显然不现实,一来栈是线程私有的(不便于共享),二来栈的大小是有限的,三来栈的结 构也间接限制了它的用途。那为啥不把各种东东都放置到堆里面捏?都放堆里面,倒是能绕过上述问题 ,但是刚才也提到了,申请堆内存要办很多手续,太繁琐。如果仅仅在函数中写一个简单的“int n = 0”,也要到堆里面去分配内存,那性能就大大滴差了(要知道Java是1995年生出来的,那年 头我家的PC配4兆内存就属豪华配置了)。

左思右想之后,Java它爹只好做了一个折中:把类型分为基本类型和引用类型;引用类型(Object派 生)的对象存放到堆里面;把基本类型(非Object派生)的值存放到栈里面。所以,你从Java语法上也 可以看出两者的差别:引用类型可以用new创建对象(对于某些单键,表面上没用new,但是在 getInstance()内部也还是用的new);而基本类型则不需要用new来创建。

★这样设计的弊端

顺便跑题一下,斗胆评价Java它爹这种设计的弊端(希望Java Fans不要跟我急)。我个人认为:这 个折中的决策,带来了许多深远的影响,随手举出几个例子:

1、由于基本类型不是派生自Object,因此不能算是纯种的对象。这导致了Java的“纯面向对象 ”招牌打了折扣。

2、由于基本类型不是派生自Object,出于某些场合(比如容器类)的考虑,不得不为每个基本类型 加上对应的包装类(比如Integer、Byte等),使得语言变得有点冗余。

★结论

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

本文原始地址:

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

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号