在Java性能优化系列
中,内存管理是一个要优先考虑的关键因素。而说到内存分配,就必然会涉及到基本类型和引用类型。所以我们今天就先来介绍一下这两种类型在性能方面各自有什么奥妙(关于引用类型的其它奥妙,请看“这里
”)。<!-- program-think-->
★名词定义
先明确一下什么是基本类型,什么是引用类型。简单地说,所谓基本类型就是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应用程序效率的关键技术,涵盖了内存管理、代码优化、I/O处理等多个方面。以下是一些关键的性能优化策略: 1. **对象创建与克隆**:使用`new`关键字创建对象时,会调用构造函数链,这可能...
根据提供的文件信息,我们可以推断出这是一本关于Java程序性能优化的书籍,作者是葛一鸣,并提供了该书PDF版本的下载链接。虽然没有具体的书籍内容,但基于标题、描述以及通常这类书籍会涉及的主题,我们可以总结出...
本资料集锦主要涵盖了Java性能优化的多个方面,包括但不限于代码优化、内存管理、系统设计与优化等关键领域。 一、Java程序性能优化(23条) 1. **避免过度使用反射**:反射在某些场景下很有用,但其开销较大,应...
Java性能优化是提升软件效率和用户体验的关键步骤,涵盖了多种技术和策略。本文将深入探讨Java通用篇、J2EE篇、GUI篇、EJB篇以及缓存优化等方面的知识点,旨在帮助开发者实现更高效的代码。 一、Java通用篇 在Java...
《Java Performance》是一本专注于Java性能优化的专业书籍,其英文版为全球的Java开发者提供了深入理解并提升Java应用性能的宝贵资源。这本书不仅涵盖了Java性能优化的基础知识,还深入探讨了高级主题,使得读者能够...
### Java性能优化关键知识点 #### 一、合理运用单例模式 **单例模式**是一种常用的软件设计模式,它确保一个类只有一个实例,并提供一个全局访问点。在Java性能优化中,合理使用单例模式可以带来以下优势: 1. **...
Java程序性能优化是Java开发中的重要环节,它旨在提高应用程序的运行效率,减少资源消耗,提升用户体验。在Java世界中,性能优化涵盖了多个层面,包括代码优化、内存管理、线程调度、数据库交互以及JVM参数调整等。...
Java开发中的性能优化是提升应用程序效率的关键步骤。在编程中,我们需要关注代码的运行效率,以确保程序在处理大量数据或高并发场景下仍能保持高效。以下是一些Java编程中为了性能需要注意的地方: 1. **单例模式...
Java性能优化是提升Java应用程序效率的关键技术,涵盖了代码优化、内存管理、并发处理等多个方面。在Java开发过程中,了解并掌握这些优化技巧可以显著提高应用的响应速度和资源利用率。 首先,我们关注的是代码层面...
JAVA最佳性能优 化JAVA优化技巧 类的方法内联,方法的同步及局部变量的使用 创建类的实例优化策略 建立对象池提升性能策略 JAVA垃圾回收机制及引用优化策略
### JAVA程序性能优化 在Java开发中,程序性能优化是一个重要的环节,它直接影响到应用程序的运行效率、用户体验以及系统的整体稳定性。本文将基于提供的标题、描述及部分内容,深入探讨几个关键性的性能优化策略。...
首先,我们来探讨Java性能优化的基本原则。性能优化的目标不仅仅是提高速度,更重要的是确保程序的稳定性和可维护性。优化过程中,应该遵循“测量先行”的原则,使用如JProfiler、VisualVM等工具进行性能分析,找出...
1.2 性能优化的参考因素 1.3 性能调优分类方法 1.4 本章小结 第2章 优化前的准备知识 2.1 服务器知识 2.2 新兴技术 第3章 Java API调用优化建议 3.1 面向对象及基础类型 3.2 集合类概念 3.3 字符串概念 ...
深入理解Java中的引用类型对于有效地管理内存和提高应用程序的性能至关重要。根据具体的场景,选择适当的引用类型是优化程序的关键一步。希望本文能够为您提供在Java引用类型的使用上清晰的指导
### Java性能优化技巧详解 #### 一、引言 在当今快速发展的软件行业中,提高程序的执行效率成为了软件工程师的一项重要任务。对于Java开发者来说,理解如何优化Java程序的性能至关重要。本文将深入探讨Java性能...
Java性能优化是提升系统效率的关键环节,特别是在处理大量数据或者高并发场景时,优化显得尤为重要。本主题将围绕“Java性能优化方法”展开,重点讨论Java集合的排序、反射机制在Spring中的应用以及如何减少对象的...
Java是一种静态类型语言,它提供了8种基本数据类型,用于存储原始数据。以下是对Java基本数据类型的简要概述: 基本数据类型直接存储数据,不存储引用。 每种类型有固定的内存大小和取值范围。 它们具有默认值,未...
以下是对"Java JVM及性能优化"和"Java性能分析"的详细阐述: 一、JVM结构与工作原理 1. 类装载器:负责加载类文件,确保在运行时能找到对应的类。 2. 运行数据区:包括方法区、堆、栈、本地方法栈和程序计数器。...