对象的分配策略
栈上分配
没有逃逸
即方法中的对象没有发生逃逸。
逃逸分析的原理: 分析对象动态作用域, 当一个对象在方法中定义后, 它可能被外部方法所引用。
比如: 调用参数传递到其他方法中, 这种称之为方法逃逸。 甚至还有可能被外部线程访问到, 例如: 赋值给其他线程中访问的变量, 这个称之为线程逃逸。
从不逃逸到方法逃逸到线程逃逸, 称之为对象由低到高的不同逃逸程度。
如果确定一个对象不会逃逸出线程之外, 那么让对象在栈上分配内存可以提高 JVM 的效率。
逃逸分析代码 这段代码在调用的过程中 Myboject 这个对象属于不可逃逸, JVM 可以做栈上分配
然后通过开启和关闭 DoEscapeAnalysis 开关观察不同。
开启逃逸分析(JVM 默认开启)
查看执行速度
关闭逃逸分析
查看执行速度
测试结果可见, 开启逃逸分析对代码的执行性能有很大的影响! 那为什么有这个影响?
逃逸分析
如果是逃逸分析出来的对象可以在栈上分配的话, 那么该对象的生命周期就跟随线程了, 就不需要垃圾回收, 如果是频繁的调用此方法则可以得到很大的性能提高。
采用了逃逸分析后, 满足逃逸的对象在栈上分配
没有开启逃逸分析, 对象都在堆上分配, 会频繁触发垃圾回收(垃圾回收会影响系统性能) , 导致代码运行慢
代码验证
开启 GC 打印日志 -XX:+PrintGC
开启逃逸分析
可以看到没有 GC 日志
关闭逃逸分析
可以看到关闭了逃逸分析, JVM 在频繁的进行垃圾回收(GC) , 正是这一块的操作导致性能有较大的差别。