对象创建
对象的创建是一个非常昂贵的工作,而由于对象的创建而导致经常性的垃圾收集则是一个更加消耗时间和CPU的操作。我们在编码时,应当尽量的减少对象的创建。不要在经常被执行的代码中创建对象;使用集合对象时最好预先分配其大小;当一个class的多个实例都需要获取某个对象时,最好能标记那个对象static;当不需要stack trace时尽可能的重用异常实例等等都能很有效的避免对象创建而导致的额外的开销。下面是一些常用的有效的策略:
1) 对象池技术
在Java中开发一个普遍性的对象池架构可以更好地利用资源,并可以使对象创建的成本降到最小。大多数人对直接或间接运用对象池来连接一个数据库都很熟悉。但通常你也可以将对象放入对象池中从而节省重要的资源、提高程序的效率并控制对不充足资源的访问。出于对设计、成本或性能的考虑,放入对象池中的对象通常是有限的。它们或者是初始化成本很高的对象,或者是很少用的对象。运用对象池我们可以管理竞争性客户端对有限的对象集的访问。
对象池主要是可以更好地运用你的资源。例如,设想有相当多的客户要有效运用很少的数据库连接或网络连接。通过限制对对象的访问(只在客户端需要的时候才能访问对象),你就可以释放资源,让其它客户端使用。通过对象池提高对象的利用率通常可以提高系统的性能。
你可以使用对象池使初始化的成本达到最小。典型的例子包括数据库、网络连接和线程。这样的连接通常需要很多时间来初始化。一旦创建了这些连接,你就可以重用它们,从而极大地节省了成本。因此,你可以将初始化成本很高(从时间、内存或其它资源方面考虑)的对象放入对象池中。例如,大多数容器都将EJB放入对象池中,从而避免重复的资源分配和状态初始化。
一个设计良好的对象池架构具有普遍性,它适合不同应用程序的需要。可以让你控制对象池的容量、对象填充策略和对象状态。它可以极大地提高你的应用程序的效率,不管从速度方面考虑,还是从资源利用率方面考虑,该架构都可以提供这样的好处。
在这里,给大家推荐一个开源的项目Commons-Pool(http://jakarta.apache.org/commons/pool/),我还没来得及研究,谁用过了,感觉好的,麻烦告诉我一下,谢谢!
2) ThreadLocal技术
使用此技术获取线程绑定的带状态的单例对象。
3) 单例模式
通过单例模式或使定义对象static来使得对象的实例只能有一个并被其他对象所共享。
4) 枚举常量
使用整数取代字符串作为枚举常量,比如FEMALE和MALE我们可以用整数1和2来替代。这样将带来速度上和内存上的优势。
5) 使用SoftReference,WeakReference和PhantomReference引用类
引用类的主要功能就是能够引用仍可以被垃圾收集器回收的对象。在引入引用类之前,我们只能使用强引用(Strong Reference)。例如obj这个引用将引用堆中存储的一个对象,只要obj引用还存在,垃圾收集器就永远不会释放用来容纳该对象的存储空间。当obj超出范围或被显式指定为null时,垃圾收集器就认为没有对这个对象的其他引用,也就可以收集它了。然而还需要注意一个重要的细节:仅凭对象可以被收集并不意味着垃圾收集器的一次指定运行就能够回收它。由于各种垃圾收集算法不同,某些算法会更频繁地分析生存期较短的对象,而不是较老、生存期较长的对象。因此,一个可供收集的对象可能永远也不会被回收。如果程序在垃圾收集器释放对象之前结束,这种情况就可能会出现。因此,概括地说,你永远无法保证可供收集的对象总是会被垃圾收集器收集。
让我们来看看一些术语和定义:
强可及对象(Strongly Reachable):可以通过强引用访问的对象。
软可及对象(Softly Reachable):不是强可及对象,并且能够通过软引用访问的对象。
弱可及对象(Weakly Reachable):不是强可及对象也不是软可及对象,并且能够通过弱引用访问的对象。
虚可及对象(Phantomly Reachable):不是强可及对象、软可及对象,也不是弱可及对象,已经结束的,可以通过虚引用访问的对象。
清除:将引用对象的refernce域设置为null,并将引用类在堆中引用的对象声明为可结束的。
SoftReference类:SoftReference类的一个典型用途就是用于内存敏感的高速缓存。SoftReference的原理是:在保持对对象的引用时保证在JVM报告内存不足情况之前清楚所有的软引用。关键之处在于,垃圾收集器在运行时可能会(也可能不会)释放软可及对象。对象是否被是否取决于垃圾收集器的算法以及垃圾收集器运行时可用的内存数量。
WeakReference类:WeakReference类的一个典型用途就是规范化映射(Canonicalized Mapping)。另外,对于那些生存期相对较长而且重新创建的开销也不高的对象来说,弱引用也比较有用。关键之处在于,垃圾收集器运行时如果碰到了弱可及对象,将释放 WeakReference 引用的对象。然而,请注意,垃圾收集器可能要运行多次才能找到并释放弱可及对象。
PhantomReference类:PhantomReference 类只能用于跟踪对被引用对象即将进行的收集。同样,它还能用于执行 pre-mortem 清除操作。 PhantomReference 必须与 ReferenceQueue 类一起使用。需要 ReferenceQueue 是因为它能够充当通知机制。当垃圾收集器确定了某个对象是虚可及对象时, PhantomReference 对象就被放在它的 ReferenceQueue 上。将 PhantomReference 对象放在 ReferenceQueue 上也就是一个通知,表明 PhantomReference 对象引用的对象已经结束,可供收集了。这使您能够刚好在对象占用的内存被回收之前采取行动。
在某些场合引用类还是很有用的,具体可以参考文章Java2引用类使用指南(http://www-128.ibm.com/developerworks/cn/java/j-refs/index.html)。
6) 尽可能少的减少不必要对象的生成
尽可能减少在循环中创建对象,使用StringBuffer而不要使用String来做连接操作等等。
7) 改变对象的创建时机
通过提前创建对象或延迟到使用时再创建对象,来做到性能优化和避免创建过多的对象。
分享到:
相关推荐
模块四热点问题解答26讲单例模式:如何创建单一对象优化系统性能27讲原型模式与享元模式:提升系统性能的利器32讲MySQL调优之SQL语句:如何写出高性能SQL语句33讲MySQL调优之事务:高并发场景下的数据库事务调优34讲...
Windows程序设计是IT行业中一个核心的技术领域,它涵盖了创建、开发、维护和优化运行于Windows操作系统上的应用程序。Visual C++作为一种广泛使用的编程语言,具有强大的功能和灵活性,是进行Windows程序设计的重要...
《数据库应用技术——Delphi应用系统开发》是蒋丽华教授的一本专著,主要针对的是使用Delphi这一强大的编程工具进行数据库应用系统的构建。这本书的电子教案包含了多个章节的内容,从基础到深入,全面讲解了数据库...
- `xcassets`:用于管理应用程序的图像资产。 2. **技术栈** iOS游戏开发常用的技术栈包括: - **Swift或Objective-C**:作为iOS应用的主要编程语言,这两者都可能被用于游戏开发。 - **SpriteKit**:Apple提供...
Xcode则提供了全面的工具集,包括代码编辑器、调试器、模拟器和界面构建器,使得开发者能够高效地创建和测试应用程序。 在源代码中,我们可以期待看到以下几个关键组成部分: 1. **项目文件(Project File)**:...
Java程序性能优化是每个开发人员都需要关注的重要领域,它涵盖了多个方面,旨在提高代码执行效率,减少资源消耗,以及提升应用程序的稳定性和响应速度。在本文中,我们将深入探讨Java性能优化的关键点,帮助你的Java...
Android 性能调优和开源代码知识分享是指通过对 Android 应用程序的性能优化和开源代码的分享,来提高 Android 应用程序的运行效率和稳定性。下面是该分享的知识点总结: 1. Android 性能调优 Android 性能调优是...
《JVM性能调优——JVM内存整理及GC回收》是针对Java开发人员的重要主题,尤其是在大型企业级应用中,确保JVM(Java虚拟机)的高效运行是至关重要的。本资料深入探讨了如何通过调整JVM内存设置和优化垃圾回收机制来...
它提供了全面的数据存储、管理和分析功能,支持多种数据库应用程序的构建,包括Web应用程序、企业资源规划(ERP)、客户关系管理(CRM)等。 **数据库应用技术** 数据库应用技术是指利用数据库管理系统来存储、...
2. **Cocoa Touch**:作为iOS应用程序开发的核心框架,Cocoa Touch提供了UI组件、事件处理、动画等关键功能。在SQLBoy Tiled Games中,它被用于构建游戏界面和用户交互。 3. **Tiled Map Editor**:Tiled是一个跨...
通过减少不必要的对象创建,及时释放不再使用的引用,以及正确配置GC参数,可以显著减少GC停顿时间,提升程序响应速度。 另一个重要的优化方面是CPU使用率。这可能涉及算法优化,选择合适的数据结构,以及避免不必...
《Sun JDK 1.6内存管理--调优篇》...通过深入理解Sun JDK 1.6的内存管理机制和调优策略,开发者可以有效地提高Java应用程序的性能,减少不必要的内存消耗,避免系统出现不必要的停顿,从而提供更稳定、高效的运行环境。
ASP.NET是一种由微软开发的服务器端Web应用程序框架,用于构建动态网站、Web应用和Web服务。它提供了丰富的开发工具、高效的运行环境以及强大的安全性,使得开发者能够快速地构建功能完备的Web应用。 在"ASP.NET...
### JVM性能调优——JVM内存管理与GC回收详解 #### 概览 在现代软件开发领域,Java凭借其强大的跨平台能力和丰富的生态系统成为企业级应用的首选语言之一。然而,随着应用程序复杂度的提高以及业务需求的变化,...
7. 部署和性能优化:学习如何将应用程序部署到IIS服务器,并了解性能调优技巧。 通过深入研究这个源码包,你不仅能学习到ASP.NET 1.1和C#.NET的基础知识,还能提升实际开发技能,为将来更高级的.NET开发打下坚实...
程序文件可能包含了实现这些功能的存储过程、触发器、视图等对象,以及用C#或Java等编程语言编写的与数据库交互的应用程序。 深入学习SQL Server,还需要掌握T-SQL语言,它是SQL Server的主要编程工具,用于数据...
面对这一问题,解决方案的核心在于修改部署于WebSphere上的应用程序,特别是针对Java堆内存中对象处理的代码部分,目标是减少Java堆中的对象数量,从而避免内存溢出的情况再次发生。 具体策略包括: 1. **优化数据...
Java 虚拟机(JVM)的内存管理和垃圾回收是优化Java应用程序性能的关键环节。本文将详细探讨JVM中的垃圾回收与调优,重点包括内存分配策略、对象的生命周期以及垃圾回收的判断标准。 首先,JVM内存分为新生代...
内存结构包括 SGA(系统全局区)和 PGA(程序全局区)两部分,而进程结构包括服务器进程和用户进程。 SGA 是用于存储数据库信息的内存区,该信息为数据库进程所共享。它包含 Oracle 服务器的数据和控制信息,并在 ...