java中代码的优化 java怎么优化代码减少内存( 三 )


16. 尽量使用移位来代替'a/b'的操作
"/"是一个代价很高的操作 , 使用移位的操作将会更快和更有效
17.尽量使用移位来代替'a*b'的操作
同样的,对于'*'操作,使用移位的操作将会更快和更有效
18. 尽量确定StringBuffer的容量
StringBuffer 的构造器会创建一个默认大小(通常是16)的字符数组 。在使用中,如果超出这个大小,就会重新分配内存,创建一个更大的数组 , 并将原先的数组复制过来,再 丢弃旧的数组 。在大多数情况下,你可以在创建 StringBuffer的时候指定大?。庋捅苊饬嗽谌萘坎还坏氖焙蜃远龀? ,以提高性能 。
19. 尽量早释放无用对象的引用
大部分时,方法局部引用变量所引用的对象 会随着方法结束而变成垃圾,因此,大部分时候程序无需将局部,引用变量显式设为null.
20. 尽量避免使用二维数组
二维数据占用的内存空间比一维数组多得多,大概10倍以上 。
21. 尽量避免使用split
除非是必须的,否则应该避免使用split,split由于支持正则表达式 , 所以效率比较低 , 如果是频繁的几十,几百万的调用将会耗费大量资源 , 如果确实需 要频繁的调用split,可以考虑使用apache的StringUtils.split(string,char),频繁split的可以缓存结果 。
22. ArrayListLinkedList
一 个是线性表,一个是链表,一句话,随机查询尽量使用ArrayList,ArrayList优于LinkedList,LinkedList还要移动指 针,添加删除的操作LinkedList优于ArrayList,ArrayList还要移动数据,不过这是理论性分析,事实未必如此,重要的是理解好2 者得数据结构,对症下药 。
23. 尽量使用System.arraycopy ()代替通过来循环复制数组
System.arraycopy() 要比通过循环来复制数组快的多
24. 尽量缓存经常使用的对象
尽可能将经常使用的对象进行缓存,可以使用数组,或HashMap的容器来进行缓存 , 但这种方式可能导致系统占用过多的缓存,性能下降,推荐可以使用一些第三方的开源工具 , 如EhCache,Oscache进行缓存 , 他们基本都实现了FIFO/FLU等缓存算法 。
25. 尽量避免非常大的内存分配
有时候问题不是由当时的堆状态造成的,而是因为分配失败造成的 。分配的内存块都必须是连续的,而随着堆越来越满 , 找到较大的连续块越来越困难 。
26. 慎用异常
当创建一个异常时,需要收集一个栈跟踪(stack track),这个栈跟踪用于描述异常是在何处创建的 。构建这些栈跟踪时需要为运行时栈做一份快照,正是这一部分开销很大 。当需要创建一个 Exception 时,JVM 不得不说:先别动,我想就您现在的样子存一份快照,所以暂时停止入栈和出栈操作 。栈跟踪不只包含运行时栈中的一两个元素,而是包含这个栈中的每一个元素 。
如 果您创建一个 Exception ,就得付出代价 。好在捕获异常开销不大,因此可以使用 try-catch 将核心内容包起来 。从技术上讲 , 您甚至可以随意地抛出异常,而不用花费很大的代价 。招致性能损失的并不是 throw 操作--尽管在没有预先创建异常的情况下就抛出异常是有点不寻常 。真正要花代价的是创建异常 。幸运的是,好的编程习惯已教会我们,不应该不管三七二十一就 抛出异常 。异常是为异常的情况而设计的 , 使用时也应该牢记这一原则 。
(1) 。用Boolean.valueOf(boolean b)代替new Boolean()
包装类的内存占用是很恐怖的,它是基本类型内存占用的N倍(N2),同时new一个对象也是性能的消耗 。
(2) 。用Integer.valueOf(int i)代替new Integer()

推荐阅读