JVM---对象的分配策略

对象的分配策略
栈上分配
没有逃逸
即方法中的对象没有发生逃逸。
逃逸分析的原理: 分析对象动态作用域, 当一个对象在方法中定义后, 它可能被外部方法所引用。
比如: 调用参数传递到其他方法中, 这种称之为方法逃逸。 甚至还有可能被外部线程访问到, 例如: 赋值给其他线程中访问的变量, 这个称之为线程逃逸。
从不逃逸到方法逃逸到线程逃逸, 称之为对象由低到高的不同逃逸程度。
如果确定一个对象不会逃逸出线程之外, 那么让对象在栈上分配内存可以提高 JVM 的效率。

逃逸分析代码   这段代码在调用的过程中 Myboject 这个对象属于不可逃逸, JVM 可以做栈上分配

然后通过开启和关闭 DoEscapeAnalysis 开关观察不同。
开启逃逸分析(JVM 默认开启)

查看执行速度

关闭逃逸分析

查看执行速度

测试结果可见, 开启逃逸分析对代码的执行性能有很大的影响! 那为什么有这个影响?
逃逸分析
如果是逃逸分析出来的对象可以在栈上分配的话, 那么该对象的生命周期就跟随线程了, 就不需要垃圾回收, 如果是频繁的调用此方法则可以得到很大的性能提高。
采用了逃逸分析后, 满足逃逸的对象在栈上分配

没有开启逃逸分析, 对象都在堆上分配, 会频繁触发垃圾回收(垃圾回收会影响系统性能) , 导致代码运行慢

代码验证
开启 GC 打印日志   -XX:+PrintGC
开启逃逸分析

可以看到没有 GC 日志
关闭逃逸分析

可以看到关闭了逃逸分析, JVM 在频繁的进行垃圾回收(GC) , 正是这一块的操作导致性能有较大的差别。
 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值