jvm优化理解
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优化理解的更多相关文章
- JVM深入理解
JVM深入理解 一.JVM介绍 JVM应用百度百科的原话是: JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过 ...
- 系统优化怎么做-JVM优化之VisualVM
大家好,这里是「聊聊系统优化 」,并在下列地址同步更新 博客园:http://www.cnblogs.com/changsong/ 知乎专栏:https://zhuanlan.zhihu.com/yo ...
- [转帖]JVM—深入理解内存模型与垃圾收集机制
JVM—深入理解内存模型与垃圾收集机制 https://juejin.im/post/5d68dc9ee51d4561ad6548f7 前言 Java是一种跨平台的语言,当初其设计初衷也是为了解决各个 ...
- Java虚拟机内存基础、垃圾收集算法及JVM优化
1 JVM 简单结构图 1.1 类加载子系统与方法区 类加载子系统负责从文件系统或者网络中加载 Class 信息,加载的类信息存放于一块称 为方法区的内存空间.除了类的信息外,方法区中可能还会存放 ...
- JVM如何理解Java泛型类(转)
一个很典型的泛型(generic)代码.T是类型变量,可以是任何引用类型: public class Pair<T>{ private T first=null; private T se ...
- JVM优化
1.堆大小设置 JVM 中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制:系统的可用虚拟内存限制:系统的可用物理内存限制.32位系统下,一般限制在1.5G~2G:64 ...
- JVM 优化问题
jvm 优化问题 JVM堆内存分为2块:Permanent Space 和 Heap Space. Permanent 即 持久代(Permanent Generation),主要存放的是Java类定 ...
- JVM如何理解Java泛型类
//泛型代码 public class Pair<T>{ private T first=null; private T second=null; public Pair(T fir,T ...
- 给hive的metastore做JVM优化
最近在测试环境下,hive的metastore不稳定,于是做一次JVM优化 在hive-env.sh中 export HADOOP_HOME=/opt/cdh/hadoop-2.6.0-cdh5.14 ...
随机推荐
- 《exe应用程序UI自动化》
前言:有很多公司做一些客户端的应用,每次发版都要耗费人力去手动回归比较费时,那么我们就想着去怎么去驱动人为的操作变为机器的操作过程,当然想着进行UI自动 那么我们就要考虑怎么去实现exe应用程序的自动 ...
- 前端js单元测试 使用mocha、chai、sinon,karma
karma(因果报应) 提供在浏览器上测试 可以同时跑在多个浏览器下 mocha测试框架 其他测试框架还有Jasmine chai断言库 expect = chai.expect sinon ...
- 【译】.NET Core 3.0 发布小尺寸 self-contained 单体可执行程序
.NET Core 提供的发布应用程序选项 self-contained 是共享应用程序的好方法,因为应用程序的发布目录包含所有组件.运行时和框架.您只需要告诉使用者应用程序的入口 exe 文件,就可 ...
- AT5661-[AGC040C]Neither AB nor BA【模型转换】
正题 题目链接:https://www.luogu.com.cn/problem/AT5661 题目大意 一个包含\(A,B,C\)的序列,每次可以选择相邻的两个除了\(AB\)和\(BA\)的删去. ...
- P4770-[NOI2018]你的名字【SAM,线段树合并】
正题 题目链接:https://www.luogu.com.cn/problem/P4770 题目大意 给出一个长度为\(n\)的字符串\(S\).\(q\)次询问给出一个串\(T\)和一个区间\([ ...
- Java MD5和SHA256等常用加密算法
前言 我们在做java项目开发的时候,在前后端接口分离模式下,接口信息需要加密处理,做签名认证,还有在用户登录信息密码等也都需要数据加密.信息加密是现在几乎所有项目都需要用到的技术,身份认证.单点登陆 ...
- 通过Python收集MySQL MHA 部署及运行状态信息的功能实现
一. 背景介绍 当集团的MySQL数据库实例数达到2000+.MHA集群规模数百个时,对MHA的及时.高效管理是DBA必须面对的一个挑战.MHA 集群 节点信息 和 运行状态 是管理的基础.本篇幅主要 ...
- 飞猪基于 Serverless 的云+端实践与思考
作者 | 王恒飞(承荫) 本文整理自飞猪旅行前端技术专家--王恒飞(承荫)在[阿里云 Serverless Developer Meetup 上海站]上的分享.点击查看直播回放:https://dev ...
- Serverless 在 SaaS 领域的最佳实践
作者 | 计缘 来源 | Serverless 公众号 随着互联网人口红利逐渐减弱,基于流量的增长已经放缓,互联网行业迫切需要找到一片足以承载自身持续增长的新蓝海,产业互联网正是这一宏大背景下的新趋势 ...
- 阿里云研究员叔同:Serverless 正当时!
作者 | 叔同 导读:Serverless 将开发人员从繁重的手动资源管理和性能优化中解放出来,就像数十年前汇编语言演变到高级语言的过程一样,云计算生产力再一次发生变革.Serverless 的核心价 ...