jit用以把程序全部或部分翻译成本地机器码,当需要装载某个类【通常是创建第一个对象时】,编译器会先找到其.class文件,然后将该类的字节码装入内存。

hotspot采用惰性评估法:

如果一段代码频繁的调用方法,或是一个循环,也就是这段代码被多次执行,JIT编译器会参与其中

而如果一个方法从来不被执行,则不会经过JIT编译

寄存器和主存

其中一个最重要的优化策略是编译器可以决定何时从主存取值,何时向寄存器存值。考虑下面这段代码:

清单 1. 主存 or 寄存器测试代码
1
2
3
4
5
6
7
8
9
public class RegisterTest {
 private int sum;
 
 public void calculateSum(int n) {
 for (int i = 0; i < n; ++i) {
 sum += i;
 }
 }
}

在某些时刻,sum 变量居于主存之中,但是从主存中检索值是开销很大的操作,需要多次循环才可以完成操作。正如上面的例子,如果循环的每一次都是从主存取值,性能是非常低的。相反,编译器加载一个寄存器给 sum 并赋予其初始值,利用寄存器里的值来执行循环,并将最终的结果从寄存器返回给主存。这样的优化策略则是非常高效的。但是线程的同步对于这种操作来说是至关重要的,因为一个线程无法得知另一个线程所使用的寄存器里变量的值,线程同步可以很好的解决这一问题,有关于线程同步的知识,我们将在后续文章中进行讲解。

寄存器的使用是编译器的一个非常普遍的优化

最新文章

  1. Javascript学习之无缝滚动
  2. T4模版基础例子
  3. (三)play之yabe项目【数据模型】
  4. python编码:gbk编码与解码
  5. Flask框架获取用户IP地址的方法
  6. TFS服务器(微软源代码管理服务器)上彻底删除项目
  7. python爬虫之採集——360联想词W2版本号
  8. Delphi下实现全屏快速找图找色
  9. Unity 编辑器扩展自定义窗体
  10. 使用HttpGet请求json数据
  11. jquery 倒计时
  12. Jenkins的安装及使用(一)
  13. java基础----&gt;使用Itext生成数据库文档
  14. 访问php网站报500错误时显示错误显示
  15. LINUX 笔记5
  16. UNIX环境高级编程 第13章 守护进程
  17. 使用jquery触发a标签跳转
  18. 编写高质量代码改善C#程序的157个建议——建议152:最少,甚至是不要注释
  19. [转] linux nc命令
  20. centos7安装uwsgi报错

热门文章

  1. pthread 互斥量
  2. 树莓派搭建seafile服务器备忘
  3. PyQt(Python+Qt)学习随笔:Qt Designer中主窗口对象unifiedTitleAndToolBarOnMac属性
  4. CobaltStrike3.14&amp;3.8安装&amp;中文乱码解决
  5. bugkuctf 这 是 一 个 神 奇 的 登 录 界 面
  6. centos7 yum搭建lamp
  7. 部署基于.netcore5.0的ABP框架后台Api服务端,以及使用Nginx部署Vue+Element前端应用
  8. 深入理解Java虚拟机(三)——垃圾回收策略
  9. python命名切片
  10. Angular:惰性加载的模块