指JVM可以分析新创建对象的使用范围,以此来决定是否在Java堆上分配内存的技术
逃逸分析使用的算法引入了连通图,来构建对象和对象引用之间的可达性关系,以此为基础提出一种组合数据流分析法。
这种算法是上下文相关和流敏感的,分析精度相对较高,但是时间、内存开销相对较大。
逃逸的几种状态
全局逃逸
即一个对象的作用范围逃出了当前方法或当前范围,有以下几种:
参数逃逸
即一个对象被作为方法参数传递或被参数引用,但不会发生全局逃逸,这个状态通过被调用方法的字节码确定
没有逃逸
逃逸分析优化
锁清除
线程同步锁是很牺牲性能的。锁清除就是如果编译器知道当前对象只有当前线程使用,那么就会移除该对象的同步锁。
比如StringBuffer和Vector都是用synchronized修饰线程安全的,但是大部分时候只在当前线程中使用,故编译器可以优化它
标量替换
标量和聚合量:
基础类型和对象引用可以说是标量,不能被进一步分解;能进一步分解的量就是聚合量,比如对象。
对象可以被进一步分解为标量,分散的成员变量,这就是标量替换
如果一个对象没有逃逸,那么不用创建它,只需要创建它的成员标量并存在栈中或者寄存器,节省内存空间也提升性能。
栈上分配
当对象没有逃逸时,该对象可以通过分解为成员标量分配在栈内存,和方法的生命周期一致,随着栈帧出栈销毁,从而减少GC的压力,提高性能。
逃逸分析即是为了优化JVM内存和提升性能的。故开发当中要尽可能控制变量的作用域,作用域越小越好,
==:如果比较基本数据类型,比较数值是否相等
如果比较引用类型,比较对象的地址是否相等
equals():默认比较对象地址是否相等,不能用于比较基本数据类型
为什么用equals()比较String的内容是否相等
对于String、Date、Integer灯类型重写了equals()方法,使其比较对象存储的内容是否相等
& 可以作位运算符,进行位与运算;还可以进行逻辑与运算,作逻辑与时为长路与,即是说就算左边的表达式为假,右边的表达式也会运算
&& 是逻辑与,是短路与,若左边表达式为假,则右边表达式不运算
值传递:形参传递的是基本数据类型的字面量值的拷贝,方法对形参的修改不影响实参的值
引用传递:形参传递的是该参数引用的对象在堆中地址值的拷贝,对形参的修改直接作用在实参
不能,可以是内部类、全局变量、方法、代码块
可以重载,不能重写
不可变,String是final类型的,其值value是char[],而且是private final的,故不可修改
被transient修饰的变量不能被序列化
transient只作用于实现了Serializable接口的类
transient只能用来修饰普通成员变量字段
不管有无transient修饰,静态变量都不能被序列化
Class.forName除了将类的.class文件加载到JVM之外,还可以对类进行初始化
ClassLoader只会将.class文件加载到JVM中,不会进行初始化
可以重载,但是JVM始终调用原始的main方法,不会调用重载的main
不能重写。因为main方法是static的,在Java中不能被覆盖
throw是真实抛出异常
throws是声明可能抛出异常
Integer是int的包装类,int则是Java的基本数据类型
Integer必须实例化在能使用,int不需要
Integer是对象引用,new一个Integer时,实际上生成一个指针指向此对象,而int直接存储数据值
Integer默认值是null,int默认是0
case里必须跟break,否则会一个一个case执行下去,直到最后一个break的case或default出现
case条件里只能是常量或者字面常量
default可有可无,最多有一个
switch支持类型:
基本数据类型:byte short int char
包装类型:上面四个的
枚举类型: Enum
字符串类型 String
通过多个表达式完成一个字符串拼接时不行
一次性拼接一个字符串时就可以用➕
金额运算尽量使用BigDecimal(String val)进行计算
数据库存储金额,一般是整形和浮点型两种,如果有汇率转换,建议用decimal进行存储,可以灵活控制精度,decimal直接对应Java 类型BigDecimal。
所谓类型提升,就是在含有多种数据类型的表达式中,类型会自动向范围表示大的数据类型提升。比如:
long count=100000000;
int price=1999;
long totalPrice=price*count; //运算结果为long型,没有溢出
有,65534个字节,超过的话编译报错
也称糖衣语法,指在计算机语言中添加的某种语法,对语言本身功能没有影响,只是为了便于程序员开发,提高效率。就是对现有语法的封装。
Java语法糖主要有:
泛型与类型擦除
自动装箱与拆箱
变长参数
增强for循环
内部类
枚举类
可以通过实现Cloneable接口,然后重写其clone()方法
String、StringBuffer、StringBuilder最大的不同是String不可变,后者可变。StringBuffer是线程安全的,StringBuilder线程不安全速度较快。
String > byte[] 通过String类的getBytes方法;byte[] > String通过new String(byte[])构造器。