首页
Web开发
Windows程序
编程语言
数据库
移动开发
系统相关
微信
其他好文
会员
首页
>
编程语言
> 详细
Java性能小技巧
时间:
2015-01-26 15:17:42
阅读:
184
评论:
0
收藏:
0
[点我收藏+]
标签:
java
局部决定整体。一个
应用
的整体性能取决于每个组件的性能。下面是一些帮助你提高应用性能的Java编程技巧:
编程技巧
原因及策略
避免重复创建对象
为什么:
更少的对象会需要更少的垃圾回收
使用的空间越少,应用的性能越好
怎么做:
重复利用一个对象,而不是在每次需要的时候都去创建一个功能一样的对象
(这样做)
String s = “No longer silly”;
(不要这样)
String s = new String(“silly”);
不可变类中既提供构造函数,又提供了静态工厂方法的,优先考虑使用静态工厂方法。
复用那些一旦初始化(使用静态初始化)就不会改变的对象
避免循环引用
为什么:
一组相互引用的对象,如果他们没有被其他对象直接引用的话,它们会变得不可达,这样会导致它们一直都保留在内存里。
怎么做:
你可以使用强引用来表示“父到子“的引用关系,使用弱引用来表示“子到父”的引用关系。
使用==操作符来替代equals(Object)方法
为什么:
==操作符的性能更好
例如,对于字符串比较,equals()方法会去比较字符串对象里的字符。==操作符会比较两个对象的引用,来比较它们是否指向同一个实例。
怎么做:
当且仅当a == b 的时候才会有a.equals(b)
例如,对于重复调用的地方,使用静态工厂方法来返回相同的对象。
清除无用的对象的引用
为什么:
无用的对象引用会导致更多的垃圾回收动作,从而降低性能
无用的对象引用会导致更多的内存占用,从而降低性能
怎么做:
如果一个引用时废弃的话,把它设置为null
(这样做)
public
Object pop() {
if(size == 0)
thrownew
EmptyStackException();
Object result = elements[--size];
elements[size] =null; // 清除无用对象的引用
returnresult;
}
(不要这样)
public
Object pop(){
if(size == 0)
thrownew
EmptyStackException();
returnelements[--size];
}
避免使用finalizer
为什么:
垃圾回收器需要单独记录等待终结的对象
调用finalize方法也有一定的开销
Finalizer是不安全的,因为它有可能会复活一个对象,这样会干扰垃圾回收。
避免使用引用对象
为什么:
和finalizer一样,垃圾回收器需要特别处理软引用、弱引用以及幽灵引用。
尽管引用对象在某些方面很有作用,例如,简化cache的实现,但是大量引用对象的存在会使得垃圾回收运行缓慢。
记录一个引用对象的开销远远超过一个普通对象(强引用)的开销
避免使用对象池
为什么:
对象池不仅会使得更多的数据对象保持活动,同时会使得对象的存活时间延长
值得注意的是,大量存活的数据对象的处理是GC的瓶颈,GC被优化成适合于处理许多寿命较短的对象
并且,创建新的对象而不是保持旧的对象存活,会对缓存的局部性有益
不过,在一个包含大量大对象的环境下,例如大的数组,性能或许会因为使用对象池而有所提升。
选择好的算法和数据结构
为什么:
考虑一下通过链表来实现队列的场景
即使你的程序不需要遍历整个链表,但是垃圾回收器还是需要这样做的。
如果元素的封装者没有把元素没有把元素放在内存中邻近的位置,这样会破坏缓存局部性。因而会导致程序长时间的暂停,尤其是对象的指针分散在一个很大的堆区时,垃圾回收器会在标记阶段追随指针的时候频繁遭遇缓存失效。
避免使用System.gc
为什么:
Java语言规范里没有保证调用System.gc会做什么事情。如果它规定了的话,或许会超出你的期望,也或许每次调用都做不同的事情。
避免使用太多的线程
为什么:
进程上下文切换的次数会随着要调度的进程的数目相应地增长,这样会对性能有隐性的影响。
例如,Intel A-64处理器上的本地线程上下文的大小大概是几千KB
避免使用竞争锁
为什么:
竞争锁一般都是程序的瓶颈,因为它的出现意味着多个线程想访问同一个资源或者执行同一段代码。
避免不需要的异常
为什么:
异常处理会占用一定的事件,并且会打断程序的正常执行流程。
作者曾经遇到这样一场景,在客户的应用里,一个正常的执行流程每秒会抛出成千上万的NullPointerException。这个错误被纠正后,应用的性能里面有了一个数量级的提升。
避免使用大对象
为什么:
大对象有时候需要直接在堆而不是在线程本地存储区(thread local areas, TLA)进行内存分配。
大对象直接在堆上分配是有坏处的,因为它会更快地产生内存碎片。
在虚拟机(例如JRockit)上分配大对象会降低性能,因为分配内存的时候会使用堆的全局锁。
过度使用大对象会造成频繁的全栈压缩,这样做是具有破坏性的,而且这样会导致导致所有的线程暂停很长一段时间。
Java性能小技巧
标签:
java
原文地址:http://blog.csdn.net/guangxiaove/article/details/43151385
踩
(
0
)
赞
(
0
)
举报
评论
一句话评论(
0
)
登录后才能评论!
分享档案
更多>
2021年07月29日 (22)
2021年07月28日 (40)
2021年07月27日 (32)
2021年07月26日 (79)
2021年07月23日 (29)
2021年07月22日 (30)
2021年07月21日 (42)
2021年07月20日 (16)
2021年07月19日 (90)
2021年07月16日 (35)
周排行
更多
Spring Cloud 从入门到精通(一)Nacos 服务中心初探
2021-07-29
基础的排序算法
2021-07-29
SpringBoot|常用配置介绍
2021-07-29
关于 .NET 与 JAVA 在 JIT 编译上的一些差异
2021-07-29
C语言常用函数-toupper()将字符转换为大写英文字母函数
2021-07-29
《手把手教你》系列技巧篇(十)-java+ selenium自动化测试-元素定位大法之By class name(详细教程)
2021-07-28
4-1 YAML配置文件 注入 JavaBean中
2021-07-28
【python】 用来将对象持久化的 pickle 模块
2021-07-28
马拉车算法
2021-07-28
用Python进行冒泡排序
2021-07-28
友情链接
兰亭集智
国之画
百度统计
站长统计
阿里云
chrome插件
新版天听网
关于我们
-
联系我们
-
留言反馈
© 2014
mamicode.com
版权所有 联系我们:gaon5@hotmail.com
迷上了代码!