个人随笔
目录
JVM(七)、浅析对象逃逸分析
2021-02-28 17:41:38

Java在JVM执行过程中会进行两次编译,一次是java文件通过java编译器编译为class文件,一次是JVM把字节码编译为机器语言,毕竟机器最终能够执行的就只有机器语言,中间可能还有一次是先编译为汇编然后汇编再编译为机器语言0101这里不进行深究!然后Java的运行模式可以有如下三种:

1、解释模式(Interpreted Mode)

只使用解释器(-Xint 强制JVM使用解释模式),执行一行JVM字节码就编译为一行机器码

2、编译模式(Compiled Mode)

只使用编译器(-Xcomp JVM使用编译模式),先将所有JVM字节码一次编译为机器码,然后将所有机器码一次执行。

解释模式的执行速度比较慢,编译模式的执行速度比较快,但是机器码比字节码所占容量大很多差不多十倍以上,所以JVM一般采用混合模式来执行代码。

3、混合模式(Mixed Mode)

JVM再执行过程中,依然采用解释执行的模式来执行,但是对于一些“热点”代码采用编译模式来执行

4、三种执行模式的对比

  • 解释模式启动快,对于只需要执行部分代码,并且大多数代码只会执行一次的情况比较适合;
  • 编译模式启动慢,但是后期执行速度快,而且比较占用内存,因为机器码的数量至少是JVM字节码的十倍以上,这种模式适合代码可能会被反复执行的场景;
  • 混合模式是JVM默认采用的执行代码方式,一开始还是解释执行,但是对于少部分 “热点 ”代码会采用编译模式执行,这些热点代码对应的机器码会被缓存起来,下次再执行无需再编译,这就是我们常见的JIT( Just In Time Compiler )即时编译技术。在即时编译过程中JVM可能会对我们的代码最一些优化,比如对象逃逸分析等

5、对象的逃逸分析

就是分析对象的作用域,比如一个对象再方法中被定义了,但是作为参数返回出去了,那么该对象的作用域就不仅仅是该方法里面了。

  1. public User test1() {
  2. User user = new User();
  3. user.setId(1);
  4. user.setName("zhuge");
  5. //TODO 保存到数据库
  6. return user;
  7. }
  8. public void test2() {
  9. User user = new User();
  10. user.setId(1);
  11. user.setName("zhuge");
  12. //TODO 保存到数据库
  13. }

很显然test1方法中的user对象被返回了,这个对象的作用域范围不确定,test2方法中的user对象我们可以确定当方法结束这个对象就可以认为是无效对象了,对于这样的对象我们其实可以将其分配的栈内存里(test2方法的栈帧里),让其在方法结束时跟随栈内存一起被回收掉。JVM对于这种情况可以通过开启逃逸分析参数(-XX:+DoEscapeAnalysis)来优化对象内存分配位置,JDK7之后默认开启逃逸分析,如果要关闭使用参数(-XX:-DoEscapeAnalysis)

 432

啊!这个可能是世界上最丑的留言输入框功能~


当然,也是最丑的留言列表

有疑问发邮件到 : suibibk@qq.com 侵权立删
Copyright : 个人随笔   备案号 : 粤ICP备18099399号-2