JAVA内存优化和性能优化

  1. 没有必要时请不用使用静态变量

当某个对象被定义为stataic变量所引用,这个对象所占有的内存将不会被回收。有时,开发者会将常常调用的对象或者变量定义为static,以便提升程序的运行性能。所以,不是经常使用到的对象或者变量,不要定义为static类型的变量。 2. 充分利用单例机制html

实用单例能够减小对资源的加载,缩短运行的时间,提升系统效率。可是,单例并非全部地方都适用于。单例能够适用于如下两个方面:java

  • 控制资源的使用,经过线程同步来控制资源的并发访问;
  • 控制实例的产生,以达到节约资源的目的
  1. 减小对象的建立

尽可能避免在常常调用的方法中循环使用new对象,因为系统不只要花费时间来建立对象,并且还要花时间对这些对象进行垃圾回收和处理。设计模式中的享元模式就是为了减小对象的屡次建立而来的。在咱们能够控制的范围内,最大限度的重用对象;在有些时候,最好能用基本的数据类型或数组来替代对象。 4. 使用final修饰符算法

带有final修饰符的类是不可派生的。在Java核心API中,有许多应用 final的例子,例如java.lang.String。为String类指定final防止了使用者覆盖length()方法。另外,若是一个类是 final的,则该类全部方法都是final的。Java编译器会寻找机会内联(inline)全部的final方法(这和具体的编译器实现有关)。此举可以使性能平均提升50%。 5. 尽可能使用局部变量编程

调用方法时传递的参数以及在调用中建立的临时变量都保存在分配给改方法的栈(Stack)中,速度较快。其余变量,如静态变量、实例变量等,都在堆(Heap)中建立,速度较慢。 6. 处理好包装类型和基本类型二者的使用场所设计模式

虽然包装类型和基本类型在使用过程当中是能够相互转换,但它们二者所产生的内存区域是彻底不一样的,基本类型数据产生和处理都在栈中处理,而包装类型是对象,是在堆中产生实例。在集合类对象,有对象方面须要的处理适用包装类型,其余的状况,建议提倡使用基本类型。 7. 使用StringBuilder和StringBuffer替换String数组

单线程使用StringBuilder,多线程状况下使用StringBuffer,这样性能会有很大提高。 8. 尽可能不要使用finalize方法缓存

因为GC的工做量很大,尤为是回收Young代内存时,大都会引发应用程序暂停,因此再选择使用finalize方法进行资源清理,会致使GC负担更大,程序运行效率更差 9. 尽可能使用基本数据类型代替对象 10. 减小对变量的重复计算多线程

for(int i=0;i<list.size();i++)并发

应该改写为:工具

for(int i=0,len=list.size();i<len;i++)

或者

for(int i = list.size(); I > -1; i--)

而且在循环中应该避免使用复杂的表达式,在循环中,循环条件会被反复计算,若是不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快。 11. 尽可能在finally块中释放资源

程序中使用到的资源应当被释放,以免资源泄漏。这最好在finally块中去作。无论程序执行的结果如何,finally块老是会执行的,以确保资源的正确关闭。 12. 尽可能早释放无用对象的引用

大部分时,方法局部引用变量所引用的对象 会随着方法结束而变成垃圾,所以,大部分时候程序无需将局部,引用变量显式设为null。 13. 尽可能缓存常用的对象

尽量将常用的对象进行缓存,可使用数组,或HashMap的容器来进行缓存,但这种方式可能致使系统占用过多的缓存,性能降低,推荐可使用一些第三方的开源工具,如EhCache,Oscache进行缓存,他们基本都实现了FIFO/FLU等缓存算法。 14. 尽可能避免很是大的内存分配

有时候问题不是由当时的堆状态形成的,而是由于分配失败形成的。分配的内存块都必须是连续的,而随着堆heap愈来愈满,找到较大的连续块愈来愈困难。 15. 慎用异常

当建立一个异常时,须要收集一个栈跟踪(stack track),这个栈跟踪用于描述异常是在何处建立的。构建这些栈跟踪时须要为运行时栈作一份快照,正是这一部分开销很大。当须要建立一个 Exception 时,JVM 不得不说:先别动,我想就您如今的样子存一份快照,因此暂时中止入栈和出栈操做。栈跟踪不仅包含运行时栈中的一两个元素,而是包含这个栈中的每个元素。

若是建立一个 Exception ,就得付出代价。好在捕获异常开销不大,所以可使用 try-catch 将核心内容包起来。从技术上讲,您甚至能够随意地抛出异常,而不用花费很大的代价。招致性能损失的并非 throw 操做——尽管在没有预先建立异常的状况下就抛出异常是有点不寻常。真正要花代价的是建立异常。幸运的是,好的编程习惯已教会咱们,不该该无论三七二十一就抛出异常。异常是为异常的状况而设计的,使用时也应该牢记这一原则。

参考文献:

http://www.open-open.com/lib/view/open1399884636989.html

相关文章
相关标签/搜索