jvm架构理解

jvm程序执行流程

编译器和解释器协调工作流程

在部分商用虚拟机中(如HotSpot),java程序最初是通过解释器进行解释执行的,当虚拟机发现某个方法或者某段代码执行的特别频繁后就会把这些代码作为【热点代码】,为了提高【热点代码】的执行效率,在运行时,虚拟机会把这些【热点代码】编译成为与本地平台相关的【机器码】,并进行各层次的优化,完成这个任务的编译器成为即时编译器(JTI)

JIT属于动态编译,是说在运行时进行编译,与之相对的是静态编译(事前编译),

热点代码

1.多次被调用的方法;2.被多次执行的循环体

这两种情况,编译器都是以整个方法作为编译对象。这种编译方法因发生在执行过程中,因此被称为【栈上替换】,即方法栈帧还在栈上,方法就被替换了。

热点代码的检测方式

1.基于采样的热点探测

  虚拟机会周期性的检测各个线程的栈顶,如果发现某个方法经常出现在栈顶,那么就会将这个方法视为【热点代码】。

2.基于计数器的热点探测。

  虚拟机回味每个方法建立计数器,统计方法的执行次数,如果计数器超过一定的【阀值】,就会认为这个方法为【热点代码】

为什么要使用解释器和编译器并存的架构

当程序需要快速启动和执行的时候,解释器首先起作用,省去了编译的时间。在程序运行一段时间后,随着时间的推移,编译器发挥作用,把越来越多的代码编译成本地代码,可以获得更高的执行效率。

JIT优化

1.公共子表达式消除

如果一个表达式E已经计算过了,兵器从先前的计算到现在E中的所有变量的值都没有发生变化,那么E的这次出现就会成为【公共子表达式】,对于这种表达式,没有必要花更多的时间对他进行计算,直接用前面的计算结果替代就可以了

int d = (c*b)*12+a+(a+b*c)  替换为int d = E*12+a+(a+E)   进一步代数化简为int d = E*13+a*2;

2.方法内联

将方法直接用方法体中的代码进行替换,这就是方法内联,减少了方法调用过程中的压栈和出栈开销。

3.逃逸分析

逃逸分析的基本行为就是分析对象的作用域,当一个对象在方法中被定义后,如果没有被该方法外引用,那么就可以将该对象在栈上分配空间,也可以还在堆上分配空间,这样就减少了垃圾回收。

4.标量替换

在JIT阶段,如果经过逃逸分析,发现一个对象不会被外界访问的话,那么经过JIT优化,就会把这个对 象拆解成若干个其中包含的若干个成员变量来代替。

5.同步锁消除

同样基于逃逸分析,当加锁的变量不会发生逃逸,是线程私有的完全没有必要加锁。 在JIT编译时期就 可以将同步锁去掉,以减少加锁与解锁造成的资源开销。

jvm优化理解的更多相关文章

  1. JVM深入理解

    JVM深入理解 一.JVM介绍 JVM应用百度百科的原话是: JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过 ...

  2. 系统优化怎么做-JVM优化之VisualVM

    大家好,这里是「聊聊系统优化 」,并在下列地址同步更新 博客园:http://www.cnblogs.com/changsong/ 知乎专栏:https://zhuanlan.zhihu.com/yo ...

  3. [转帖]JVM—深入理解内存模型与垃圾收集机制

    JVM—深入理解内存模型与垃圾收集机制 https://juejin.im/post/5d68dc9ee51d4561ad6548f7 前言 Java是一种跨平台的语言,当初其设计初衷也是为了解决各个 ...

  4. Java虚拟机内存基础、垃圾收集算法及JVM优化

    1 JVM 简单结构图   1.1 类加载子系统与方法区 类加载子系统负责从文件系统或者网络中加载 Class 信息,加载的类信息存放于一块称 为方法区的内存空间.除了类的信息外,方法区中可能还会存放 ...

  5. JVM如何理解Java泛型类(转)

    一个很典型的泛型(generic)代码.T是类型变量,可以是任何引用类型: public class Pair<T>{ private T first=null; private T se ...

  6. JVM优化

    1.堆大小设置 JVM 中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制:系统的可用虚拟内存限制:系统的可用物理内存限制.32位系统下,一般限制在1.5G~2G:64 ...

  7. JVM 优化问题

    jvm 优化问题 JVM堆内存分为2块:Permanent Space 和 Heap Space. Permanent 即 持久代(Permanent Generation),主要存放的是Java类定 ...

  8. JVM如何理解Java泛型类

    //泛型代码 public class Pair<T>{ private T first=null; private T second=null; public Pair(T fir,T  ...

  9. 给hive的metastore做JVM优化

    最近在测试环境下,hive的metastore不稳定,于是做一次JVM优化 在hive-env.sh中 export HADOOP_HOME=/opt/cdh/hadoop-2.6.0-cdh5.14 ...

随机推荐

  1. P4643-[国家集训队]阿狸和桃子的游戏【结论】

    正题 题目链接:https://www.luogu.com.cn/problem/P4643 题目大意 给出\(n\)个点\(m\)条边的无向图,两个人轮流选择一个未被选择的点加入点集. 然后每个人的 ...

  2. 四、mybatis动态sql

    # 前言前面mysql都是通过静态sql进行查询的,但是如果业务复杂的时候,我们会遇到引号问题,或者多一个空格,这就使得sql代码编写错误了,所以为了解决这个问题,我们有了动态sql. Mybatis ...

  3. 14-Java锁的概述

    14-锁的概述 乐观锁与悲观锁 ​ 乐观锁与悲观锁是数据库中引入的名词,但是在并发包里也引入了类似的思想,在这里我们还是有必要需要了解一下. ​ 悲观锁指数据被外界修改持保守态度,认为数据会很容易被其 ...

  4. TWAIN-v2.4-说明文档翻译(2)技术概览

    技术概览 Technical Overview TWAIN架构(TWAIN Architecture) 数据交互的实现在TWAIN中由三类软件元素共同工作完成:应用程序(the application ...

  5. centos8安装MySQL8——通过yum

    centos8上通过yum安装MySQL,过程简单,不易出错 1.检查系统是否已安装MySQL相关,如果有则全部清除干净 #列出MySQL相关的安装包 rpm -qa | grep mysql #依次 ...

  6. 创业公司用 Serverless,到底香不香?

    作者 | Mike Butusov 来源 | Serverless 公众号 在过去的 5 年里,使用云厂商处理应用后台的流行程度大幅飙升.其一,初创企业主采用 Serverless 方式,以节省基础设 ...

  7. 工作日常-SQL不能乱写

    前言:刚接手别人的项目没多久,在昨天的一次上线中无故躺坑,且该大兄弟已经离职,不得不帮他填坑,整完后,今天想搞一个总结,结论就是:SQL不能乱写. 搜索关键词:Cause: java.sql.SQLE ...

  8. 题解 CF914G Sum the Fibonacci

    题目传送门 题目大意 给出\(n,s_{1,2,...,n}\),定义一个五元组\((a,b,c,d,e)\)合法当且仅当: \[1\le a,b,c,d,e\le n \] \[(s_a\vee s ...

  9. Linux系统安装MySql5.7并通过sql脚本导入数据

    为了下载到的MySQL版本和目标系统相互兼容,在开启之前,最好了解目标系统的相关信息. 查询系统版本: cat /etc/issue 查看系统位数 getconf LONG_BIT 选择MySQL 根 ...

  10. 「软件测试实战教程系列(三)」弃繁就简,接口测试神器Postman|收藏版

    软件测试实战教程系列(三)弃繁就简,接口测试神器Postman|收藏版 Postman主要帮我们干了三件事: 1.把相关集合放到一个集合当中方便管理. 2.对指定接口发送请求. 3.断言 下面我们使用 ...