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 ...
随机推荐
- 集群环境下的Session管理
1. 集群环境下的管理HTTPSSession所遇到的问题 一台服务器对应这个一个session对象,无法在另外一个服务器互通 解决方法: 1. Session 的 Replication(复制)将当 ...
- django url配置-反向解析-视图函数-HttpRequest对象-HttpResponse对象-cookies-session-redis缓存session
""" --视图概述:-- 作用:视图接受WEB请求,并响应WEB请求 本质:视图就是一个python中的函数 响应: 1.网页: 一.重定向 二.错误视图 400,50 ...
- Loj#6247-九个太阳【单位根反演】
正题 题目链接:https://loj.ac/p/6247 题目大意 给出\(n,k\)求 \[\sum_{0\leq i\leq n,i|k}\binom{n}{i} \] 对\(998244353 ...
- 面试必问:Java 垃圾回收机制
摘要:垃圾回收机制是守护线程的最佳示例,因为它始终在后台运行. 本文分享自华为云社区<一文带你了解Java 中的垃圾回收机制>,作者:海拥. 介绍 在 C/C++ 中,程序员负责对象的创建 ...
- 架构师必备:MySQL主从同步原理和应用
日常工作中,MySQL数据库是必不可少的存储,其中读写分离基本是标配,而这背后需要MySQL开启主从同步,形成一主一从.或一主多从的架构,掌握主从同步的原理和知道如何实际应用,是一个架构师的必备技能. ...
- Spring Boot中使用PostgreSQL数据库
在如今的关系型数据库中,有两个开源产品是你必须知道的.其中一个是MySQL,相信关注我的小伙伴们一定都不陌生,因为之前的Spring Boot关于关系型数据库的所有例子都是对MySQL来介绍的.而今天 ...
- 移动端多个DIV简单拖拽功能
移动端多个DIV简单拖拽功能. 这个demo与之前写的一个例子差不了多少,只是这个多了一层遍历而已. <!DOCTYPE html> <html lang="en" ...
- Windows 11正式版来了,下载、安装教程、一起奉上!
Windows 11正式版已经发布了,今天给大家更新一波Win11系统的安装方法,其实和Win10基本一样,有多种方法. 安装Win11前请先查看电脑是否支持Win11系统,先用微软自家的PC H ...
- SQL实例_11Oracle基本操作
前言导读 本章介绍了在正常使用Oracle数据库之前进行的常规操作 本章语句的运行需要子啊PLSQL软件中运行 本章导入导出语句需要在虚拟环境中直接运行 1 Oracle创建表空间和用户 --1 创建 ...
- cmd下载慢
是网络的原因,加一个镜像服务器 pip install *** -i https://pypi.tuna.tsinghua.edu.cn/simple