Optimization : Code

代码优化

一、概念

目的:   [1]减小代码体积    [空间]

           [2]提高运行效率    [时间]

[0]规范  #常量变量  常量在变量之前-  if(i == 1) 

           ## 单引号:字符串处理

           ## 双引号: 基础类型拓宽,转换成整型值 

[1] 输入:避免过多形参 [ 调用错误、违反面向对象思想 ]

[2] 输出:空集和>null [ 节省if...else检查]

[3] 遍历   ## 1.for:         随机访问-RandomAccess接口的类实例

               ## 2.foreach: 顺序访问-Iterator

[4] 循环 : 外部创建,内部引用。Object obejct=null  [内部禁止不断创建]

[5] 计算:乘法、除法-移位操作

               幂运算-异或操作(幂运算-异或>分步乘积>Math.pow())

二、手段

1. 修饰符

##[1] final:  修饰类、方法 [ JIT内联inline ]

##[2] private:修饰构造函数—静态类、单例类、工厂类 [不需外部创建]

##[3] static

##

2. 变量  

赋值:long、Long型 大写字母L

常量: [大写命名]  static final 声明   编译期放入常量池

变量: [小写命名]  运行期                减少重复计算[ 调用方法: 创建栈帧,调用方法时保护现场, 调用完毕后恢复现场 ]

局部变量:  尽量使用,  调用方法时传递的参数以及在调用中创建的临时变量在栈中,速度快。

                 静态变量、实例变量在堆中,速度较慢。

静态变量:  减少使用,GC不回收;生命周期与类同步,常驻内存,直至终止。

3. 方法   Method

##[1] 构造方法:  变量禁止重复初始化

     [ 变量初始化: 对象=null,floadt\double=0.0,boolean=false;new关键字创建对象,自动调用构造函数链中的所有的构造函数]

##[2] finalize() : 减少使用,回收Young代,大都会引起程序暂停

4.类与对象 Object-object

对象: 需要时创建、初始化—尽量重用、使用基本数据类型

框架: 懒加载策略: 需要时创建对象

5.数据类型常用类

[1] -1. 基本类型:

## 1向下转型:注意范围

## 2代替对象:

## 3 转换字符串:  基本类型.toString()>String.valueOf(基本类型)> 基本类型+""

       [直接调用>空判断+直接调用>StringBuilder.append+直接调用]

[1] -2. 包装类:

[2]  字符串  

   ##创建 直接初始化、不使用构造方法 。  String string = "不用new String()";

   ##拼接  StringBuffer.append,不用"+".[生成对象、垃圾回收、处理]         

   ##查找  string.indexOf()

   ##判断  常量.equals(变量)  避免空指针

   ##方法  避免使用split(),使用StringUtils.split(string,char)

   ##包装类 StringBuffer创建时指定大小,避免自动增长[默认16的字符数组,超过重新分配内存,复制丢弃的过程]

[3]集合类

## Ⅰ能预估内容长度时,指定初始长度

##Ⅱ remove():数据使用完毕后调用

##[1] Array  复制: System.arraycopy()代替循环

          一位数组:代替对象

          二维数组:避免使用,内存为一位的10倍以上3

          禁止:禁止使用toString()、禁止修饰public static final

##[2] Array:      查询元素、[ 销量和类型检查 ]

##[3] ArrayList: 顺序插入、随机访问

##[4] LinkedLsit: 中间插入、删除     

##[5] Map:        遍历-Map中的Key和Value

##[6] Vector:??? 默认10,扩容*2  

   ##插入:vector.add(index,object)

   ##删除:vector.remove(int index)\ vector.remove(object)

6. 异常  Exception

[0]  原理: 创建异常对象,收集栈跟踪stack track[ 停止出栈、入栈,存放栈的快照]

                 Throwable接口的构造函数调用fillInStackTrace()的本地同步方法,检查堆栈,收集跟踪信息。

[1]  RuntimeException 运行时异常不必捕获,代码规避

ArithmeticException                     — 判断除数是否为空           NullPointException                      — 判断对象是否为空

IndexOutBoundsException          — 判断数组\字符串长度      ClassCastException                    — 使用关键字instanceof

ConcurrentModificationException— 使用迭代器

[2]  try...catch    放在最外层、循环中不可使用

[3]  finally          释放资源

7.多线程 Thread 

##同步:HashTable、Vector、 StringBuffer

##异步:HashMap、ArrayList、StringBuilder

#synchronized:同步代码块替代同步方法[细粒度]

#ThreadLocal: 使用前后,调用remove()

##线程池:      避免频繁地创建和销毁线程

##DB连接池: 避免频繁打开和关闭连接

#随机数:避免多线程使用Random,虽然线程安全,但因竞争同一seed性能下降

              使用ThreadLocalRandom  1.7设计模式

8. 设计模式

##单例:  减轻加载负担、缩短加载时间、提高加载效率

   ##[1] 控制资源使用,通过线程同步,控制资源并发访问

   ##[2] 控制实例产生,节约资源

   ##[3] 控制数据共享,不建立直接关联,让多个不相关的进程或线程之间通信

9. Stream、Session、Resource、Annotation、Reflaction

[1] 流    及时关闭,释放资源。数据库连接、IO流。[系统开销]

            缓存流:BufferedReader\BufferedWriter\BufferedInputStream\BufferedOutputStream

[2] 会话 及时清除,会话超时30min,HttpSession的invalidate()方法清除

[3] 资源  分开操作close()  xxx.close()抛异常进入catch语句、yyy.close()不会执行

[4] 注解  保留@Overrider

[5] 反射 功能强大,但效率低。

##解决: 项目启动时,通过反射实例出对象,放入内存

 

一、运行期优化

基本类型: 数据产生和处理在栈

包装类型: 实例产生和处理在堆

二、

三、内存泄露问题

1. 内存分配:Xms最小内存分配\Xmx最大内存分配\XX:PermSizeJVM初始大小\XX:MaxPermSizeJVM可分配最大空间

2. 避免死锁:同步对象等待

猜你喜欢

转载自blog.csdn.net/ddhmbbklyk2018/article/details/82761745