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. centos查找大文件

    首先到相当的目录下面,按下面方式查找 find . -type f -size +800M  -print0 | xargs -0 ls -lah或者从根目录(/)开始查找find / -type f ...

  2. 数据库管理软件navicate12的激活和安装

    前言   太多做测试或开发的小伙伴需要写sql语句,激活版navicat版本它来了 准备软件 navicat12安装包 navicat注册机 百度网盘下载链接(永久有效): 链接:https://pa ...

  3. Windows10 IIS Web服务器安装配置

    前言: 对于.NET开发者而已,IIS Web托管服务器应该是十分的熟悉的.对于刚安装Windows10的系统的用户而已Internet Information Services(IIS)功能是默认关 ...

  4. mysql从零开始之MySQL 创建数据库

    MySQL 创建数据库 我们可以在登陆 MySQL 服务后,使用 create 命令创建数据库,语法如下: CREATE DATABASE 数据库名; 以下命令简单的演示了创建数据库的过程,数据名为 ...

  5. 6岁!是时候重新认识下Serverless了

    一.背景 Serverless 概念从2012年开始提出,真正推出相关云产品是2014年AWS推出Lambda.如果我们将 Serverless 比作一个婴儿,那么它已经6岁了. 虽然业界对Serve ...

  6. bzoj3073Journeys(线段树优化最短路)

    这里还是一道涉及到区间连边的问题. 如果暴力去做,那么就会爆炸 那么这时候就需要线段树来优化了. 因为是双向边 所以需要两颗线段树来分别对应入边和出边 QwQ然后做就好了咯 不过需要注意的是,这个边数 ...

  7. ReentrantLock可重入锁、公平锁非公平锁区别与实现原理

    ReentrantLock是lock接口的一个实现类,里面实现了可重入锁和公平锁非公平锁 ReentrantLock公平锁和不公平锁实现原理 公平锁会获取锁时会判断阻塞队列里是否有线程再等待,若有获取 ...

  8. Python小工具:据说这是搜索文件最快的工具!没有之一!一起感受下......

    电脑自带的搜索文件功能相信大家都体验过,那是真的慢,等它找到文件,我都打完一把游戏了! 那必须不能忍,于是我自己做了一个文件搜索工具,犄角旮旯的文件都能一秒钟搜索出来的那种! 保证能把你们男(女)朋友 ...

  9. Django Model字段加密的优雅实现

    早前的一篇文章Django开发密码管理表实例有写我们写了个密码管理工具来实现对密码的管理,当时加密解密的功能在view层实现,一直运行稳定所以也没有过多关注实现是否优雅的问题.最近要多加几个密码表再次 ...

  10. Java:并发笔记-04

    Java:并发笔记-04 说明:这是看了 bilibili 上 黑马程序员 的课程 java并发编程 后做的笔记 本章内容-3 线程状态转换 活跃性 Lock 3.10 重新理解线程状态转换 假设有线 ...