方法内联的条件
- 方法体足够小
- 热点方法:如果方法体小于325字节会尝试内联,可用-XX:FreqInlineSize修改大小
- 非热点方法:如果方法体小于35字节会尝试内联,可用-XX:MaxInlineSize修改大小
- 被调用方法运行的实现可以被唯一确定
- static,private,final,JIT可以确定具体实现的代码
- public的实例方法,指向的实现可能是自身,父类,子类的代码,当JIT可以确定具体实现的代码时才有可能实现内连
内连的问题:codeCache的溢出,导致jvm退化成解释执行
逃逸状态标记
全局级别逃逸:一个对象可能从方法或者当前线程中逃逸
- 对象被作为返回值
- 对象作为静态字段或者成员变量
- 如果重写了某个类的finalize方法,那么这个类的对象都会被标记为全局逃逸状态并且一定会放在堆内存中
- 参数级别逃逸:对象被作为参数传递给一个方法,但是在这个方法之外无法访问/对其它线程不可见
- 无逃逸:一个对象都不会逃逸
标量替换
通过逃逸分析确定该对象不会被外部访问,并且对象可以进一步分解时,jvm不会创建该对象,而是创建他的成员变量来代替
标量:不能被进一步分解的量
- 基础数据类型
- 对象引用
- 聚合量:可以进一步分解的量如String
栈上分配
通过逃逸分析,能欧确认对象不会被外部访问,就在栈山分配对象