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. LR11自带网站

    LR自带的飞机订票系统 启动服务:安装路径\HP\LoadRunner\WebTours下的StartServer.bat 打开网页:地址  http://127.0.0.1:1080/WebTour ...

  2. 好久没发文了,一篇Vue3的Composition API使用奉上

    Composition API Composition API是Vue3中推荐的组件代码书写方式,相较于传统的Options API来说,它能让业务逻辑处理和后期代码维护变的更加简单. 首先我们来看O ...

  3. Cnblogs 主题2

    洪卫:https://www.cnblogs.com/shwee/p/9060226.html https://sunhwee.com 1 #header{display:none;} /* 将默认的 ...

  4. .NET跨平台实践:.NetCore、.Net5/6 Linux守护进程设计

    之前,我写过两篇关于用C#开发Linux守护进程的技术文章,分别是<.NET跨平台实践:用C#开发Linux守护进程>和<.NET跨平台实践:再谈用C#开发Linux守护进程 - 完 ...

  5. linux主机互信操作

    一.主机互信原理两个主机之间ssh登录需要提示输入对方的密码,当频繁需要登录操作时,可以通过linux公钥和秘钥,建立双机信任关系.把你源主机的公钥文件内容追加到目的主机对应用户下的authorize ...

  6. storm卡顿修改

    ​ 最近的webstorm越来越卡了,有时候甚至会弹出 Out of memory的窗口,提示要设置 xmx的值, 8G内存跑你这小软件还会不够用???要内存?给你,看你还会不会卡成翔! 于是果断给x ...

  7. MySQL中如何选择合适的备份策略和备份工具

    ​数据库备份的重要性毋庸置疑,可以说,它是数据安全的最后一道防线.鉴于此,对于备份,我们通常会做以下要求: 多地部署 对于核心数据库,我们通常有两地三中心的部署要求.对于备份来说,也是如此. 一个备份 ...

  8. 项目实战 Prometheus环境搭建

    项目摘要: 本文是搭建一套prometheus环境的教程. 前期准备:准备三台虚拟机,本文以centos7为例. 项目具体实施:分别进入每台虚拟机设置hostname:# hostnamectl se ...

  9. Golang通脉之基础入门

    为什么要学 Go 性能优越感:Go 极其地快,其性能与 Java 或 C++相似.在使用中,Go 一般比 Python 要快 30 倍: 序列化/去序列化.排序和聚合中表现优异: 开发者效率较高:多种 ...

  10. Java泛型背后是什么?

    文Java中泛型的应用,让大家更好地理解泛型,以及常说的泛型类型擦除是什么概念,举一个简单的例子,如下: 这里可以看出来在代码编写阶段就已经报错了,不能往string类型的集合中添加int类型的数据. ...